[PATCH v2 4/6] Makerules: Make the .dt to .d conversion safe against concurrent sub-makes
Adhemerval Zanella
adhemerval.zanella@linaro.org
Thu Aug 6 17:07:58 GMT 2026
The %.d: %.dt rule seds its input into a fixed temporary name, renames
it into place and removes the input. Two makes converting the same
file trip over each other:
mv: cannot stat '.../test-double-libmvec-sincos-avx512f.o.T': No such file or directory
sed: can't read .../test-float-libmvec-acosf-avx512f.o.dt: No such file or directory
That happens because the elf rtld-Rules recursion runs a sub-make over
every $(rtld-subdirs) directory, which converts that directory's .dt
files, and the parallel subdirectory recursion (commit 7cac99621e96)
runs it concurrently with those subdirectories' own sub-makes.
Add the PID of the shell to the temporary name and claim the input with
a rename: only the run that wins converts and installs the target.
---
Makerules | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/Makerules b/Makerules
index 5f65f3ab9ee..be51154bae4 100644
--- a/Makerules
+++ b/Makerules
@@ -758,10 +758,20 @@ all-dt-files := $(foreach o,$(object-suffixes-for-libc),$(+depfiles:.d=$o.dt))
$(wildcard $(all-dt-files:.dt=.d))
# This is a funny rule in that it removes its input file.
+#
+# More than one make can convert the .dt files of a single object
+# directory: the elf rtld-Rules recursion runs a sub-make over every
+# $(rtld-subdirs) directory, concurrently with that directory's own
+# sub-make under the parallel subdir recursion. Add the PID of the
+# shell to the temporary name and claim the input with a rename: only
+# the run that wins converts and installs the target.
%.d: %.dt
- @sed $(sed-remove-objpfx) $< > $(@:.d=.T) && \
- mv -f $(@:.d=.T) $@ && \
- rm -f $<
+ @dt=$(@:.d=.T)$$$$; \
+ if mv -f $< $$dt 2>/dev/null; then \
+ sed $(sed-remove-objpfx) $$dt > $$dt.new && \
+ mv -f $$dt.new $@ && \
+ rm -f $$dt; \
+ fi
# Avoid the .h.d files for any .sym files whose .h files don't exist yet.
# They will be generated when they're needed, and trying too early won't work.
@@ -1433,7 +1443,7 @@ endef
# Also remove the dependencies and generated source files.
common-clean: common-mostlyclean
-rm -f $(addprefix $(objpfx),$(generated))
- -rm -f $(objpfx)*.d $(objpfx)*.dt
+ -rm -f $(objpfx)*.d $(objpfx)*.dt $(objpfx)*.T[0-9]*
-rm -fr $(addprefix $(objpfx),$(generated-dirs))
-rm -f $(addprefix $(common-objpfx),$(common-generated))
-rm -f $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
--
2.53.0
More information about the Libc-alpha
mailing list