Skip to content

Commit 7ccf492

Browse files
Jethro BeekmanMark-Simulacrum
Jethro Beekman
authored andcommitted
Package non-rust objects
1 parent 4c906dc commit 7ccf492

File tree

3 files changed

+46
-22
lines changed

3 files changed

+46
-22
lines changed

src/bootstrap/check.rs

+4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ impl Step for Std {
5555
cargo,
5656
args(builder.kind),
5757
&libstd_stamp(builder, compiler, target),
58+
vec![],
5859
true);
5960

6061
let libdir = builder.sysroot_libdir(compiler, target);
@@ -103,6 +104,7 @@ impl Step for Rustc {
103104
cargo,
104105
args(builder.kind),
105106
&librustc_stamp(builder, compiler, target),
107+
vec![],
106108
true);
107109

108110
let libdir = builder.sysroot_libdir(compiler, target);
@@ -155,6 +157,7 @@ impl Step for CodegenBackend {
155157
cargo,
156158
args(builder.kind),
157159
&codegen_backend_stamp(builder, compiler, target, backend),
160+
vec![],
158161
true);
159162
}
160163
}
@@ -199,6 +202,7 @@ impl Step for Rustdoc {
199202
cargo,
200203
args(builder.kind),
201204
&rustdoc_stamp(builder, compiler, target),
205+
vec![],
202206
true);
203207

204208
let libdir = builder.sysroot_libdir(compiler, target);

src/bootstrap/compile.rs

+41-22
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ impl Step for Std {
6969
return;
7070
}
7171

72-
builder.ensure(StartupObjects { compiler, target });
72+
let mut target_deps = builder.ensure(StartupObjects { compiler, target });
7373

