Skip to content

Commit 8a7b636

Browse files
committed
auto merge of #7637 : pnkfelix/rust/fsk-guard-against-stale-libraries-issue3225-safeguarded, r=graydon
When building Rust libraries (e.g. librustc, libstd, etc), checks for and verbosely removes previous build products before invoking rustc. (Also, when Make variable VERBOSE is defined, it will list all of the libraries matching the object library's glob after the rustc invocation has completed.) When installing Rust libraries, checks for previous libraries in target install directory, but does not remove them. The thinking behind these two different modes of operation is that the installation target, unlike the build tree, is not under the control of this infrastructure and it is not up to this Makefile to decide if the previous libraries should be removed. Fixes #3225 (at least in terms of mitigating the multiple library problem by proactively warning the user about it.)
2 parents b5e9194 + ace4944 commit 8a7b636

File tree

7 files changed

+220
-70
lines changed

7 files changed

+220
-70
lines changed

Makefile.in

+33
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,39 @@ LIBRUST_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rust)
235235

236236
endef
237237

238+
# $(1) is the path for directory to match against
239+
# $(2) is the glob to use in the match
240+
# $(3) is filename (usually the target being created) to filter out from match
241+
# (i.e. filename is not out-of-date artifact from prior Rust version/build)
242+
#
243+
# Note that a common bug is to accidentally construct the glob denoted
244+
# by $(2) with a space character prefix, which invalidates the
245+
# construction $(1)$(2).
246+
define CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT
247+
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "Warning: there are previous" \'$(2)\' "libraries:" $$MATCHES; fi
248+
endef
249+
250+
# Same interface as above, but deletes rather than just listing the files.
251+
define REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT
252+
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "Warning: removing previous" \'$(2)\' "libraries:" $$MATCHES; rm -v $$MATCHES ; fi
253+
endef
254+
255+
# We use a different strategy for LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
256+
# than in the macros above because it needs the result of running the
257+
# `ls` command after other rules in the command list have run; the
258+
# macro-expander for $(wildcard ...) would deliver its results too
259+
# soon. (This is in contrast to the macros above, which are meant to
260+
# be run at the outset of a command list in a rule.)
261+
ifdef VERBOSE
262+
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
263+
@echo "Info: now are following matches for" '$(2)' "libraries:"
264+
@( cd $(1) && ( ls $(2) 2>/dev/null || true ) | grep -v $(3) || true )
265+
endef
266+
else
267+
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
268+
endef
269+
endif
270+
238271
$(foreach target,$(CFG_TARGET_TRIPLES),\
239272
$(eval $(call DEF_LIBS,$(target))))
240273

mk/host.mk

+8
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ $$(HLIB$(2)_H_$(4))/$(CFG_LIBRUSTC_$(4)): \
4545
| $$(HLIB$(2)_H_$(4))/
4646

4747
@$$(call E, cp: $$@)
48+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(4)),$$(notdir $$@))
4849
$$(Q)cp $$< $$@
4950
$$(Q)cp -R $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBRUSTC_GLOB_$(4)) \
5051
$(wildcard $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBRUSTC_DSYM_GLOB_$(4))) \
5152
$$(HLIB$(2)_H_$(4))
53+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(4)),$$(notdir $$@))
5254

5355
$$(HLIB$(2)_H_$(4))/$(CFG_LIBSYNTAX_$(4)): \
5456
$$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_LIBSYNTAX_$(4)) \
@@ -58,10 +60,12 @@ $$(HLIB$(2)_H_$(4))/$(CFG_LIBSYNTAX_$(4)): \
5860
$$(HEXTRALIB_DEFAULT$(2)_H_$(4)) \
5961
| $$(HLIB$(2)_H_$(4))/
6062
@$$(call E, cp: $$@)
63+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBSYNTAX_GLOB_$(4)),$$(notdir $$@))
6164
$$(Q)cp $$< $$@
6265
$$(Q)cp -R $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBSYNTAX_GLOB_$(4)) \
6366
$$(wildcard $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBSYNTAX_DSYM_GLOB_$(4))) \
6467
$$(HLIB$(2)_H_$(4))
68+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBSYNTAX_GLOB_$(4)),$$(notdir $$@))
6569

