diff options
author | Ron Yorston <rmy@pobox.com> | 2023-08-25 14:16:51 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2023-08-25 14:16:51 +0100 |
commit | fb4be267c5878a0128775ba2a436c3e80519e2b6 (patch) | |
tree | e171b71251b22da8a2792edfdcf47bb3df4a5a44 | |
parent | ac9ff15e24b4eb2413fc3c4c7b6f3bfc1166516c (diff) | |
download | busybox-w32-fb4be267c5878a0128775ba2a436c3e80519e2b6.tar.gz busybox-w32-fb4be267c5878a0128775ba2a436c3e80519e2b6.tar.bz2 busybox-w32-fb4be267c5878a0128775ba2a436c3e80519e2b6.zip |
make: fixes to warning messages
According to POSIX only fatal diagnostic messages should be written
to stderr. Arrange for warning() to write to stdout.
pdpmake was rather too prolific in generating 'nothing to be done
for XXX' messages. GNU make only issues the equivalent message
for top-level targets and only if nothing at all was (or would have
been) done. bmake doesn't seem to have such a message.
Follow the practice of GNU make. This requires more intensive
tracking of the actions taken while the make is in progress.
Costs 16 bytes.
(GitHub issue #354)
-rw-r--r-- | miscutils/make.c | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/miscutils/make.c b/miscutils/make.c index 25e3cc15a..08b9d806e 100644 --- a/miscutils/make.c +++ b/miscutils/make.c | |||
@@ -207,6 +207,10 @@ struct macro { | |||
207 | # define P_WINDOWS 0x20 | 207 | # define P_WINDOWS 0x20 |
208 | #endif | 208 | #endif |
209 | 209 | ||
210 | // Status of make() | ||
211 | #define MAKE_FAILURE 0x01 | ||
212 | #define MAKE_DIDSOMETHING 0x02 | ||
213 | |||
210 | #define HTABSIZE 39 | 214 | #define HTABSIZE 39 |
211 | 215 | ||
212 | struct globals { | 216 | struct globals { |
@@ -279,16 +283,13 @@ static int make(struct name *np, int level); | |||
279 | * Print message, with makefile and line number if possible. | 283 | * Print message, with makefile and line number if possible. |
280 | */ | 284 | */ |
281 | static void | 285 | static void |
282 | vwarning(const char *msg, va_list list) | 286 | vwarning(FILE *stream, const char *msg, va_list list) |
283 | { | 287 | { |
284 | const char *old_applet_name = applet_name; | 288 | fprintf(stream, "%s: ", applet_name); |
285 | 289 | if (makefile) | |
286 | if (makefile) { | 290 | fprintf(stream, "(%s:%d): ", makefile, dispno); |
287 | fprintf(stderr, "%s: (%s:%d)", applet_name, makefile, dispno); | 291 | vfprintf(stream, msg, list); |
288 | applet_name = ""; | 292 | fputc('\n', stream); |
289 | } | ||
290 | bb_verror_msg(msg, list, NULL); | ||
291 | applet_name = old_applet_name; | ||
292 | } | 293 | } |
293 | 294 | ||
294 | /* | 295 | /* |
@@ -301,7 +302,7 @@ error(const char *msg, ...) | |||
301 | va_list list; | 302 | va_list list; |
302 | 303 | ||
303 | va_start(list, msg); | 304 | va_start(list, msg); |
304 | vwarning(msg, list); | 305 | vwarning(stderr, msg, list); |
305 | va_end(list); | 306 | va_end(list); |
306 | exit(2); | 307 | exit(2); |
307 | } | 308 | } |
@@ -326,7 +327,7 @@ warning(const char *msg, ...) | |||
326 | va_list list; | 327 | va_list list; |
327 | 328 | ||
328 | va_start(list, msg); | 329 | va_start(list, msg); |
329 | vwarning(msg, list); | 330 | vwarning(stdout, msg, list); |
330 | va_end(list); | 331 | va_end(list); |
331 | } | 332 | } |
332 | 333 | ||
@@ -2120,7 +2121,7 @@ remove_target(void) | |||
2120 | static int | 2121 | static int |
2121 | docmds(struct name *np, struct cmd *cp) | 2122 | docmds(struct name *np, struct cmd *cp) |
2122 | { | 2123 | { |
2123 | int estat = 0; // 0 exit status is success | 2124 | int estat = 0; |
2124 | char *q, *command; | 2125 | char *q, *command; |
2125 | 2126 | ||
2126 | for (; cp; cp = cp->c_next) { | 2127 | for (; cp; cp = cp->c_next) { |
@@ -2164,6 +2165,7 @@ docmds(struct name *np, struct cmd *cp) | |||
2164 | target = np; | 2165 | target = np; |
2165 | status = system(cmd); | 2166 | status = system(cmd); |
2166 | target = NULL; | 2167 | target = NULL; |
2168 | estat = MAKE_DIDSOMETHING; | ||
2167 | // If this command was being run to create an include file | 2169 | // If this command was being run to create an include file |
2168 | // or bring it up-to-date errors should be ignored and a | 2170 | // or bring it up-to-date errors should be ignored and a |
2169 | // failure status returned. | 2171 | // failure status returned. |
@@ -2177,7 +2179,7 @@ docmds(struct name *np, struct cmd *cp) | |||
2177 | #endif | 2179 | #endif |
2178 | remove_target(); | 2180 | remove_target(); |
2179 | if (errcont || doinclude) | 2181 | if (errcont || doinclude) |
2180 | estat = 1; // 1 exit status is failure | 2182 | estat |= MAKE_FAILURE; |
2181 | else | 2183 | else |
2182 | exit(status); | 2184 | exit(status); |
2183 | } | 2185 | } |
@@ -2217,7 +2219,7 @@ static int | |||
2217 | make1(struct name *np, struct cmd *cp, char *oodate, char *allsrc, | 2219 | make1(struct name *np, struct cmd *cp, char *oodate, char *allsrc, |
2218 | char *dedup, struct name *implicit) | 2220 | char *dedup, struct name *implicit) |
2219 | { | 2221 | { |
2220 | int estat = 0; // 0 exit status is success | 2222 | int estat; |
2221 | char *name, *member = NULL, *base; | 2223 | char *name, *member = NULL, *base; |
2222 | 2224 | ||
2223 | name = splitlib(np->n_name, &member); | 2225 | name = splitlib(np->n_name, &member); |
@@ -2285,8 +2287,7 @@ make(struct name *np, int level) | |||
2285 | char *allsrc = NULL; | 2287 | char *allsrc = NULL; |
2286 | char *dedup = NULL; | 2288 | char *dedup = NULL; |
2287 | struct timespec dtim = {1, 0}; | 2289 | struct timespec dtim = {1, 0}; |
2288 | bool didsomething = 0; | 2290 | int estat = 0; |
2289 | bool estat = 0; // 0 exit status is success | ||
2290 | 2291 | ||
2291 | if (np->n_flag & N_DONE) | 2292 | if (np->n_flag & N_DONE) |
2292 | return 0; | 2293 | return 0; |
@@ -2389,10 +2390,10 @@ make(struct name *np, int level) | |||
2389 | if ((np->n_flag & N_DOUBLE)) { | 2390 | if ((np->n_flag & N_DOUBLE)) { |
2390 | if (!quest && ((np->n_flag & N_PHONY) || | 2391 | if (!quest && ((np->n_flag & N_PHONY) || |
2391 | timespec_le(&np->n_tim, &dtim))) { | 2392 | timespec_le(&np->n_tim, &dtim))) { |
2392 | if (estat == 0) { | 2393 | if (!(estat & MAKE_FAILURE)) { |
2393 | estat = make1(np, rp->r_cmd, oodate, allsrc, dedup, locdep); | 2394 | estat |= make1(np, rp->r_cmd, oodate, allsrc, |
2395 | dedup, locdep); | ||
2394 | dtim = (struct timespec){1, 0}; | 2396 | dtim = (struct timespec){1, 0}; |
2395 | didsomething = 1; | ||
2396 | } | 2397 | } |
2397 | free(oodate); | 2398 | free(oodate); |
2398 | oodate = NULL; | 2399 | oodate = NULL; |
@@ -2414,26 +2415,25 @@ make(struct name *np, int level) | |||
2414 | 2415 | ||
2415 | if (quest) { | 2416 | if (quest) { |
2416 | if (timespec_le(&np->n_tim, &dtim)) { | 2417 | if (timespec_le(&np->n_tim, &dtim)) { |
2417 | didsomething = 1; | 2418 | // MAKE_FAILURE means rebuild is needed |
2418 | estat = 1; // 1 means rebuild is needed | 2419 | estat = MAKE_FAILURE | MAKE_DIDSOMETHING; |
2419 | } | 2420 | } |
2420 | } else if (!(np->n_flag & N_DOUBLE) && | 2421 | } else if (!(np->n_flag & N_DOUBLE) && |
2421 | ((np->n_flag & N_PHONY) || (timespec_le(&np->n_tim, &dtim)))) { | 2422 | ((np->n_flag & N_PHONY) || (timespec_le(&np->n_tim, &dtim)))) { |
2422 | if (estat == 0) { | 2423 | if (!(estat & MAKE_FAILURE)) { |
2423 | if (sc_cmd) | 2424 | if (sc_cmd) |
2424 | estat = make1(np, sc_cmd, oodate, allsrc, dedup, impdep); | 2425 | estat |= make1(np, sc_cmd, oodate, allsrc, dedup, impdep); |
2425 | else if (!doinclude) | 2426 | else if (!doinclude && level == 0 && !(estat & MAKE_DIDSOMETHING)) |
2426 | warning("nothing to be done for %s", np->n_name); | 2427 | warning("nothing to be done for %s", np->n_name); |
2427 | didsomething = 1; | ||
2428 | } else if (!doinclude) { | 2428 | } else if (!doinclude) { |
2429 | warning("'%s' not built due to errors", np->n_name); | 2429 | warning("'%s' not built due to errors", np->n_name); |
2430 | } | 2430 | } |
2431 | free(oodate); | 2431 | free(oodate); |
2432 | } | 2432 | } |
2433 | 2433 | ||
2434 | if (didsomething) | 2434 | if (estat & MAKE_DIDSOMETHING) |
2435 | clock_gettime(CLOCK_REALTIME, &np->n_tim); | 2435 | clock_gettime(CLOCK_REALTIME, &np->n_tim); |
2436 | else if (!quest && level == 0) | 2436 | else if (!quest && level == 0 && !timespec_le(&np->n_tim, &dtim)) |
2437 | printf("%s: '%s' is up to date\n", applet_name, np->n_name); | 2437 | printf("%s: '%s' is up to date\n", applet_name, np->n_name); |
2438 | 2438 | ||
2439 | free(allsrc); | 2439 | free(allsrc); |
@@ -2918,5 +2918,5 @@ int make_main(int argc UNUSED_PARAM, char **argv) | |||
2918 | llist_free(dirs, NULL); | 2918 | llist_free(dirs, NULL); |
2919 | #endif | 2919 | #endif |
2920 | 2920 | ||
2921 | return estat; | 2921 | return estat & MAKE_FAILURE; |
2922 | } | 2922 | } |