1 1.21 rillig # $NetBSD: cond-cmp-string.mk,v 1.21 2025/06/28 22:39:28 rillig Exp $ 2 1.1 rillig # 3 1.2 rillig # Tests for string comparisons in .if conditions. 4 1.1 rillig 5 1.3 rillig # This is a simple comparison of string literals. 6 1.3 rillig # Nothing surprising here. 7 1.3 rillig .if "str" != "str" 8 1.6 rillig . error 9 1.3 rillig .endif 10 1.1 rillig 11 1.3 rillig # The right-hand side of the comparison may be written without quotes. 12 1.3 rillig .if "str" != str 13 1.6 rillig . error 14 1.3 rillig .endif 15 1.3 rillig 16 1.3 rillig # The left-hand side of the comparison must be enclosed in quotes. 17 1.3 rillig # This one is not enclosed in quotes and thus generates an error message. 18 1.21 rillig # expect+1: Malformed conditional "str != str" 19 1.3 rillig .if str != str 20 1.6 rillig . error 21 1.3 rillig .endif 22 1.3 rillig 23 1.19 rillig # An expression that occurs on the left-hand side of the comparison must be 24 1.19 rillig # defined. 25 1.13 rillig # 26 1.13 rillig # The variable named "" is never defined, nevertheless it can be used as a 27 1.19 rillig # starting point for an expression. Applying the :U modifier to such an 28 1.19 rillig # undefined expression turns it into a defined expression. 29 1.13 rillig # 30 1.15 rillig # See ApplyModifier_Defined and DEF_DEFINED. 31 1.3 rillig .if ${:Ustr} != "str" 32 1.6 rillig . error 33 1.3 rillig .endif 34 1.3 rillig 35 1.3 rillig # Any character in a string literal may be escaped using a backslash. 36 1.3 rillig # This means that "\n" does not mean a newline but a simple "n". 37 1.3 rillig .if "string" != "\s\t\r\i\n\g" 38 1.6 rillig . error 39 1.3 rillig .endif 40 1.3 rillig 41 1.3 rillig # It is not possible to concatenate two string literals to form a single 42 1.13 rillig # string. In C, Python and the shell this is possible, but not in make. 43 1.21 rillig # expect+1: Malformed conditional ""string" != "str""ing"" 44 1.3 rillig .if "string" != "str""ing" 45 1.6 rillig . error 46 1.13 rillig .else 47 1.13 rillig . error 48 1.3 rillig .endif 49 1.4 rillig 50 1.5 rillig # There is no = operator for strings. 51 1.21 rillig # expect+1: Malformed conditional "!("value" = "value")" 52 1.4 rillig .if !("value" = "value") 53 1.4 rillig . error 54 1.4 rillig .else 55 1.4 rillig . error 56 1.4 rillig .endif 57 1.4 rillig 58 1.4 rillig # There is no === operator for strings either. 59 1.21 rillig # expect+1: Malformed conditional "!("value" === "value")" 60 1.4 rillig .if !("value" === "value") 61 1.4 rillig . error 62 1.4 rillig .else 63 1.4 rillig . error 64 1.4 rillig .endif 65 1.4 rillig 66 1.18 rillig # An expression can be enclosed in double quotes. 67 1.7 rillig .if ${:Uword} != "${:Uword}" 68 1.7 rillig . error 69 1.7 rillig .endif 70 1.7 rillig 71 1.10 rillig # Between 2003-01-01 (maybe even earlier) and 2020-10-30, adding one of the 72 1.19 rillig # characters " \t!=><" directly after an expression in a string literal 73 1.19 rillig # resulted in a "Malformed conditional", even though the string was 74 1.19 rillig # well-formed. 75 1.10 rillig .if ${:Uword } != "${:Uword} " 76 1.7 rillig . error 77 1.7 rillig .endif 78 1.11 rillig # Some other characters worked though, and some didn't. 79 1.11 rillig # Those that are mentioned in is_separator didn't work. 80 1.9 rillig .if ${:Uword0} != "${:Uword}0" 81 1.9 rillig . error 82 1.9 rillig .endif 83 1.9 rillig .if ${:Uword&} != "${:Uword}&" 84 1.9 rillig . error 85 1.9 rillig .endif 86 1.9 rillig .if ${:Uword!} != "${:Uword}!" 87 1.9 rillig . error 88 1.9 rillig .endif 89 1.9 rillig .if ${:Uword<} != "${:Uword}<" 90 1.9 rillig . error 91 1.9 rillig .endif 92 1.9 rillig 93 1.18 rillig # Adding another expression to the string literal works though. 94 1.8 rillig .if ${:Uword} != "${:Uwo}${:Urd}" 95 1.8 rillig . error 96 1.8 rillig .endif 97 1.8 rillig 98 1.19 rillig # Adding a space at the beginning of the quoted expression works though. 99 1.7 rillig .if ${:U word } != " ${:Uword} " 100 1.7 rillig . error 101 1.7 rillig .endif 102 1.12 rillig 103 1.12 rillig # If at least one side of the comparison is a string literal, the string 104 1.12 rillig # comparison is performed. 105 1.12 rillig .if 12345 != "12345" 106 1.12 rillig . error 107 1.12 rillig .endif 108 1.12 rillig 109 1.12 rillig # If at least one side of the comparison is a string literal, the string 110 1.12 rillig # comparison is performed. The ".0" in the left-hand side makes the two 111 1.12 rillig # sides of the equation unequal. 112 1.12 rillig .if 12345.0 == "12345" 113 1.12 rillig . error 114 1.12 rillig .endif 115 1.14 rillig 116 1.14 rillig # Strings cannot be compared relationally, only for equality. 117 1.21 rillig # expect+1: Comparison with "<" requires both operands "string" and "string" to be numeric 118 1.14 rillig .if "string" < "string" 119 1.14 rillig . error 120 1.14 rillig .else 121 1.14 rillig . error 122 1.14 rillig .endif 123 1.14 rillig 124 1.14 rillig # Strings cannot be compared relationally, only for equality. 125 1.21 rillig # expect+1: Comparison with "<=" requires both operands "string" and "string" to be numeric 126 1.14 rillig .if "string" <= "string" 127 1.14 rillig . error 128 1.14 rillig .else 129 1.14 rillig . error 130 1.14 rillig .endif 131 1.14 rillig 132 1.14 rillig # Strings cannot be compared relationally, only for equality. 133 1.21 rillig # expect+1: Comparison with ">" requires both operands "string" and "string" to be numeric 134 1.14 rillig .if "string" > "string" 135 1.14 rillig . error 136 1.14 rillig .else 137 1.14 rillig . error 138 1.14 rillig .endif 139 1.14 rillig 140 1.14 rillig # Strings cannot be compared relationally, only for equality. 141 1.21 rillig # expect+1: Comparison with ">=" requires both operands "string" and "string" to be numeric 142 1.14 rillig .if "string" >= "string" 143 1.14 rillig . error 144 1.14 rillig .else 145 1.14 rillig . error 146 1.14 rillig .endif 147 1.16 rillig 148 1.19 rillig # Two expressions with different values compare unequal. 149 1.16 rillig VAR1= value1 150 1.16 rillig VAR2= value2 151 1.16 rillig .if ${VAR1} != ${VAR2} 152 1.16 rillig .else 153 1.16 rillig . error 154 1.16 rillig .endif 155