6670
$$(HLIB$(2)_H_$(4))/$(CFG_RUNTIME_$(4)): \
6771
$$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_RUNTIME_$(4)) \
@@ -74,6 +78,7 @@ $$(HLIB$(2)_H_$(4))/$(CFG_STDLIB_$(4)): \
7478
$$(HLIB$(2)_H_$(4))/$(CFG_RUNTIME_$(4)) \
7579
| $$(HLIB$(2)_H_$(4))/
7680
@$$(call E, cp: $$@)
81+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(STDLIB_GLOB_$(4)),$$(notdir $$@))
7782
$$(Q)cp $$< $$@
7883
# Subtle: We do not let the shell expand $(STDLIB_DSYM_GLOB) directly rather
7984
# we use Make's $$(wildcard) facility. The reason is that, on mac, when using
@@ -85,17 +90,20 @@ $$(HLIB$(2)_H_$(4))/$(CFG_STDLIB_$(4)): \
8590
$$(Q)cp -R $$(TLIB$(1)_T_$(4)_H_$(3))/$(STDLIB_GLOB_$(4)) \
8691
$$(wildcard $$(TLIB$(1)_T_$(4)_H_$(3))/$(STDLIB_DSYM_GLOB_$(4))) \
8792
$$(HLIB$(2)_H_$(4))
93+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(STDLIB_GLOB_$(4)),$$(notdir $$@))
8894

8995
$$(HLIB$(2)_H_$(4))/$(CFG_EXTRALIB_$(4)): \
9096
$$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_EXTRALIB_$(4)) \
9197
$$(HLIB$(2)_H_$(4))/$(CFG_STDLIB_$(4)) \
9298
$$(HLIB$(2)_H_$(4))/$(CFG_RUNTIME_$(4)) \
9399
| $$(HLIB$(2)_H_$(4))/
94100
@$$(call E, cp: $$@)
101+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
95102
$$(Q)cp $$< $$@
96103
$$(Q)cp -R $$(TLIB$(1)_T_$(4)_H_$(3))/$(EXTRALIB_GLOB_$(4)) \
97104
$$(wildcard $$(TLIB$(1)_T_$(4)_H_$(3))/$(EXTRALIB_DSYM_GLOB_$(4))) \
98105
$$(HLIB$(2)_H_$(4))
106+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
99107

100108
$$(HLIB$(2)_H_$(4))/libstd.rlib: \
101109
$$(TLIB$(1)_T_$(4)_H_$(3))/libstd.rlib \

mk/install.mk

+64-37
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,48 @@
1212
# For consistency it might be desirable for stageN to be an exact
1313
# mirror of the installation directory structure.
1414

15-
# Installation macro. Call with source directory as arg 1,
16-
# destination directory as arg 2, and filename/libname-glob as arg 3
15+
# Installation macros.
16+
# For INSTALL,
17+
# $(1) is the source dirctory
18+
# $(2) is the destination directory
19+
# $(3) is the filename/libname-glob
1720
ifdef VERBOSE
1821
INSTALL = install -m755 $(1)/$(3) $(2)/$(3)
19-
INSTALL_LIB = install -m644 `ls -drt1 $(1)/$(3) | tail -1` $(2)/
2022
else
2123
INSTALL = $(Q)$(call E, install: $(2)/$(3)) && install -m755 $(1)/$(3) $(2)/$(3)
22-
INSTALL_LIB = $(Q)$(call E, install_lib: $(2)/$(3)) && \
23-
install -m644 `ls -drt1 $(1)/$(3) | tail -1` $(2)/
2424
endif
2525

