summaryrefslogtreecommitdiffstats
path: root/usr.bin/make
diff options
context:
space:
mode:
authorfjoe <fjoe@FreeBSD.org>2007-04-20 06:25:45 +0000
committerfjoe <fjoe@FreeBSD.org>2007-04-20 06:25:45 +0000
commit5abc85136d3414fb5078dd4b13d33911966818f4 (patch)
tree2488644fcf3899c882fa294fe7562b43dedfa30c /usr.bin/make
parentd7e93cb21b8bf82161a075a608fb7bac5b15db25 (diff)
downloadFreeBSD-src-5abc85136d3414fb5078dd4b13d33911966818f4.zip
FreeBSD-src-5abc85136d3414fb5078dd4b13d33911966818f4.tar.gz
When remaking makefiles check that mtime has actually changed.
This fixes infinite restart in the following case: Makefile: foo foo: bar do-something Unlike GNU make, BSD make considers "Makefile" node as remade even if "foo" is up-to-date and was not actually rebuilt. GNU make does not consider nodes without commands as remade if child nodes were not actually rebuilt. Most probably, more proper fix would be to bring BSD make behaviour in-line with GNU make but this would be more intrusive change.
Diffstat (limited to 'usr.bin/make')
-rw-r--r--usr.bin/make/main.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c
index 8eceedf..e575ff2 100644
--- a/usr.bin/make/main.c
+++ b/usr.bin/make/main.c
@@ -704,6 +704,7 @@ Remake_Makefiles(void)
Boolean saveTouchFlag = touchFlag;
Boolean saveQueryFlag = queryFlag;
Boolean saveNoExecute = noExecute;
+ int mtime;
/*
* Create node
@@ -767,6 +768,7 @@ Remake_Makefiles(void)
/*
* Check and remake the makefile
*/
+ mtime = Dir_MTime(gn);
Compat_Make(gn, gn);
/*
@@ -785,9 +787,18 @@ Remake_Makefiles(void)
* ABORTED gn was not remade because one of its inferiors
* could not be made due to errors.
*/
- if (gn->made == MADE)
- remade_cnt++;
- else if (gn->made == ERROR)
+ if (gn->made == MADE) {
+ if (mtime != Dir_MTime(gn)) {
+ DEBUGF(MAKE,
+ ("%s updated (%d -> %d).\n",
+ gn->name, mtime, gn->mtime));
+ remade_cnt++;
+ } else {
+ DEBUGF(MAKE,
+ ("%s not updated: skipping restart.\n",
+ gn->name));
+ }
+ } else if (gn->made == ERROR)
error_cnt++;
else if (gn->made == ABORTED) {
printf("`%s' not remade because of errors.\n",
OpenPOWER on IntegriCloud