-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rustc: More stable hashes of command line arguments
Currently rustc isn't always the best at producing deterministic builds of a crate when the source directory of a crate is changed. This is happening due to what appears two different sources: * First the `-L` paths passed to rustc are hashed into the crate hash. These paths through Cargo are typically absolute paths that can vary if the build directory changes. * Next the paths passed to `--extern` are also hashed which like `-L` can change if the build directory changes. This commit fixes these two sources of nondeterminism by ensuring that avoiding tracking the hashes of these arguments on the command line. For `-L` paths they're either related to loading crates (whose hashes are tracked elsewhere) or native librarise used in the linking phase (which isn't incremental). The `--extern` paths are similar in that they're related to crate resolution which is already tracked independently of the command line arguments. Closes #48019
- Loading branch information
1 parent
a85417f
commit 2e9d9d4
Showing
3 changed files
with
71 additions
and
130 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,78 @@ | ||
-include ../tools.mk | ||
all: | ||
all: \ | ||
smoke \ | ||
debug \ | ||
opt \ | ||
link_paths \ | ||
remap_paths \ | ||
different_source_dirs \ | ||
extern_flags | ||
|
||
smoke: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build1" | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build2" | ||
$(B2) | ||
nm "$(TMPDIR)/reproducible-build1" | sort > "$(TMPDIR)/reproducible-build1.nm" | ||
nm "$(TMPDIR)/reproducible-build2" | sort > "$(TMPDIR)/reproducible-build2.nm" | ||
cmp "$(TMPDIR)/reproducible-build1.nm" "$(TMPDIR)/reproducible-build2.nm" || exit 1 | ||
|
||
debug: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs -g | ||
$(RUSTC) reproducible-build.rs -g -o"$(TMPDIR)/reproducible-build1-debug" | ||
$(RUSTC) reproducible-build.rs -g -o"$(TMPDIR)/reproducible-build2-debug" | ||
nm "$(TMPDIR)/reproducible-build1-debug" | sort > "$(TMPDIR)/reproducible-build1-debug.nm" | ||
nm "$(TMPDIR)/reproducible-build2-debug" | sort > "$(TMPDIR)/reproducible-build2-debug.nm" | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build1" -g | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build2" -g | ||
nm "$(TMPDIR)/reproducible-build1" | sort > "$(TMPDIR)/reproducible-build1-debug.nm" | ||
nm "$(TMPDIR)/reproducible-build2" | sort > "$(TMPDIR)/reproducible-build2-debug.nm" | ||
cmp "$(TMPDIR)/reproducible-build1-debug.nm" "$(TMPDIR)/reproducible-build2-debug.nm" || exit 1 | ||
|
||
opt: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs -O | ||
$(RUSTC) reproducible-build.rs -O -o"$(TMPDIR)/reproducible-build1-opt" | ||
$(RUSTC) reproducible-build.rs -O -o"$(TMPDIR)/reproducible-build2-opt" | ||
nm "$(TMPDIR)/reproducible-build1-opt" | sort > "$(TMPDIR)/reproducible-build1-opt.nm" | ||
nm "$(TMPDIR)/reproducible-build2-opt" | sort > "$(TMPDIR)/reproducible-build2-opt.nm" | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build1" -O | ||
$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build2" -O | ||
nm "$(TMPDIR)/reproducible-build1" | sort > "$(TMPDIR)/reproducible-build1-opt.nm" | ||
nm "$(TMPDIR)/reproducible-build2" | sort > "$(TMPDIR)/reproducible-build2-opt.nm" | ||
cmp "$(TMPDIR)/reproducible-build1-opt.nm" "$(TMPDIR)/reproducible-build2-opt.nm" || exit 1 | ||
|
||
link_paths: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs | ||
$(RUSTC) reproducible-build.rs --crate-type rlib -L /b | ||
cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib | ||
$(RUSTC) reproducible-build.rs --crate-type rlib -L /a | ||
cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1 | ||
|
||
remap_paths: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs | ||
$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=/a=/c | ||
cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib | ||
$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=/b=/c | ||
cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1 | ||
|
||
different_source_dirs: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs | ||
mkdir $(TMPDIR)/test | ||
cp reproducible-build.rs $(TMPDIR)/test | ||
$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=$$PWD=/b | ||
cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib | ||
(cd $(TMPDIR)/test && $(RUSTC) reproducible-build.rs \ | ||
--remap-path-prefix=$(TMPDIR)/test=/b \ | ||
--crate-type rlib) | ||
cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1 | ||
|
||
extern_flags: | ||
rm -rf $(TMPDIR) && mkdir $(TMPDIR) | ||
$(RUSTC) reproducible-build-aux.rs | ||
$(RUSTC) reproducible-build.rs \ | ||
--extern reproducible_build_aux=$(TMPDIR)/libreproducible_build_aux.rlib \ | ||
--crate-type rlib | ||
cp $(TMPDIR)/libreproducible_build_aux.rlib $(TMPDIR)/libbar.rlib | ||
cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib | ||
$(RUSTC) reproducible-build.rs \ | ||
--extern reproducible_build_aux=$(TMPDIR)/libbar.rlib \ | ||
--crate-type rlib | ||
cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters