mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 23:34:47 -05:00
build: fix rust temp file conflicts during parallel build
This commit is contained in:
parent
dfcde3e1ee
commit
224cfc8c74
3 changed files with 36 additions and 7 deletions
|
@ -306,12 +306,6 @@ before_build:
|
|||
Set-FilesNeeded -Auto -Path $outputs -Reason "Build dependency graph"
|
||||
|
||||
build_script:
|
||||
# Attempt to work around multiple rustc instances messing with the same file
|
||||
# when building in parallel.
|
||||
# TODO: fix this properly.
|
||||
- ps: ninja -C $env:DENO_BUILD_PATH -j 1
|
||||
build_extra/rust:winapi build_extra/rust:winapi-0.2
|
||||
|
||||
- python tools\build.py
|
||||
- ps: Set-FilesNeeded -Auto -Reason "Build finished"
|
||||
|
||||
|
|
14
build_extra/rust/get_version_hash.py
Normal file
14
build_extra/rust/get_version_hash.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Copyright 2018 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
# This script computes the sha256sum of the first command line argument, and
|
||||
# writes a few hex digits of it to stdout. It is used by rust.gni to derive a
|
||||
# unique string (without dots/special characters) from a crate version number.
|
||||
|
||||
from hashlib import sha256
|
||||
import sys
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
raise Exception('Expected exactly one argument.')
|
||||
|
||||
hash = sha256(sys.argv[1]).hexdigest()
|
||||
sys.stdout.write(hash[0:8])
|
|
@ -118,9 +118,30 @@ template("run_rustc") {
|
|||
]
|
||||
|
||||
if (defined(crate_version)) {
|
||||
# Compute the sha256sum of the version number. See comments below.
|
||||
# Note that we do this only if there are multiple versions of this crate.
|
||||
hash =
|
||||
exec_script("get_version_hash.py", [ crate_version ], "trim string")
|
||||
|
||||
args += [
|
||||
# In our build setup, all crates are built in the same directory. The
|
||||
# actual build outputs have unique names (e.g. 'foo-1.2.3.rlib'), but
|
||||
# rustc also creates many temp files (e.g. 'foo.crate.metadata.rcgu.bc',
|
||||
# 'foo.foo0.rcgu.o'), and with those files, name collisions do occur.
|
||||
# This causes random failures during parallel builds and on CI.
|
||||
#
|
||||
# These name conflicts can be avoided by setting `-C extra-filename=` to
|
||||
# some unique value. Unfortunately the version number as such can't be
|
||||
# used: everything after the first dot (.) is thrown away, so winapi-0.2
|
||||
# vs. winapi-0.3 would still have conflicts -- so we use a hash instead.
|
||||
"-C",
|
||||
"metadata=$crate_version",
|
||||
"extra-filename=$hash",
|
||||
|
||||
# Rustc blows up if a target (directly or indirectly) depends on two+
|
||||
# crates that have the same name *and* the same metadata. So we use the
|
||||
# hash to give 'metadata' a unique value too (any unique value will do).
|
||||
"-C",
|
||||
"metadata=$hash",
|
||||
]
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue