diff options
-rw-r--r-- | miscutils/make.c | 45 | ||||
-rwxr-xr-x | testsuite/make.tests | 8 | ||||
-rw-r--r-- | win32/system.c | 5 |
3 files changed, 48 insertions, 10 deletions
diff --git a/miscutils/make.c b/miscutils/make.c index d554a5f7f..8feec1202 100644 --- a/miscutils/make.c +++ b/miscutils/make.c | |||
@@ -293,6 +293,19 @@ vwarning(FILE *stream, const char *msg, va_list list) | |||
293 | } | 293 | } |
294 | 294 | ||
295 | /* | 295 | /* |
296 | * Diagnostic handler. Print message to standard error. | ||
297 | */ | ||
298 | static void | ||
299 | diagnostic(const char *msg, ...) | ||
300 | { | ||
301 | va_list list; | ||
302 | |||
303 | va_start(list, msg); | ||
304 | vwarning(stderr, msg, list); | ||
305 | va_end(list); | ||
306 | } | ||
307 | |||
308 | /* | ||
296 | * Error handler. Print message and exit. | 309 | * Error handler. Print message and exit. |
297 | */ | 310 | */ |
298 | static void error(const char *msg, ...) NORETURN; | 311 | static void error(const char *msg, ...) NORETURN; |
@@ -2111,7 +2124,7 @@ remove_target(void) | |||
2111 | if (!dryrun && !print && !precious && | 2124 | if (!dryrun && !print && !precious && |
2112 | target && !(target->n_flag & (N_PRECIOUS | N_PHONY)) && | 2125 | target && !(target->n_flag & (N_PRECIOUS | N_PHONY)) && |
2113 | unlink(target->n_name) == 0) { | 2126 | unlink(target->n_name) == 0) { |
2114 | warning("'%s' removed", target->n_name); | 2127 | diagnostic("'%s' removed", target->n_name); |
2115 | } | 2128 | } |
2116 | } | 2129 | } |
2117 | 2130 | ||
@@ -2164,23 +2177,35 @@ docmds(struct name *np, struct cmd *cp) | |||
2164 | 2177 | ||
2165 | target = np; | 2178 | target = np; |
2166 | status = system(cmd); | 2179 | status = system(cmd); |
2167 | target = NULL; | ||
2168 | // If this command was being run to create an include file | 2180 | // If this command was being run to create an include file |
2169 | // or bring it up-to-date errors should be ignored and a | 2181 | // or bring it up-to-date errors should be ignored and a |
2170 | // failure status returned. | 2182 | // failure status returned. |
2171 | if (status == -1 && !doinclude) { | 2183 | if (status == -1 && !doinclude) { |
2172 | error("couldn't execute '%s'", q); | 2184 | error("couldn't execute '%s'", q); |
2173 | } else if (status != 0 && !signore) { | 2185 | } else if (status != 0 && !signore) { |
2174 | if (!doinclude) | 2186 | if (!posix && WIFSIGNALED(status)) |
2175 | warning("failed to build '%s'", np->n_name); | ||
2176 | #if !ENABLE_PLATFORM_MINGW32 | ||
2177 | if (status == SIGINT || status == SIGQUIT) | ||
2178 | #endif | ||
2179 | remove_target(); | 2187 | remove_target(); |
2180 | if (errcont || doinclude) | 2188 | if (errcont || doinclude) { |
2189 | warning("failed to build '%s'", np->n_name); | ||
2181 | estat |= MAKE_FAILURE; | 2190 | estat |= MAKE_FAILURE; |
2182 | else | 2191 | } else { |
2183 | exit(status); | 2192 | const char *err_type = NULL; |
2193 | int err_value; | ||
2194 | |||
2195 | if (WIFEXITED(status)) { | ||
2196 | err_type = "exit"; | ||
2197 | err_value = WEXITSTATUS(status); | ||
2198 | } else if (WIFSIGNALED(status)) { | ||
2199 | err_type = "signal"; | ||
2200 | err_value = WTERMSIG(status); | ||
2201 | } | ||
2202 | |||
2203 | if (err_type) | ||
2204 | error("failed to build '%s' %s %d", np->n_name, | ||
2205 | err_type, err_value); | ||
2206 | else | ||
2207 | error("failed to build '%s'", np->n_name); | ||
2208 | } | ||
2184 | } | 2209 | } |
2185 | } | 2210 | } |
2186 | if (sdomake || dryrun || dotouch) | 2211 | if (sdomake || dryrun || dotouch) |
diff --git a/testsuite/make.tests b/testsuite/make.tests index b53b4a2ea..60bb78406 100755 --- a/testsuite/make.tests +++ b/testsuite/make.tests | |||
@@ -86,6 +86,14 @@ test.k: | |||
86 | ' | 86 | ' |
87 | cd .. || exit 1; rm -rf make.tempdir 2>/dev/null | 87 | cd .. || exit 1; rm -rf make.tempdir 2>/dev/null |
88 | 88 | ||
89 | # There was a bug where the failure of a build command didn't result | ||
90 | # in make returning a non-zero exit status. | ||
91 | testing "make return error if command fails" \ | ||
92 | "make -f - >/dev/null 2>&1; echo \$?" "2\n" "" ' | ||
93 | target: | ||
94 | @exit 42 | ||
95 | ' | ||
96 | |||
89 | # A macro created using ::= remembers it's of type immediate-expansion. | 97 | # A macro created using ::= remembers it's of type immediate-expansion. |
90 | # Immediate expansion also occurs when += is used to append to such a macro. | 98 | # Immediate expansion also occurs when += is used to append to such a macro. |
91 | testing "make appending to immediate-expansion macro" \ | 99 | testing "make appending to immediate-expansion macro" \ |
diff --git a/win32/system.c b/win32/system.c index 44a47f861..00b594242 100644 --- a/win32/system.c +++ b/win32/system.c | |||
@@ -6,6 +6,7 @@ int mingw_system(const char *cmd) | |||
6 | intptr_t proc; | 6 | intptr_t proc; |
7 | HANDLE h; | 7 | HANDLE h; |
8 | DWORD ret = 0; | 8 | DWORD ret = 0; |
9 | int sig; | ||
9 | 10 | ||
10 | if (cmd == NULL) | 11 | if (cmd == NULL) |
11 | return 1; | 12 | return 1; |
@@ -18,5 +19,9 @@ int mingw_system(const char *cmd) | |||
18 | GetExitCodeProcess(h, &ret); | 19 | GetExitCodeProcess(h, &ret); |
19 | CloseHandle(h); | 20 | CloseHandle(h); |
20 | 21 | ||
22 | // Was process terminated as if by a signal? | ||
23 | sig = ret >> 24; | ||
24 | if (sig != 0 && ret == sig << 24 && is_valid_signal(sig)) | ||
25 | return sig; | ||
21 | return ret << 8; | 26 | return ret << 8; |
22 | } | 27 | } |