diff options
| author | Michael Olbrich <m.olbrich@pengutronix.de> | 2018-04-12 10:36:54 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-14 01:55:51 +0200 |
| commit | 43dd0062229170747dcbee0a2a87b8e5ee2f09d6 (patch) | |
| tree | 5b2936d00438b86e327dc56cf025c96a4faa4773 | |
| parent | c783cf78af04e898a20f69f28b885f7c0285020c (diff) | |
| download | busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.tar.gz busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.tar.bz2 busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.zip | |
build system: fix parallel building issue
The files generated by the include/config/MARKER target are in the
dependency list for applets/applet_tables.
If applets/applet_tables is created first during applets_dir then it will
be created again later as part of $(busybox-dirs).
As a result include/applet_tables.h is created again. This time while other
build commands may need it.
Let applets_dir depend on include/config/MARKER to avoid this particular
race condition and create the header files atomically to ensure that the
compiler never sees incomplete files.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | applets/applet_tables.c | 16 |
2 files changed, 15 insertions, 3 deletions
| @@ -368,7 +368,7 @@ gen_build_files: $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c) | |||
| 368 | # we depend on scripts_basic, since scripts/basic/fixdep | 368 | # we depend on scripts_basic, since scripts/basic/fixdep |
| 369 | # must be built before any other host prog | 369 | # must be built before any other host prog |
| 370 | PHONY += applets_dir | 370 | PHONY += applets_dir |
| 371 | applets_dir: scripts_basic gen_build_files | 371 | applets_dir: scripts_basic gen_build_files include/config/MARKER |
| 372 | $(Q)$(MAKE) $(build)=applets | 372 | $(Q)$(MAKE) $(build)=applets |
| 373 | 373 | ||
| 374 | applets/%: applets_dir ; | 374 | applets/%: applets_dir ; |
diff --git a/applets/applet_tables.c b/applets/applet_tables.c index ef911a43b..e3d10c83f 100644 --- a/applets/applet_tables.c +++ b/applets/applet_tables.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <sys/types.h> | 10 | #include <sys/types.h> |
| 11 | #include <sys/stat.h> | 11 | #include <sys/stat.h> |
| 12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
| 13 | #include <limits.h> | ||
| 13 | #include <stdlib.h> | 14 | #include <stdlib.h> |
| 14 | #include <string.h> | 15 | #include <string.h> |
| 15 | #include <stdio.h> | 16 | #include <stdio.h> |
| @@ -61,6 +62,7 @@ static int str_isalnum_(const char *s) | |||
| 61 | int main(int argc, char **argv) | 62 | int main(int argc, char **argv) |
| 62 | { | 63 | { |
| 63 | int i, j; | 64 | int i, j; |
| 65 | char tmp1[PATH_MAX], tmp2[PATH_MAX]; | ||
| 64 | 66 | ||
| 65 | // In find_applet_by_name(), before linear search, narrow it down | 67 | // In find_applet_by_name(), before linear search, narrow it down |
| 66 | // by looking at N "equidistant" names. With ~350 applets: | 68 | // by looking at N "equidistant" names. With ~350 applets: |
| @@ -84,7 +86,8 @@ int main(int argc, char **argv) | |||
| 84 | 86 | ||
| 85 | if (!argv[1]) | 87 | if (!argv[1]) |
| 86 | return 1; | 88 | return 1; |
| 87 | i = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, 0666); | 89 | snprintf(tmp1, PATH_MAX, "%s.%u.new", argv[1], (int) getpid()); |
| 90 | i = open(tmp1, O_WRONLY | O_TRUNC | O_CREAT, 0666); | ||
| 88 | if (i < 0) | 91 | if (i < 0) |
| 89 | return 1; | 92 | return 1; |
| 90 | dup2(i, 1); | 93 | dup2(i, 1); |
| @@ -209,12 +212,21 @@ int main(int argc, char **argv) | |||
| 209 | // fclose(fp); | 212 | // fclose(fp); |
| 210 | // } | 213 | // } |
| 211 | // if (strcmp(line_old, line_new) != 0) { | 214 | // if (strcmp(line_old, line_new) != 0) { |
| 212 | fp = fopen(argv[2], "w"); | 215 | snprintf(tmp2, PATH_MAX, "%s.%u.new", argv[2], (int) getpid()); |
| 216 | fp = fopen(tmp2, "w"); | ||
| 213 | if (!fp) | 217 | if (!fp) |
| 214 | return 1; | 218 | return 1; |
| 215 | fputs(line_new, fp); | 219 | fputs(line_new, fp); |
| 220 | if (fclose(fp)) | ||
| 221 | return 1; | ||
| 216 | // } | 222 | // } |
| 217 | } | 223 | } |
| 218 | 224 | ||
| 225 | if (fclose(stdout)) | ||
| 226 | return 1; | ||
| 227 | if (rename(tmp1, argv[1])) | ||
| 228 | return 1; | ||
| 229 | if (rename(tmp2, argv[2])) | ||
| 230 | return 1; | ||
| 219 | return 0; | 231 | return 0; |
| 220 | } | 232 | } |
