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