From 42745a900f191f67637c5c819a0672dd30b45b50 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 13 Jul 2015 00:51:35 -0400 Subject: [PATCH] * implicit.c (pattern_search): [SV 43677] Mark files secondary. In order to fix SV 12267 we were marking the prerequisites of implicit (pattern) targets that existed elsewhere in the makefile as precious to keep them from being deleted as intermediate files. However this also keeps them from being deleted on error. Instead mark them as secondary. * tests/scripts/targets/DELETE_ON_ERROR: Test DELETE_ON_ERROR. --- implicit.c | 5 +++-- tests/scripts/targets/DELETE_ON_ERROR | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 tests/scripts/targets/DELETE_ON_ERROR diff --git a/implicit.c b/implicit.c index 8e17ff21..d7d391ca 100644 --- a/implicit.c +++ b/implicit.c @@ -864,9 +864,10 @@ pattern_search (struct file *file, int archive, /* We don't want to delete an intermediate file that happened to be a prerequisite of some (other) target. Mark it as - precious. */ + secondary. We don't want it to be precious as that disables + DELETE_ON_ERROR etc. */ if (f != 0) - f->precious = 1; + f->secondary = 1; else f = enter_file (imf->name); diff --git a/tests/scripts/targets/DELETE_ON_ERROR b/tests/scripts/targets/DELETE_ON_ERROR new file mode 100644 index 00000000..08f009fa --- /dev/null +++ b/tests/scripts/targets/DELETE_ON_ERROR @@ -0,0 +1,22 @@ +#! -*-perl-*- + +$description = "Test the behaviour of the .DELETE_ON_ERROR target."; + +$details = ""; + +run_make_test(' +.DELETE_ON_ERROR: +all: ; false > $@ +', + '', "false > all\n#MAKEFILE#:3: recipe for target 'all' failed\n#MAKE#: *** [all] Error 1\n#MAKE#: *** Deleting file 'all'", 512); + +run_make_test(' +.DELETE_ON_ERROR: +all: foo.x ; +%.x : %.q ; echo > $@ +%.q : ; false > $@ +', + '', "false > foo.q\n#MAKEFILE#:5: recipe for target 'foo.q' failed\n#MAKE#: *** [foo.q] Error 1\n#MAKE#: *** Deleting file 'foo.q'", 512); + +# This tells the test driver that the perl test script executed properly. +1;