Skip to content

Commit 5eb6e28

Browse files
authored
build: use mktemp more (#60080)
Use mktemp more to make various file builds atomic (particularly those shared between release and debug). (Coded by Claude)
1 parent ac4ee59 commit 5eb6e28

File tree

4 files changed

+62
-41
lines changed

4 files changed

+62
-41
lines changed

cli/Makefile

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,30 +88,35 @@ DIRS = $(build_bindir) $(build_libdir)
8888
$(foreach dir,$(DIRS),$(eval $(call dir_target,$(dir))))
8989

9090
ifeq ($(OS),WINNT)
91-
$(BUILDDIR)/julia_res.o: $(JULIAHOME)/contrib/windows/julia.rc $(JULIAHOME)/VERSION
91+
$(BUILDDIR)/julia_res.o $(BUILDDIR)/julia_res_debug.o: $(JULIAHOME)/contrib/windows/julia.rc $(JULIAHOME)/VERSION
9292
JLVER=`cat $(JULIAHOME)/VERSION` && \
9393
JLVERi=`echo $$JLVER | perl -nle \
9494
'/^(\d+)\.?(\d*)\.?(\d*)/ && \
9595
print int $$1,",",int $$2,",",int $$3,",0"'` && \
9696
$(CROSS_COMPILE)windres $< -O coff -o $@ -DJLVER=$$JLVERi -DJLVER_STR=\\\"$$JLVER\\\"
9797
EXE_OBJS += $(BUILDDIR)/julia_res.o
98-
EXE_DOBJS += $(BUILDDIR)/julia_res.o
98+
EXE_DOBJS += $(BUILDDIR)/julia_res_debug.o
9999
endif
100100

101101
# Embed an Info.plist in the julia executable
102102
# Create an intermediate target Info.plist for Darwin code signing.
103103
ifeq ($(DARWIN_FRAMEWORK),1)
104-
$(BUILDDIR)/Info.plist: $(JULIAHOME)/VERSION
105-
/usr/libexec/PlistBuddy -x -c "Clear dict" $@
106-
/usr/libexec/PlistBuddy -x -c "Add :CFBundleName string julia" $@
107-
/usr/libexec/PlistBuddy -x -c "Add :CFBundleIdentifier string $(darwin_codesign_id_julia_ui)" $@
108-
/usr/libexec/PlistBuddy -x -c "Add :CFBundleInfoDictionaryVersion string 6.0" $@
109-
/usr/libexec/PlistBuddy -x -c "Add :CFBundleVersion string $(JULIA_COMMIT)" $@
110-
/usr/libexec/PlistBuddy -x -c "Add :CFBundleShortVersionString string $(JULIA_MAJOR_VERSION).$(JULIA_MINOR_VERSION).$(JULIA_PATCH_VERSION)" $@
111-
.INTERMEDIATE: $(BUILDDIR)/Info.plist # cleanup this file after we are done using it
104+
.PHONY: Info.plist.phony
105+
Info.plist.phony:
106+
@TMPFILE=$$(mktemp -u $(abspath $(BUILDDIR)/Info.plist.XXXXXX)); \
107+
/usr/libexec/PlistBuddy -x -c "Add :CFBundleName string julia" $$TMPFILE; \
108+
/usr/libexec/PlistBuddy -x -c "Add :CFBundleIdentifier string $(darwin_codesign_id_julia_ui)" $$TMPFILE; \
109+
/usr/libexec/PlistBuddy -x -c "Add :CFBundleInfoDictionaryVersion string 6.0" $$TMPFILE; \
110+
/usr/libexec/PlistBuddy -x -c "Add :CFBundleVersion string $(JULIA_COMMIT)" $$TMPFILE; \
111+
/usr/libexec/PlistBuddy -x -c "Add :CFBundleShortVersionString string $(JULIA_MAJOR_VERSION).$(JULIA_MINOR_VERSION).$(JULIA_PATCH_VERSION)" $$TMPFILE; \
112+
if ! cmp -s $(BUILDDIR)/Info.plist $$TMPFILE; then \
113+
mv $$TMPFILE $(BUILDDIR)/Info.plist; \
114+
else \
115+
rm -f $$TMPFILE; \
116+
fi
112117
JLDFLAGS += -Wl,-sectcreate,__TEXT,__info_plist,Info.plist
113-
$(build_bindir)/julia$(EXE): $(BUILDDIR)/Info.plist
114-
$(build_bindir)/julia-debug$(EXE): $(BUILDDIR)/Info.plist
118+
$(build_bindir)/julia$(EXE): Info.plist.phony
119+
$(build_bindir)/julia-debug$(EXE): Info.plist.phony
115120
endif
116121

117122
julia-release: $(build_bindir)/julia$(EXE)
@@ -164,11 +169,14 @@ $(build_bindir)/julia-debug$(EXE): $(EXE_DOBJS) $(build_shlibdir)/libjulia-debug
164169
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(DEBUGFLAGS) $(EXE_DOBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH) -ljulia-debug)
165170

