| # -*-perl-*- | |
| $description = "\ | |
| This tests random features of the parser that need to be supported, and | |
| which have either broken at some point in the past or seem likely to | |
| break."; | |
| run_make_test(q! | |
| # We want to allow both empty commands _and_ commands that resolve to empty. | |
| EMPTY = | |
| .PHONY: all a1 a2 a3 a4 | |
| all: a1 a2 a3 a4 | |
| a1:; | |
| a2: | |
| #TAB# | |
| a3:;$(EMPTY) | |
| a4: | |
| #TAB#$(EMPTY) | |
| # Non-empty lines that expand to nothing should also be ignored. | |
| STR = # Some spaces | |
| TAB = #TAB# # A TAB and some spaces | |
| $(STR) | |
| $(STR) $(TAB)!, | |
| '', "#MAKE#: Nothing to be done for 'all'."); | |
| # TEST 2 | |
| # Make sure files without trailing newlines are handled properly. | |
| # Have to use the old style invocation to test this. | |
| $makefile2 = &get_tmpfile; | |
| open(MAKEFILE, "> $makefile2"); | |
| print MAKEFILE "all:;\@echo FOO = \$(FOO)\nFOO = foo"; | |
| close(MAKEFILE); | |
| &run_make_with_options($makefile2,"",&get_logfile); | |
| $answer = "FOO = foo\n"; | |
| &compare_output($answer,&get_logfile(1)); | |
| # TEST 3 | |
| # Check semicolons in variable references | |
| run_make_test(q! | |
| $(if true,$(info true; true)) | |
| all: ; @: | |
| !, | |
| '', 'true; true'); | |
| # TEST 4 | |
| # Check that backslashes in command scripts are handled according to POSIX. | |
| # Checks Savannah bug # 1332. | |
| # Test the fastpath / no quotes | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo foo\ | |
| bar | |
| #TAB#@echo foo\ | |
| #TAB#bar | |
| #TAB#@echo foo\ | |
| bar | |
| #TAB#@echo foo\ | |
| #TAB# bar | |
| #TAB#@echo foo \ | |
| bar | |
| #TAB#@echo foo \ | |
| #TAB#bar | |
| #TAB#@echo foo \ | |
| bar | |
| #TAB#@echo foo \ | |
| #TAB# bar | |
| !, | |
| '', 'foobar | |
| foobar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar'); | |
| # Test the fastpath / single quotes | |
| # Single quotes don't behave the same in Windows | |
| if ($port_type ne 'W32') { | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo 'foo\ | |
| bar' | |
| #TAB#@echo 'foo\ | |
| #TAB#bar' | |
| #TAB#@echo 'foo\ | |
| bar' | |
| #TAB#@echo 'foo\ | |
| #TAB# bar' | |
| #TAB#@echo 'foo \ | |
| bar' | |
| #TAB#@echo 'foo \ | |
| #TAB#bar' | |
| #TAB#@echo 'foo \ | |
| bar' | |
| #TAB#@echo 'foo \ | |
| #TAB# bar' | |
| !, | |
| '', 'foo\ | |
| bar | |
| foo\ | |
| bar | |
| foo\ | |
| bar | |
| foo\ | |
| bar | |
| foo \ | |
| bar | |
| foo \ | |
| bar | |
| foo \ | |
| bar | |
| foo \ | |
| bar'); | |
| } | |
| # Test the fastpath / double quotes | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo "foo\ | |
| bar" | |
| #TAB#@echo "foo\ | |
| #TAB#bar" | |
| #TAB#@echo "foo\ | |
| bar" | |
| #TAB#@echo "foo\ | |
| #TAB# bar" | |
| #TAB#@echo "foo \ | |
| bar" | |
| #TAB#@echo "foo \ | |
| #TAB#bar" | |
| #TAB#@echo "foo \ | |
| bar" | |
| #TAB#@echo "foo \ | |
| #TAB# bar" | |
| !, | |
| '', 'foobar | |
| foobar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar | |
| foo bar'); | |
| # Test the slow path / no quotes | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo hi; echo foo\ | |
| bar | |
| #TAB#@echo hi; echo foo\ | |
| #TAB#bar | |
| #TAB#@echo hi; echo foo\ | |
| bar | |
| #TAB#@echo hi; echo foo\ | |
| #TAB# bar | |
| #TAB#@echo hi; echo foo \ | |
| bar | |
| #TAB#@echo hi; echo foo \ | |
| #TAB#bar | |
| #TAB#@echo hi; echo foo \ | |
| bar | |
| #TAB#@echo hi; echo foo \ | |
| #TAB# bar | |
| !, | |
| '', 'hi | |
| foobar | |
| hi | |
| foobar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar'); | |
| # Test the slow path / no quotes. This time we put the slow path | |
| # determination _after_ the backslash-newline handling. | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo foo\ | |
| bar; echo hi | |
| #TAB#@echo foo\ | |
| #TAB#bar; echo hi | |
| #TAB#@echo foo\ | |
| bar; echo hi | |
| #TAB#@echo foo\ | |
| #TAB# bar; echo hi | |
| #TAB#@echo foo \ | |
| bar; echo hi | |
| #TAB#@echo foo \ | |
| #TAB#bar; echo hi | |
| #TAB#@echo foo \ | |
| bar; echo hi | |
| #TAB#@echo foo \ | |
| #TAB# bar; echo hi | |
| !, | |
| '', 'foobar | |
| hi | |
| foobar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi'); | |
| # Test the slow path / single quotes | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo hi; echo 'foo\ | |
| bar' | |
| #TAB#@echo hi; echo 'foo\ | |
| #TAB#bar' | |
| #TAB#@echo hi; echo 'foo\ | |
| bar' | |
| #TAB#@echo hi; echo 'foo\ | |
| #TAB# bar' | |
| #TAB#@echo hi; echo 'foo \ | |
| bar' | |
| #TAB#@echo hi; echo 'foo \ | |
| #TAB#bar' | |
| #TAB#@echo hi; echo 'foo \ | |
| bar' | |
| #TAB#@echo hi; echo 'foo \ | |
| #TAB# bar' | |
| !, | |
| '', 'hi | |
| foo\ | |
| bar | |
| hi | |
| foo\ | |
| bar | |
| hi | |
| foo\ | |
| bar | |
| hi | |
| foo\ | |
| bar | |
| hi | |
| foo \ | |
| bar | |
| hi | |
| foo \ | |
| bar | |
| hi | |
| foo \ | |
| bar | |
| hi | |
| foo \ | |
| bar'); | |
| # Test the slow path / double quotes | |
| run_make_test(q! | |
| all: | |
| #TAB#@echo hi; echo "foo\ | |
| bar" | |
| #TAB#@echo hi; echo "foo\ | |
| #TAB#bar" | |
| #TAB#@echo hi; echo "foo\ | |
| bar" | |
| #TAB#@echo hi; echo "foo\ | |
| #TAB# bar" | |
| #TAB#@echo hi; echo "foo \ | |
| bar" | |
| #TAB#@echo hi; echo "foo \ | |
| #TAB#bar" | |
| #TAB#@echo hi; echo "foo \ | |
| bar" | |
| #TAB#@echo hi; echo "foo \ | |
| #TAB# bar" | |
| !, | |
| '', 'hi | |
| foobar | |
| hi | |
| foobar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar | |
| hi | |
| foo bar'); | |
| run_make_test('x:;@-exit 1', '', "#MAKE#: [#MAKEFILE#:1: x] Error 1 (ignored)\n"); | |
| # Slow path with odd setups | |
| if ($port_type ne 'W32') { | |
| run_make_test(q! | |
| slow: SHELL := echo | |
| slow: .SHELLFLAGS := hoho | |
| slow:; @foo bar | |
| !, | |
| '', "hoho foo bar\n"); | |
| run_make_test(q! | |
| slow: SHELL := echo hi | |
| slow: .SHELLFLAGS := ho ho | |
| slow:; @foo bar | |
| !, | |
| '', "hi ho ho foo bar\n"); | |
| run_make_test(q! | |
| slow: SHELL := echo hi | |
| slow: .SHELLFLAGS := 'ho;ho' | |
| slow:; @foo bar | |
| !, | |
| '', "hi ho;ho foo bar\n"); | |
| } | |
| 1; |