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