| # -*-perl-*- |
| $description = "Test backslash-newline handling."; |
| |
| $details = ""; |
| |
| # TEST #1 |
| # ------- |
| |
| # Backslash-newlines in recipes |
| |
| # These are basic backslash-newlines with no tricks |
| run_make_test("fast:;\@echo fa\\\nst\n", |
| '', 'fast'); |
| |
| run_make_test("slow:;\@: no-op; echo sl\\\now\n", |
| '', 'slow'); |
| |
| run_make_test("dquote:;\@echo \"dqu\\\note\"\n", |
| '', 'dquote'); |
| |
| run_make_test("squote:;\@echo 'squ\\\note'\n", |
| '', "squ\\\note"); |
| |
| # Ensure that a leading prefix character is omitted |
| run_make_test("fast:;\@echo fa\\\n\tst\n", |
| '', 'fast'); |
| |
| run_make_test("slow:;\@: no-op; echo sl\\\n\tow\n", |
| '', 'slow'); |
| |
| run_make_test("dquote:;\@echo \"dqu\\\n\tote\"\n", |
| '', 'dquote'); |
| |
| run_make_test("squote:;\@echo 'squ\\\n\tote'\n", |
| '', "squ\\\note"); |
| |
| # Ensure that ONLY the leading prefix character is omitted |
| run_make_test("fast:;\@echo fa\\\n\t st\n", |
| '', 'fa st'); |
| |
| run_make_test("slow:;\@: no-op; echo sl\\\n\t\tow\n", |
| '', "sl ow"); |
| |
| run_make_test("dquote:;\@echo \"dqu\\\n\t ote\"\n", |
| '', 'dqu ote'); |
| |
| run_make_test("squote:;\@echo 'squ\\\n\t\t ote'\n", |
| '', "squ\\\n\t ote"); |
| |
| # Backslash-newlines in variable values |
| |
| # Simple |
| run_make_test(q! |
| var = he\ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # Condense trailing space |
| run_make_test(q! |
| var = he \ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # Remove leading space |
| run_make_test(q! |
| var = he\ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # Multiple bs/nl condensed |
| run_make_test(q! |
| var = he\ |
| \ |
| \ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # POSIX: Preserve trailing space |
| run_make_test(q! |
| .POSIX: |
| x = y |
| var = he \ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # POSIX: One space per bs-nl |
| run_make_test(q! |
| .POSIX: |
| x = y |
| var = he\ |
| \ |
| \ |
| llo |
| var:;@echo '|$(var)|'!, |
| '', "|he llo|"); |
| |
| # Savannah #39035: handle whitespace in call |
| run_make_test(q! |
| f = echo $(1) |
| t:; @$(call f,"a \ |
| b"); \ |
| $(call f,"a \ |
| b") |
| !, |
| '', "a b\na b\n"); |
| |
| # Savannah #38945: handle backslash CRLF |
| # We need our own makefile so we can set binmode |
| my $m1 = get_tmpfile(); |
| open(MAKEFILE, "> $m1"); |
| binmode(MAKEFILE); |
| print MAKEFILE "FOO = foo \\\r\n"; |
| close(MAKEFILE); |
| |
| my $m2 = get_tmpfile(); |
| open(MAKEFILE, "> $m2"); |
| print MAKEFILE "include $m1\ndefine BAR\nall: ; \@echo \$(FOO) bar\nendef\n\$(eval \$(BAR))\n"; |
| close(MAKEFILE); |
| |
| run_make_with_options($m2, '', get_logfile()); |
| compare_output("foo bar\n", get_logfile(1)); |
| |
| # Test different types of whitespace, and bsnl inside functions |
| |
| sub xlate |
| { |
| $_ = $_[0]; |
| s/\\r/\r/g; |
| s/\\t/\t/g; |
| s/\\f/\f/g; |
| s/\\v/\v/g; |
| s/\\n/\n/g; |
| return $_; |
| } |
| |
| run_make_test(xlate(q! |
| $(foreach\r a \t , b\t c \r ,$(info $a \r ) ) |
| all:;@: |
| !), |
| '', "b \r \nc \r \n"); |
| |
| run_make_test(xlate(q! |
| all:;@:$(foreach\r a \t , b\t c \r ,$(info $a \r ) ) |
| !), |
| '', "b \r \nc \r \n"); |
| |
| run_make_test(xlate(q! |
| $(foreach \ |
| \r a \t\ |
| , b\t \ |
| c \r ,$(info \ |
| $a \r ) \ |
| ) |
| all:;@: |
| !), |
| '', "b \r \nc \r \n"); |
| |
| run_make_test(xlate(q! |
| all:;@:$(foreach \ |
| \r a \t\ |
| , b\t \ |
| c \r ,$(info \ |
| $a \r ) \ |
| ) |
| !), |
| '', "b \r \nc \r \n"); |
| |
| run_make_test(xlate(q! |
| define FOO |
| $(foreach |
| \r a \t |
| , b\t |
| c \r ,$(info |
| $a \r ) |
| ) |
| endef |
| $(FOO) |
| all:;@: |
| !), |
| '', "b \r \nc \r \n"); |
| |
| run_make_test(xlate(q! |
| define FOO |
| $(foreach |
| \r a \t |
| , b\t |
| c \r ,$(info |
| $a \r ) |
| ) |
| endef |
| all:;@:$(FOO) |
| !), |
| '', "b \r \nc \r \n"); |
| |
| # Test variables in recipes that expand to multiple lines |
| |
| run_make_test(q! |
| define var |
| |
| echo foo |
| |
| |
| echo bar |
| endef |
| all:;$(var) |
| !, |
| '', "echo foo\nfoo\necho bar\nbar\n"); |
| |
| run_make_test(q! |
| define var |
| |
| echo foo |
| |
| @ |
| |
| echo bar |
| endef |
| all:;$(var) |
| !, |
| '', "echo foo\nfoo\necho bar\nbar\n"); |
| |
| 1; |