Fix race when building ada-lex.c
authorJohn Reiser <jreiser@BitWagon.com>
Sun, 29 Apr 2018 15:57:38 +0000 (11:57 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Sun, 29 Apr 2018 15:57:38 +0000 (11:57 -0400)
Prevent a race when building ada-lex.c, and any target of rules .c:.l or
.c:.y.  The target should be written only at the last step, else SIGINT
(^C) can leave an inconsistent state.  Being .PRECIOUS makes it even
worse.

gdb/ChangeLog:

PR build/22873
* gdb/Makefile.in: (.c:.l, .c:.y): Write the target only in the
last step, and do it atomically.

gdb/ChangeLog
gdb/Makefile.in

index 55e640581a906e94f854260d943075e47e4d3165..312301cc06b901926760a836bebf85f46d59a110 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-29  John Reiser  <jreiser@BitWagon.com>
+
+       PR build/22873
+       * gdb/Makefile.in: (.c:.l, .c:.y): Write the target only in the
+       last step, and do it atomically.
+
 2018-04-27  Alexandre Oliva  <aoliva@redhat.com>
 
        * compile/compile-c-types.c (convert_int, convert_float):
index 648f66d31df3a1b2561af3f33c76cd06e28ca0cb..be769280a9397fb502d74bd9b559e1f4ca27503b 100644 (file)
@@ -2483,9 +2483,8 @@ po/$(PACKAGE).pot: force
 # Makefile.in, but that was a pretty big annoyance.
 
 %.c: %.y
-       rm -f $@ $@.tmp
-       $(SHELL) $(YLWRAP) $< y.tab.c $@ -- $(YACC) $(YFLAGS) && mv $@ $@.tmp \
-               || (rm -f $@; false)
+       $(SHELL) $(YLWRAP) $< y.tab.c $@.tmp -- $(YACC) $(YFLAGS) \
+               || (rm -f $@.tmp; false)
        sed -e '/extern.*malloc/d' \
             -e '/extern.*realloc/d' \
             -e '/extern.*free/d' \
@@ -2496,13 +2495,13 @@ po/$(PACKAGE).pot: force
             -e 's/\([ \t;,(]\)free$$/\1xfree/g' \
             -e '/^#line.*y.tab.c/d' \
             -e 's/YY_NULL/YY_NULLPTR/g' \
-         < $@.tmp > $@
-       rm -f $@.tmp
+         < $@.tmp > $@.new && \
+         rm -f $@.tmp && \
+         mv $@.new $@
 %.c: %.l
        if [ "$(FLEX)" ] && $(FLEX) --version >/dev/null 2>&1; then \
-           $(FLEX) -o$@ $< && \
-           rm -f $@.new && \
-           sed -e '/extern.*malloc/d' \
+           $(FLEX) --stdout $<  \
+           | sed -e '/extern.*malloc/d' \
                -e '/extern.*realloc/d' \
                -e '/extern.*free/d' \
                -e '/include.*malloc.h/d' \
@@ -2511,8 +2510,7 @@ po/$(PACKAGE).pot: force
                -e 's/\([ \t;,(]\)free\([ \t]*[&(),]\)/\1xfree\2/g' \
                -e 's/\([ \t;,(]\)free$$/\1xfree/g' \
                -e 's/yy_flex_xrealloc/yyxrealloc/g' \
-             < $@ > $@.new && \
-           rm -f $@ && \
+             > $@.new && \
            mv $@.new $@; \
        elif [ -f $@ ]; then \
            echo "Warning: $*.c older than $*.l and flex not available."; \