| # -*-perl-*- | |
| $description = "Test BSD-style shell assignments (VAR != VAL) for variables."; | |
| $details = ""; | |
| # TEST 0: Basic shell assignment (!=). | |
| run_make_test(' | |
| .POSIX: | |
| demo1!=printf \' 1 2 3\n4\n\n5 \n \n 6\n\n\n\n\' | |
| demo2 != printf \'7 8\n \' | |
| demo3 != printf \'$$(demo2)\' | |
| demo4 != printf \' 2 3 \n\' | |
| demo5 != printf \' 2 3 \n\n\' | |
| all: ; @echo "<$(demo1)> <$(demo2)> <$(demo3)> <$(demo4)> <${demo5}>" | |
| ', | |
| '', "< 1 2 3 4 5 6 > <7 8 > <7 8 > < 2 3 > < 2 3 >\n"); | |
| # TEST 1: Handle '#' the same way as BSD make | |
| run_make_test(' | |
| foo1!=echo bar#baz | |
| hash != printf \'\043\' | |
| foo2!= echo "bar$(hash)baz" | |
| all: ; @echo "<$(foo1)> <$(hash)> <$(foo2)>" | |
| ', | |
| '', "<bar> <#> <bar#baz>\n"); | |
| # TEST 2: shell assignment variables (from !=) should be recursive. | |
| # Note that variables are re-evaluated later, so the shell can output | |
| # a value like $(XYZZY) as part of !=. The $(XYZZY) will be EVALUATED | |
| # when the value containing it is evaluated. On the negative side, this | |
| # means if you don't want this, you need to escape dollar signs as $$. | |
| # On the positive side, it means that shell programs can output macros | |
| # that are then evaluated as they are traditionally evaluated.. and that | |
| # you can use traditional macro evaluation semantics to implement !=. | |
| run_make_test(' | |
| XYZZY = fiddle-dee-dee | |
| dollar = $$ | |
| VAR3 != printf \'%s\' \'$(dollar)(XYZZY)\' | |
| all: ; @echo "<$(VAR3)>" | |
| ', | |
| '', "<fiddle-dee-dee>\n"); | |
| # TEST 3: Overrides invoke shell anyway; they just don't store the result | |
| # in a way that is visible. | |
| run_make_test(' | |
| override != echo abc > ,abc ; cat ,abc | |
| all: ; @echo "<$(override)>" ; cat ,abc | |
| ', | |
| 'override=xyz', "<xyz>\nabc\n"); | |
| unlink(',abc'); | |
| 1; |