166171
$(BUILDDIR)/julia.expmap: $(SRCDIR)/julia.expmap.in $(JULIAHOME)/VERSION
167-
sed <'$<' >'$@' -e 's/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/'
172+
@TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
173+
sed <'$<' >$$TMPFILE -e 's/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/'; \
174+
mv $$TMPFILE $@
168175

169176
clean: | $(CLEAN_TARGETS)
170177
rm -f $(BUILDDIR)/*.o $(BUILDDIR)/*.dbg.obj
171178
rm -f $(build_bindir)/julia*
172-
rm -f $(BUILDDIR)/julia.expmap
179+
rm -f $(BUILDDIR)/julia.expmap*
180+
rm -f $(BUILDDIR)/Info.plist*
173181

174182
.PHONY: clean release debug julia-release julia-debug

src/Makefile

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -286,19 +286,23 @@ $(BUILDDIR)/%.h.gen : $(SRCDIR)/%.d
286286
sed 's/JULIA_/JL_PROBE_/' $@ > $@.tmp
287287
mv $@.tmp $@
288288

289+
# Generate `.inc` file that contains a list of `#define` macros to rename functions defined in `libjulia-internal`
290+
# to have a `ijl_` prefix instead of `jl_`, to denote that they are coming from `libjulia-internal`. This avoids
291+
# potential confusion with debugging tools, when inspecting a process that has both `libjulia` and `libjulia-internal`
292+
# loaded at the same time.
289293
$(BUILDDIR)/jl_internal_funcs.inc: $(SRCDIR)/jl_exported_funcs.inc
290-
# Generate `.inc` file that contains a list of `#define` macros to rename functions defined in `libjulia-internal`
291-
# to have a `ijl_` prefix instead of `jl_`, to denote that they are coming from `libjulia-internal`. This avoids
292-
# potential confusion with debugging tools, when inspecting a process that has both `libjulia` and `libjulia-internal`
293-
# loaded at the same time.
294-
grep 'XX(..*)' $< | sed -E 's/.*XX\((.+)\).*/#define \1 i\1/g' >$@
294+
@TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
295+
grep 'XX(..*)' $< | sed -E 's/.*XX\((.+)\).*/#define \1 i\1/g' > $$TMPFILE; \
296+
mv $$TMPFILE $@
295297

298+
# Generate `.inc` file that contains a list of `#define` macros to access global data through struct instances
296299
$(BUILDDIR)/jl_data_globals_defs.inc: $(SRCDIR)/jl_exported_data.inc
297-
# Generate `.inc` file that contains a list of `#define` macros to access global data through struct instances
300+
@TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
298301
{ \
299302
grep 'XX(.*)' $< | sed -E 's/.*XX\(([^,]+), .*\).*/#define jl_\1 (sysimg_global.\1)/g'; \
300303
grep 'YY(.*)' $< | sed -E 's/.*YY\(([^,]+), .*\).*/#define jl_\1 (const_globals.jl\1)/g'; \
301-
} >$@
304+
} > $$TMPFILE; \
305+
mv $$TMPFILE $@
302306

