make/tests/scripts/targets/INTERMEDIATE
Paul Smith 6682fbc2cb Do not force targets to be SECONDARY
In SV 43677 we forced targets to be secondary if we found an
intermediate file that was listed as a prerequisite of another
target.  This overrides .INTERMEDIATE settings, so doesn't work.
Now that we have an is_explicit flag in targets, use that instead.

* src/implicit.c (pattern_search): Remove setting of secondary.
Preserve the value of the is_explicit flag when creating a new
file target, and consider it when setting the intermediate flag.
* tests/scripts/features/patternrules: Add a test w/out INTERMEDIATE
* tests/scripts/targets/INTERMEDIATE: Add a test with INTERMEDIATE
2021-12-29 15:26:56 -05:00

137 lines
3.4 KiB
Perl

# -*-perl-*-
$description = "Test the behaviour of the .INTERMEDIATE target.";
$details = "\
Test the behavior of the .INTERMEDIATE special target.
Create a makefile where a file would not normally be considered
intermediate, then specify it as .INTERMEDIATE. Build and ensure it's
deleted properly. Rebuild to ensure that it's not created if it doesn't
exist but doesn't need to be built. Change the original and ensure
that the intermediate file and the ultimate target are both rebuilt, and
that the intermediate file is again deleted.
Try this with implicit rules and explicit rules: both should work.\n";
open(MAKEFILE,"> $makefile");
print MAKEFILE <<'EOF';
.INTERMEDIATE: foo.e bar.e
# Implicit rule test
%.d : %.e ; cp $< $@
%.e : %.f ; cp $< $@
foo.d: foo.e
# Explicit rule test
foo.c: foo.e bar.e; cat $^ > $@
EOF
close(MAKEFILE);
# TEST #0
&utouch(-20, 'foo.f', 'bar.f');
&run_make_with_options($makefile,'foo.d',&get_logfile);
$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n";
&compare_output($answer, &get_logfile(1));
# TEST #1
&run_make_with_options($makefile,'foo.d',&get_logfile);
$answer = "$make_name: 'foo.d' is up to date.\n";
&compare_output($answer, &get_logfile(1));
# TEST #2
&utouch(-10, 'foo.d');
&touch('foo.f');
&run_make_with_options($makefile,'foo.d',&get_logfile);
$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n";
&compare_output($answer, &get_logfile(1));
# TEST #3
&run_make_with_options($makefile,'foo.c',&get_logfile);
$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm foo.e bar.e\n";
&compare_output($answer, &get_logfile(1));
# TEST #4
&run_make_with_options($makefile,'foo.c',&get_logfile);
$answer = "$make_name: 'foo.c' is up to date.\n";
&compare_output($answer, &get_logfile(1));
# TEST #5
&utouch(-10, 'foo.c');
&touch('foo.f');
&run_make_with_options($makefile,'foo.c',&get_logfile);
$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm foo.e bar.e\n";
&compare_output($answer, &get_logfile(1));
# TEST #6 -- added for PR/1669: don't remove files mentioned on the cmd line.
&run_make_with_options($makefile,'foo.e',&get_logfile);
$answer = "cp foo.f foo.e\n";
&compare_output($answer, &get_logfile(1));
unlink('foo.f', 'foo.e', 'foo.d', 'foo.c', 'bar.f', 'bar.e', 'bar.d', 'bar.c');
# TEST #7 -- added for PR/1423
$makefile2 = &get_tmpfile;
open(MAKEFILE, "> $makefile2");
print MAKEFILE <<'EOF';
all: foo
foo.a: ; touch $@
%: %.a ; touch $@
.INTERMEDIATE: foo.a
EOF
close(MAKEFILE);
&run_make_with_options($makefile2, '-R', &get_logfile);
$answer = "touch foo.a\ntouch foo\nrm foo.a\n";
&compare_output($answer, &get_logfile(1));
unlink('foo');
# sv 60188.
# A file made by an implicit rule, but explicitly mentioned by the user, is
# still considered intermediate if it's a prereq to .INTERMEDIATE.
touch('hello.z');
unlink('test.x');
run_make_test(q!
all: hello.z
%.z: test.x; touch $@
%.x: ;
.INTERMEDIATE: test.x
!, '', "#MAKE#: Nothing to be done for 'all'.\n");
unlink('hello.z');
# A target explicitly listed as a prerequisite of a pattern rule, is still
# considered mentioned and "ought to exist".
run_make_test(q!
1.all: 1.q ; touch $@
%.q: 1.r ; touch $@
%.r: ; touch $@
.INTERMEDIATE: 1.r
!,
'', "touch 1.r\ntouch 1.q\ntouch 1.all\nrm 1.r\n");
unlink('1.all', '1.q', '1.r');
# This tells the test driver that the perl test script executed properly.
1;