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