7474
let compiler_to_use = builder.compiler_for(compiler.stage, compiler.host, target);
7575
if compiler_to_use != compiler {
@@ -91,7 +91,7 @@ impl Step for Std {
9191
return;
9292
}
9393

94-
copy_third_party_objects(builder, &compiler, target);
94+
target_deps.extend(copy_third_party_objects(builder, &compiler, target).into_iter());
9595

9696
let mut cargo = builder.cargo(compiler, Mode::Std, target, "build");
9797
std_cargo(builder, &compiler, target, &mut cargo);
@@ -102,6 +102,7 @@ impl Step for Std {
102102
cargo,
103103
vec![],
104104
&libstd_stamp(builder, compiler, target),
105+
target_deps,
105106
false);
106107

107108
builder.ensure(StdLink {
@@ -113,29 +114,36 @@ impl Step for Std {
113114
}
114115

115116
/// Copies third pary objects needed by various targets.
116-
fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target: Interned<String>) {
117+
fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target: Interned<String>)
118+
-> Vec<PathBuf>
119+
{
117120
let libdir = builder.sysroot_libdir(*compiler, target);
118121

122+
let mut target_deps = vec![];
123+
124+
let mut copy_and_stamp = |sourcedir: &Path, name: &str| {
125+
let target = libdir.join(name);
126+
builder.copy(
127+
&sourcedir.join(name),
128+
&target,
129+
);
130+
target_deps.push(target);
131+
};
132+
119133
// Copies the crt(1,i,n).o startup objects
120134
//
121135
// Since musl supports fully static linking, we can cross link for it even
122136
// with a glibc-targeting toolchain, given we have the appropriate startup
123137
// files. As those shipped with glibc won't work, copy the ones provided by
124138
// musl so we have them on linux-gnu hosts.
125139
if target.contains("musl") {
140+
let srcdir = builder.musl_root(target).unwrap().join("lib");
126141
for &obj in &["crt1.o", "crti.o", "crtn.o"] {
127-
builder.copy(
128-
&builder.musl_root(target).unwrap().join("lib").join(obj),
129-
&libdir.join(obj),
130-
);
142+
copy_and_stamp(&srcdir, obj);
131143
}
132144
} else if target.ends_with("-wasi") {
133-
for &obj in &["crt1.o"] {
134-
builder.copy(
135-
&builder.wasi_root(target).unwrap().join("lib/wasm32-wasi").join(obj),
136-
&libdir.join(obj),
137-
);
138-
}
145+
let srcdir = builder.wasi_root(target).unwrap().join("lib/wasm32-wasi");
146+
copy_and_stamp(&srcdir, "crt1.o");
139147
}
140148

141149
// Copies libunwind.a compiled to be linked wit x86_64-fortanix-unknown-sgx.
@@ -145,11 +153,11 @@ fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target:
145153
// which is provided by std for this target.
146154
if target == "x86_64-fortanix-unknown-sgx" {
147155
let src_path_env = "X86_FORTANIX_SGX_LIBS";
148-
let obj = "libunwind.a";
149156
let src = env::var(src_path_env).expect(&format!("{} not found in env", src_path_env));
150-
let src = Path::new(&src).join(obj);
151-
builder.copy(&src, &libdir.join(obj));
157+
copy_and_stamp(Path::new(&src), "libunwind.a");
152158
}
159+
160+
target_deps
153161
}
154162

155163
/// Configure cargo to compile the standard library, adding appropriate env vars
@@ -307,7 +315,7 @@ pub struct StartupObjects {
307315
}
308316

309317
impl Step for StartupObjects {
310-
type Output = ();
318+
type Output = Vec<PathBuf>;
311319

312320
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
313321
run.path("src/rtstartup")
@@ -326,13 +334,15 @@ impl Step for StartupObjects {
326334
/// They don't require any library support as they're just plain old object
327335
/// files, so we just use the nightly snapshot compiler to always build them (as
328336
/// no other compilers are guaranteed to be available).
329-
fn run(self, builder: &Builder<'_>) {
337+
fn run(self, builder: &Builder<'_>) -> Vec<PathBuf> {
330338
let for_compiler = self.compiler;
331339
let target = self.target;
332340
if !target.contains("windows-gnu") {
333-
return
341+
return vec![]
334342
}
335343

344+
let mut target_deps = vec![];
345+
336346
let src_dir = &builder.src.join("src/rtstartup");
337347
let dst_dir = &builder.native_dir(target).join("rtstartup");
338348
let sysroot_dir = &builder.sysroot_libdir(for_compiler, target);
@@ -351,16 +361,22 @@ impl Step for StartupObjects {
351361
.arg(src_file));
352362
}
353363

354-
builder.copy(dst_file, &sysroot_dir.join(file.to_string() + ".o"));
364+
let target = sysroot_dir.join(file.to_string() + ".o");
365+
builder.copy(dst_file, &target);
366+
target_deps.push(target);
355367
}
356368

357369
for obj in ["crt2.o", "dllcrt2.o"].iter() {
358370
let src = compiler_file(builder,
359371
builder.cc(target),
360372
target,
361373
obj);
362-
builder.copy(&src, &sysroot_dir.join(obj));
374+
let target = sysroot_dir.join(obj);
375+
builder.copy(&src, &target);
376+
target_deps.push(target);
363377
}
378+
379+
target_deps
364380
}
365381
}
366382

@@ -438,6 +454,7 @@ impl Step for Rustc {
438454
cargo,
439455
vec![],
440456
&librustc_stamp(builder, compiler, target),
457+
vec![],
441458
false);
442459

443460
builder.ensure(RustcLink {
@@ -586,7 +603,7 @@ impl Step for CodegenBackend {
586603

587604
let tmp_stamp = out_dir.join(".tmp.stamp");
588605

589-
let files = run_cargo(builder, cargo, vec![], &tmp_stamp, false);
606+
let files = run_cargo(builder, cargo, vec![], &tmp_stamp, vec![], false);
590607
if builder.config.dry_run {
591608
return;
592609
}
@@ -954,6 +971,7 @@ pub fn run_cargo(builder: &Builder<'_>,
954971
cargo: Cargo,
955972
tail_args: Vec<String>,
956973
stamp: &Path,
974+
additional_target_deps: Vec<PathBuf>,
957975
is_check: bool)
958976
-> Vec<PathBuf>
959977
{
@@ -1070,6 +1088,7 @@ pub fn run_cargo(builder: &Builder<'_>,
10701088
deps.push((path_to_add.into(), false));
10711089
}
10721090

1091+
deps.extend(additional_target_deps.into_iter().map(|d| (d, false)));
10731092
deps.sort();
10741093
let mut new_contents = Vec::new();
10751094
for (dep, proc_macro) in deps.iter() {

src/bootstrap/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,7 @@ impl Build {
11441144
pub fn copy(&self, src: &Path, dst: &Path) {
11451145
if self.config.dry_run { return; }
11461146
self.verbose_than(1, &format!("Copy {:?} to {:?}", src, dst));
1147+
if src == dst { return; }
11471148
let _ = fs::remove_file(&dst);
11481149
let metadata = t!(src.symlink_metadata());
11491150
if metadata.file_type().is_symlink() {

0 commit comments

Comments
 (0)