26+
# For INSTALL_LIB,
27+
# Target-specific $(LIB_SOURCE_DIR) is the source directory
28+
# Target-specific $(LIB_DESTIN_DIR) is the destination directory
29+
# $(1) is the filename/libname-glob
30+
ifdef VERBOSE
31+
DO_INSTALL_LIB = install -m644 `ls -drt1 $(LIB_SOURCE_DIR)/$(1) | tail -1` $(LIB_DESTIN_DIR)/
32+
else
33+
DO_INSTALL_LIB = $(Q)$(call E, install_lib: $(LIB_DESTIN_DIR)/$(1)) && \
34+
install -m644 `ls -drt1 $(LIB_SOURCE_DIR)/$(1) | tail -1` $(LIB_DESTIN_DIR)/
35+
endif
36+
37+
# Target-specific $(LIB_SOURCE_DIR) is the source directory
38+
# Target-specific $(LIB_DESTIN_DIR) is the destination directory
39+
# $(1) is the filename/libname-glob
40+
define INSTALL_LIB
41+
$(if $(filter-out 1,$(words $(wildcard $(LIB_SOURCE_DIR)/$(1)))), \
42+
$(error Aborting install because more than one library matching \
43+
$(1) is present in build tree $(LIB_SOURCE_DIR): \
44+
$(wildcard $(LIB_SOURCE_DIR)/$(1))))
45+
$(Q)LIB_NAME="$(notdir $(lastword $(wildcard $(LIB_SOURCE_DIR)/$(1))))"; \
46+
MATCHES="$(filter-out %$(notdir $(lastword $(wildcard $(LIB_SOURCE_DIR)/$(1)))),\
47+
$(wildcard $(LIB_DESTIN_DIR)/$(1)))"; \
48+
if [ -n "$$MATCHES" ]; then \
49+
echo "Warning, one or libraries matching Rust library '$(1)'" && \
50+
echo " (other than '$$LIB_NAME' itself) already present" && \
51+
echo " at destination $(LIB_DESTIN_DIR):" && \
52+
echo $$MATCHES ; \
53+
fi
54+
$(call DO_INSTALL_LIB,$(1))
55+
endef
56+
2657
# The stage we install from
2758
ISTAGE = 2
2859

@@ -49,38 +80,32 @@ $(foreach target,$(CFG_TARGET_TRIPLES), \
4980
$(eval $(call INSTALL_PREPARE_N,$(target),$(CFG_BUILD_TRIPLE))))
5081

5182
define INSTALL_TARGET_N
83+
install-target-$(1)-host-$(2): LIB_SOURCE_DIR=$$(TL$(1)$(2))
84+
install-target-$(1)-host-$(2): LIB_DESTIN_DIR=$$(PTL$(1)$(2))
5285
install-target-$(1)-host-$(2): $$(TSREQ$$(ISTAGE)_T_$(1)_H_$(2)) $$(SREQ$$(ISTAGE)_T_$(1)_H_$(2))
5386
$$(Q)mkdir -p $$(PTL$(1)$(2))
54-
$$(Q)$$(call INSTALL_LIB,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CFG_RUNTIME_$(1)))
55-
$$(Q)$$(call INSTALL_LIB, \
56-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(STDLIB_GLOB_$(1)))
57-
$$(Q)$$(call INSTALL_LIB, \
58-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(EXTRALIB_GLOB_$(1)))
59-
$$(Q)$$(call INSTALL_LIB,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),libmorestack.a)
87+
$$(Q)$$(call INSTALL_LIB,$$(CFG_RUNTIME_$(1)))
88+
$$(Q)$$(call INSTALL_LIB,$$(STDLIB_GLOB_$(1)))
89+
$$(Q)$$(call INSTALL_LIB,$$(EXTRALIB_GLOB_$(1)))
90+
$$(Q)$$(call INSTALL_LIB,libmorestack.a)
6091

6192
endef
6293