303307
# source file rules
304308
$(BUILDDIR)/%.o: $(SRCDIR)/%.c $(HEADERS) | $(BUILDDIR)
@@ -370,13 +374,17 @@ $(build_shlibdir)/libllvmcalltest.$(SHLIB_EXT): $(SRCDIR)/llvmcalltest.cpp $(LLV
370374
julia_flisp.boot.inc.phony: $(BUILDDIR)/julia_flisp.boot.inc
371375

372376
$(BUILDDIR)/julia_flisp.boot.inc: $(BUILDDIR)/julia_flisp.boot $(FLISP_EXECUTABLE_release)
373-
@$(call PRINT_FLISP, $(call spawn,$(FLISP_EXECUTABLE_release)) $(call cygpath_w,$(SRCDIR)/bin2hex.scm) < $< > $@)
377+
@$(call PRINT_FLISP, TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
378+
$(call spawn,$(FLISP_EXECUTABLE_release)) $(call cygpath_w,$(SRCDIR)/bin2hex.scm) < $< > $$TMPFILE; \
379+
mv $$TMPFILE $@)
374380

375381
$(BUILDDIR)/julia_flisp.boot: $(addprefix $(SRCDIR)/,jlfrontend.scm flisp/aliases.scm flisp/profile.scm \
376382
julia-parser.scm julia-syntax.scm match.scm utils.scm ast.scm macroexpand.scm mk_julia_flisp_boot.scm) \
377383
$(FLISP_EXECUTABLE_release)
378-
@$(call PRINT_FLISP, $(call spawn,$(FLISP_EXECUTABLE_release)) \
379-
$(call cygpath_w,$(SRCDIR)/mk_julia_flisp_boot.scm) $(call cygpath_w,$(dir $<)) $(notdir $<) $(call cygpath_w,$@))
384+
@$(call PRINT_FLISP, TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
385+
$(call spawn,$(FLISP_EXECUTABLE_release)) \
386+
$(call cygpath_w,$(SRCDIR)/mk_julia_flisp_boot.scm) $(call cygpath_w,$(dir $<)) $(notdir $<) $(call cygpath_w,$$TMPFILE); \
387+
mv $$TMPFILE $@)
380388

381389
# additional dependency links
382390
$(BUILDDIR)/codegen-stubs.o $(BUILDDIR)/codegen-stubs.dbg.obj: $(addprefix $(SRCDIR)/,intrinsics.h llvm-julia-passes.inc)
@@ -445,23 +453,28 @@ $(BUILDDIR)/flisp/libflisp-debug.a: $(addprefix $(SRCDIR)/,flisp/*.h flisp/*.c)
445453
$(MAKE) -C $(SRCDIR)/flisp debug BUILDDIR='$(abspath $(BUILDDIR)/flisp)'
446454

447455
$(BUILDDIR)/julia_version.h: $(JULIAHOME)/VERSION
448-
@echo "// This is an autogenerated header file" > $@.$(JULIA_BUILD_MODE).tmp
449-
@echo "#ifndef JL_VERSION_H" >> $@.$(JULIA_BUILD_MODE).tmp
450-
@echo "#define JL_VERSION_H" >> $@.$(JULIA_BUILD_MODE).tmp
451-
@echo "#define JULIA_VERSION_STRING" \"$(JULIA_VERSION)\" >> $@.$(JULIA_BUILD_MODE).tmp
452-
@echo $(JULIA_VERSION) | awk 'BEGIN {FS="[.,+-]"} \
453-
{print "#define JULIA_VERSION_MAJOR " $$1 "\n" \
454-
"#define JULIA_VERSION_MINOR " $$2 "\n" \
455-
"#define JULIA_VERSION_PATCH " $$3 ; \
456-
if (NF<4) print "#define JULIA_VERSION_IS_RELEASE 1" ; else print "#define JULIA_VERSION_IS_RELEASE 0"}' >> $@.$(JULIA_BUILD_MODE).tmp
457-
@echo "#endif" >> $@.$(JULIA_BUILD_MODE).tmp
458-
mv $@.$(JULIA_BUILD_MODE).tmp $@
456+
@TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
457+
{ \
458+
echo "// This is an autogenerated header file"; \
459+
echo "#ifndef JL_VERSION_H"; \
460+
echo "#define JL_VERSION_H"; \
461+
echo "#define JULIA_VERSION_STRING" \"$(JULIA_VERSION)\"; \
462+
echo $(JULIA_VERSION) | awk 'BEGIN {FS="[.,+-]"} \
463+
{print "#define JULIA_VERSION_MAJOR " $$1 "\n" \
464+
"#define JULIA_VERSION_MINOR " $$2 "\n" \
465+
"#define JULIA_VERSION_PATCH " $$3 ; \
466+
if (NF<4) print "#define JULIA_VERSION_IS_RELEASE 1" ; else print "#define JULIA_VERSION_IS_RELEASE 0"}'; \
467+
echo "#endif"; \
468+
} > $$TMPFILE; \
469+
mv $$TMPFILE $@
459470

460471
CXXLD = $(CXX) -shared
461472

462473
$(BUILDDIR)/julia.expmap: $(SRCDIR)/julia.expmap.in $(JULIAHOME)/VERSION $(LLVM_CONFIG_ABSOLUTE)
463-
sed <'$<' >'$@' -e "s/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/" \
464-
-e "s/@LLVM_SHLIB_SYMBOL_VERSION@/$(LLVM_SHLIB_SYMBOL_VERSION)/"
474+
@TMPFILE=$$(mktemp $(abspath $@.XXXXXX)); \
475+
sed <'$<' >$$TMPFILE -e "s/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/" \
476+
-e "s/@LLVM_SHLIB_SYMBOL_VERSION@/$(LLVM_SHLIB_SYMBOL_VERSION)/"; \
477+
mv $$TMPFILE $@
465478

466479
$(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT): $(BUILDDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV)
467480
@$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(SHIPFLAGS) $(JCXXFLAGS) $(CXXLDFLAGS) $(OBJS) $(RPATH_LIB) -o $@ \
@@ -573,9 +586,9 @@ INCLUDED_CXX_FILES := \
573586
clean:
574587
-rm -fr $(build_shlibdir)/libjulia-internal* $(build_shlibdir)/libjulia-codegen*
575588
-rm -rf $(build_shlibdir)/libccalltest* $(build_shlibdir)/libllvmcalltest* $(build_shlibdir)/libccalllazyfoo* $(build_shlibdir)/libccalllazybar*
576-
-rm -f $(BUILDDIR)/julia_flisp.boot $(BUILDDIR)/julia_flisp.boot.inc $(BUILDDIR)/jl_internal_funcs.inc $(BUILDDIR)/jl_data_globals_defs.inc
589+
-rm -f $(BUILDDIR)/julia_flisp.boot* $(BUILDDIR)/julia_flisp.boot.inc* $(BUILDDIR)/jl_internal_funcs.inc* $(BUILDDIR)/jl_data_globals_defs.inc*
577590
-rm -f $(BUILDDIR)/*.dbg.obj $(BUILDDIR)/*.o $(BUILDDIR)/*.dwo $(BUILDDIR)/*.$(SHLIB_EXT) $(BUILDDIR)/*.a $(BUILDDIR)/*.h.gen
578-
-rm -f $(BUILDDIR)/julia.expmap
591+
-rm -f $(BUILDDIR)/julia.expmap*
579592
-rm -f $(BUILDDIR)/julia_version.h
580593
-rm -f $(BUILDDIR)/compile_commands.json*
581594

src/flisp/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ INCLUDED_FLISP_FILES := flisp.c:cvalues.c flisp.c:types.c flisp.c:print.c flisp.
142142
# Compilation database generation
143143
.PHONY: regenerate-compile_commands
144144
regenerate-compile_commands:
145-
TMPFILE=$$(mktemp $(abspath $(BUILDDIR)/compile_commands.json.XXXXXX)); \
145+
@TMPFILE=$$(mktemp $(abspath $(BUILDDIR)/compile_commands.json.XXXXXX)); \
146146
{ \
147147
CLANG_TOOLING_C_FLAGS="$$($(JULIAHOME)/contrib/escape_json.sh clang $(CLANG_TOOLING_C_FLAGS))"; \
148148
echo "["; \

src/support/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ INCLUDED_SUPPORT_FILES := hashing.c:MurmurHash3.c
8080
# Compilation database generation
8181
.PHONY: regenerate-compile_commands
8282
regenerate-compile_commands:
83-
TMPFILE=$$(mktemp $(abspath $(BUILDDIR)/compile_commands.json.XXXXXX)); \
83+
@TMPFILE=$$(mktemp $(abspath $(BUILDDIR)/compile_commands.json.XXXXXX)); \
8484
{ \
8585
CLANG_TOOLING_S_FLAGS="$$($(JULIAHOME)/contrib/escape_json.sh clang $(JCPPFLAGS) $(DEBUGFLAGS))"; \
8686
CLANG_TOOLING_C_FLAGS="$$($(JULIAHOME)/contrib/escape_json.sh clang $(JCPPFLAGS) $(JCFLAGS) $(DEBUGFLAGS))"; \

0 commit comments

Comments
 (0)