| # -*-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 > 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'); | |
| 1; |