6394
define INSTALL_HOST_N
95+
install-target-$(1)-host-$(2): LIB_SOURCE_DIR=$$(TL$(1)$(2))
96+
install-target-$(1)-host-$(2): LIB_DESTIN_DIR=$$(PTL$(1)$(2))
6497
install-target-$(1)-host-$(2): $$(CSREQ$$(ISTAGE)_T_$(1)_H_$(2))
6598
$$(Q)mkdir -p $$(PTL$(1)$(2))
66-
$$(Q)$$(call INSTALL_LIB,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CFG_RUNTIME_$(1)))
67-
$$(Q)$$(call INSTALL_LIB, \
68-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(STDLIB_GLOB_$(1)))
69-
$$(Q)$$(call INSTALL_LIB, \
70-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(EXTRALIB_GLOB_$(1)))
71-
$$(Q)$$(call INSTALL_LIB, \
72-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBRUSTC_GLOB_$(1)))
73-
$$(Q)$$(call INSTALL_LIB, \
74-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBSYNTAX_GLOB_$(1)))
75-
$$(Q)$$(call INSTALL_LIB, \
76-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBRUSTPKG_GLOB_$(1)))
77-
$$(Q)$$(call INSTALL_LIB, \
78-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBRUSTDOC_GLOB_$(1)))
79-
$$(Q)$$(call INSTALL_LIB, \
80-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBRUSTI_GLOB_$(1)))
81-
$$(Q)$$(call INSTALL_LIB, \
82-
$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(LIBRUST_GLOB_$(1)))
83-
$$(Q)$$(call INSTALL_LIB,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),libmorestack.a)
99+
$$(Q)$$(call INSTALL_LIB,$$(CFG_RUNTIME_$(1)))
100+
$$(Q)$$(call INSTALL_LIB,$$(STDLIB_GLOB_$(1)))
101+
$$(Q)$$(call INSTALL_LIB,$$(EXTRALIB_GLOB_$(1)))
102+
$$(Q)$$(call INSTALL_LIB,$$(LIBRUSTC_GLOB_$(1)))
103+
$$(Q)$$(call INSTALL_LIB,$$(LIBSYNTAX_GLOB_$(1)))
104+
$$(Q)$$(call INSTALL_LIB,$$(LIBRUSTPKG_GLOB_$(1)))
105+
$$(Q)$$(call INSTALL_LIB,$$(LIBRUSTDOC_GLOB_$(1)))
106+
$$(Q)$$(call INSTALL_LIB,$$(LIBRUSTI_GLOB_$(1)))
107+
$$(Q)$$(call INSTALL_LIB,$$(LIBRUST_GLOB_$(1)))
108+
$$(Q)$$(call INSTALL_LIB,libmorestack.a)
84109

85110
endef
86111

@@ -104,6 +129,8 @@ PHB = $(PREFIX_BIN)
104129
# Shorthand for the prefix bin directory
105130
PHL = $(PREFIX_LIB)
106131

132+
install-host: LIB_SOURCE_DIR=$(HL)
133+
install-host: LIB_DESTIN_DIR=$(PHL)
107134
install-host: $(CSREQ$(ISTAGE)_T_$(CFG_BUILD_TRIPLE)_H_$(CFG_BUILD_TRIPLE))
108135
$(Q)mkdir -p $(PREFIX_BIN)
109136
$(Q)mkdir -p $(PREFIX_LIB)
@@ -113,14 +140,14 @@ install-host: $(CSREQ$(ISTAGE)_T_$(CFG_BUILD_TRIPLE)_H_$(CFG_BUILD_TRIPLE))
113140
$(Q)$(call INSTALL,$(HB2),$(PHB),rustdoc$(X_$(CFG_BUILD_TRIPLE)))
114141
$(Q)$(call INSTALL,$(HB2),$(PHB),rusti$(X_$(CFG_BUILD_TRIPLE)))
115142
$(Q)$(call INSTALL,$(HB2),$(PHB),rust$(X_$(CFG_BUILD_TRIPLE)))
116-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(STDLIB_GLOB_$(CFG_BUILD_TRIPLE)))
117-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(EXTRALIB_GLOB_$(CFG_BUILD_TRIPLE)))
118-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBRUSTC_GLOB_$(CFG_BUILD_TRIPLE)))
119-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBSYNTAX_GLOB_$(CFG_BUILD_TRIPLE)))
120-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBRUSTI_GLOB_$(CFG_BUILD_TRIPLE)))
121-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBRUST_GLOB_$(CFG_BUILD_TRIPLE)))
122-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBRUSTPKG_GLOB_$(CFG_BUILD_TRIPLE)))
123-
$(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(LIBRUSTDOC_GLOB_$(CFG_BUILD_TRIPLE)))
143+
$(Q)$(call INSTALL_LIB,$(STDLIB_GLOB_$(CFG_BUILD_TRIPLE)))
144+
$(Q)$(call INSTALL_LIB,$(EXTRALIB_GLOB_$(CFG_BUILD_TRIPLE)))
145+
$(Q)$(call INSTALL_LIB,$(LIBRUSTC_GLOB_$(CFG_BUILD_TRIPLE)))
146+
$(Q)$(call INSTALL_LIB,$(LIBSYNTAX_GLOB_$(CFG_BUILD_TRIPLE)))
147+
$(Q)$(call INSTALL_LIB,$(LIBRUSTI_GLOB_$(CFG_BUILD_TRIPLE)))
148+
$(Q)$(call INSTALL_LIB,$(LIBRUST_GLOB_$(CFG_BUILD_TRIPLE)))
149+
$(Q)$(call INSTALL_LIB,$(LIBRUSTPKG_GLOB_$(CFG_BUILD_TRIPLE)))
150+
$(Q)$(call INSTALL_LIB,$(LIBRUSTDOC_GLOB_$(CFG_BUILD_TRIPLE)))
124151
$(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_RUNTIME_$(CFG_BUILD_TRIPLE)))
125152
$(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_RUSTLLVM_$(CFG_BUILD_TRIPLE)))
126153
$(Q)$(call INSTALL,$(S)/man, \

mk/stage0.mk

+42-13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
# Extract the snapshot host compiler
22

3+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/:
4+
mkdir -p $@
35

6+
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/:
7+
mkdir -p $@
48

59
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)): \
610
$(S)src/snapshots.txt \
7-
$(S)src/etc/get-snapshot.py $(MKFILE_DEPS)
11+
$(S)src/etc/get-snapshot.py $(MKFILE_DEPS) \
12+
| $(HBIN0_H_$(CFG_BUILD_TRIPLE))/
13+
814
@$(call E, fetch: $@)
915
# Note: the variable "SNAPSHOT_FILE" is generally not set, and so
1016
# we generally only pass one argument to this script.
@@ -22,23 +28,28 @@ endif
2228
# Host libs will be extracted by the above rule
2329

