| # -*-perl-*- |
| |
| $description = 'Test the $(file ...) function.'; |
| |
| # Test > and >> |
| run_make_test(q! |
| define A |
| a |
| b |
| endef |
| B = c d |
| $(file >file.out,$(A)) |
| $(foreach L,$(B),$(file >> file.out,$L)) |
| x:;@echo hi; cat file.out |
| !, |
| '', "hi\na\nb\nc\nd"); |
| |
| unlink('file.out'); |
| |
| # Test >> to a non-existent file |
| run_make_test(q! |
| define A |
| a |
| b |
| endef |
| $(file >> file.out,$(A)) |
| x:;@cat file.out |
| !, |
| '', "a\nb"); |
| |
| unlink('file.out'); |
| |
| # Test > with no content |
| run_make_test(q! |
| $(file >4touch) |
| .PHONY:x |
| x:;@cat 4touch |
| !, |
| '', ''); |
| |
| # Test >> with no content |
| run_make_test(q! |
| $(file >>4touch) |
| .PHONY:x |
| x:;@cat 4touch |
| !, |
| '', ''); |
| unlink('4touch'); |
| |
| # Test > to a read-only file |
| touch('file.out'); |
| chmod(0444, 'file.out'); |
| |
| # Find the error that will be printed |
| # This seems complicated, but we need the message from the C locale |
| my $loc = undef; |
| if ($has_POSIX) { |
| $loc = POSIX::setlocale(POSIX::LC_MESSAGES); |
| POSIX::setlocale(POSIX::LC_MESSAGES, 'C'); |
| } |
| my $e; |
| open(my $F, '>', 'file.out') and die "Opened read-only file!\n"; |
| $e = "$!"; |
| $loc and POSIX::setlocale(POSIX::LC_MESSAGES, $loc); |
| |
| run_make_test(q! |
| define A |
| a |
| b |
| endef |
| $(file > file.out,$(A)) |
| x:;@cat file.out |
| !, |
| '', "#MAKEFILE#:6: *** open: file.out: $e. Stop.", |
| 512); |
| |
| unlink('file.out'); |
| |
| # Use variables for operator and filename |
| run_make_test(q! |
| define A |
| a |
| b |
| endef |
| OP = > |
| FN = file.out |
| $(file $(OP) $(FN),$(A)) |
| x:;@cat file.out |
| !, |
| '', "a\nb"); |
| |
| unlink('file.out'); |
| |
| # Don't add newlines if one already exists |
| run_make_test(q! |
| define A |
| a |
| b |
| |
| endef |
| $(file >file.out,$(A)) |
| x:;@cat file.out |
| !, |
| '', "a\nb"); |
| |
| unlink('file.out'); |
| |
| # Empty text |
| run_make_test(q! |
| $(file >file.out,) |
| $(file >>file.out,) |
| x:;@cat file.out |
| !, |
| '', "\n\n"); |
| |
| unlink('file.out'); |
| |
| # Reading files |
| run_make_test(q! |
| $(file >file.out,A = foo) |
| X1 := $(file <file.out) |
| $(file >>file.out,B = bar) |
| $(eval $(file <file.out)) |
| |
| x:;@echo '$(X1)'; echo '$(A)'; echo '$(B)' |
| !, |
| '', "A = foo\nfoo\nbar\n"); |
| |
| unlink('file.out'); |
| |
| # Reading from non-existent file |
| run_make_test(q! |
| X1 := $(file <file.out) |
| x:;@echo '$(X1)'; |
| !, |
| '', "\n"); |
| |
| # Extra arguments in read mode |
| run_make_test(q! |
| X1 := $(file <file.out,foo) |
| x:;@echo '$(X1)'; |
| !, |
| '', "#MAKEFILE#:2: *** file: too many arguments. Stop.\n", 512); |
| |
| |
| # Missing filename |
| run_make_test('$(file >)', '', |
| "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); |
| |
| run_make_test('$(file >>)', '', |
| "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); |
| |
| run_make_test('$(file <)', '', |
| "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); |
| |
| # Bad call |
| |
| run_make_test('$(file foo)', '', |
| "#MAKEFILE#:1: *** file: invalid file operation: foo. Stop.\n", 512); |
| |
| 1; |