# -*-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;