2430
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/$(CFG_RUNTIME_$(CFG_BUILD_TRIPLE)): \
25-
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE))
31+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)) \
32+
| $(HLIB0_H_$(CFG_BUILD_TRIPLE))/
2633
$(Q)touch $@
2734

2835
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/$(CFG_STDLIB_$(CFG_BUILD_TRIPLE)): \
29-
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE))
36+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)) \
37+
| $(HLIB0_H_$(CFG_BUILD_TRIPLE))/
3038
$(Q)touch $@
3139

3240
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/$(CFG_EXTRALIB_$(CFG_BUILD_TRIPLE)): \
33-
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE))
41+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)) \
42+
| $(HLIB0_H_$(CFG_BUILD_TRIPLE))/
3443
$(Q)touch $@
3544

3645
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/$(CFG_LIBRUSTC_$(CFG_BUILD_TRIPLE)): \
37-
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE))
46+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)) \
47+
| $(HLIB0_H_$(CFG_BUILD_TRIPLE))/
3848
$(Q)touch $@
3949

4050
$(HLIB0_H_$(CFG_BUILD_TRIPLE))/$(CFG_RUSTLLVM_$(CFG_BUILD_TRIPLE)): \
41-
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE))
51+
$(HBIN0_H_$(CFG_BUILD_TRIPLE))/rustc$(X_$(CFG_BUILD_TRIPLE)) \
52+
| $(HLIB0_H_$(CFG_BUILD_TRIPLE))/
4253
$(Q)touch $@
4354

4455
# For other targets, let the host build the target:
@@ -48,33 +59,51 @@ define BOOTSTRAP_STAGE0
4859
# $(2) stage to bootstrap from
4960
# $(3) target to bootstrap from
5061

51-
$$(HBIN0_H_$(1))/rustc$$(X_$(1)): \
52-
$$(TBIN$(2)_T_$(1)_H_$(3))/rustc$$(X_$(1))
62+
$(HBIN0_H_$(1))/:
63+
mkdir -p $@
64+
65+
$(HLIB0_H_$(1))/:
66+
mkdir -p $@
67+
68+
$$(HBIN0_H_$(1))/rustc$$(X_$(1)): \
69+
$$(TBIN$(2)_T_$(1)_H_$(3))/rustc$$(X_$(1)) \
70+
| $(HBIN0_H_$(1))/
5371
@$$(call E, cp: $$@)
5472
$$(Q)cp $$< $$@
5573

5674
$$(HLIB0_H_$(1))/$(CFG_RUNTIME_$(1)): \
57-
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_RUNTIME_$(1))
75+
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_RUNTIME_$(1)) \
76+
| $(HLIB0_H_$(1))/
5877
@$$(call E, cp: $$@)
5978
$$(Q)cp $$< $$@
6079

6180
$$(HLIB0_H_$(1))/$(CFG_STDLIB_$(1)): \
62-
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_STDLIB_$(1))
81+
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_STDLIB_$(1)) \
82+
| $(HLIB0_H_$(1))/
6383
@$$(call E, cp: $$@)
84+
$$(call CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
6485
$$(Q)cp $$(TLIB$(2)_T_$(1)_H_$(3))/$(STDLIB_GLOB_$(1)) $$@
86+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
6587

6688
$$(HLIB0_H_$(1))/$(CFG_EXTRALIB_$(1)): \
67-
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_EXTRALIB_$(1))
89+
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_EXTRALIB_$(1)) \
90+
| $(HLIB0_H_$(1))/
6891
@$$(call E, cp: $$@)
92+
$$(call CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
6993
$$(Q)cp $$(TLIB$(2)_T_$(1)_H_$(3))/$(EXTRALIB_GLOB_$(1)) $$@
94+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(4)),$$(notdir $$@))
7095

7196
$$(HLIB0_H_$(1))/$(CFG_LIBRUSTC_$(1)): \
72-
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_LIBRUSTC_$(1))
97+
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_LIBRUSTC_$(1)) \
98+
| $(HLIB0_H_$(1))/
7399
@$$(call E, cp: $$@)
100+
$$(call CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(4)),$$(notdir $$@))
74101
$$(Q)cp $$(TLIB$(2)_T_$(1)_H_$(3))/$(LIBRUSTC_GLOB_$(1)) $$@
102+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(4)),$$(notdir $$@))
75103

76104
$$(HLIB0_H_$(1))/$(CFG_RUSTLLVM_$(1)): \
77-
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_RUSTLLVM_$(1))
105+
$$(TLIB$(2)_T_$(1)_H_$(3))/$(CFG_RUSTLLVM_$(1)) \
106+
| $(HLIB0_H_$(1))/
78107
@$$(call E, cp: $$@)
79108
$$(Q)cp $$< $$@
80109

mk/target.mk

+8
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,19 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)): \
4848
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
4949
| $$(TLIB$(1)_T_$(2)_H_$(3))/
5050
@$$(call E, compile_and_link: $$@)
51+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(STDLIB_GLOB_$(2)),$$(notdir $$@))
5152
$$(STAGE$(1)_T_$(2)_H_$(3)) $$(WFLAGS_ST$(1)) -o $$@ $$< && touch $$@
53+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(STDLIB_GLOB_$(2)),$$(notdir $$@))
5254

5355
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2)): \
5456
$$(EXTRALIB_CRATE) $$(EXTRALIB_INPUTS) \
5557
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
5658
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
5759
| $$(TLIB$(1)_T_$(2)_H_$(3))/
5860
@$$(call E, compile_and_link: $$@)
61+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(2)),$$(notdir $$@))
5962
$$(STAGE$(1)_T_$(2)_H_$(3)) $$(WFLAGS_ST$(1)) -o $$@ $$< && touch $$@
63+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(EXTRALIB_GLOB_$(2)),$$(notdir $$@))
6064

6165
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBSYNTAX_$(3)): \
6266
$$(LIBSYNTAX_CRATE) $$(LIBSYNTAX_INPUTS) \
@@ -65,7 +69,9 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBSYNTAX_$(3)): \
6569
$$(TEXTRALIB_DEFAULT$(1)_T_$(2)_H_$(3)) \
6670
| $$(TLIB$(1)_T_$(2)_H_$(3))/
6771
@$$(call E, compile_and_link: $$@)
72+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBSYNTAX_GLOB_$(2)),$$(notdir $$@))
6873
$$(STAGE$(1)_T_$(2)_H_$(3)) $(BORROWCK) -o $$@ $$< && touch $$@
74+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBSYNTAX_GLOB_$(2)),$$(notdir $$@))
6975

7076
# Only build the compiler for host triples
7177
ifneq ($$(findstring $(2),$$(CFG_HOST_TRIPLES)),)
@@ -83,7 +89,9 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(3)): \
8389
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_RUSTLLVM_$(3)) \
8490
| $$(TLIB$(1)_T_$(2)_H_$(3))/
8591
@$$(call E, compile_and_link: $$@)
92+
$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(2)),$$(notdir $$@))
8693
$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< && touch $$@
94+
$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(2)),$$(notdir $$@))
8795

8896
$$(TBIN$(1)_T_$(2)_H_$(3))/rustc$$(X_$(3)): \
8997
$$(DRIVER_CRATE) \

0 commit comments

Comments
 (0)