Skip to content

Commit

Permalink
test: Verify all sysroot crates are unstable
Browse files Browse the repository at this point in the history
As we continue to add more crates to the compiler and use them to implement
various features we want to be sure we're not accidentally expanding the API
surface area of the compiler! To that end this commit adds a new `run-make` test
which will attempt to `extern crate foo` all crates in the sysroot, verifying
that they're all unstable.

This commit discovered that the `std_shim` and `test_shim` crates were
accidentally stable and fixes the situation by deleting those shims. The shims
are no longer necessary due to changes in Cargo that have happened since they
were originally incepted.
  • Loading branch information
alexcrichton committed Feb 21, 2017
1 parent 536a900 commit 40aaa65
Show file tree
Hide file tree
Showing 14 changed files with 71 additions and 158 deletions.
15 changes: 0 additions & 15 deletions src/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
members = [
"bootstrap",
"rustc",
"rustc/std_shim",
"rustc/test_shim",
"libstd",
"libtest",
"tools/cargotest",
"tools/compiletest",
"tools/error_index_generator",
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,8 @@ build/
The current build is unfortunately not quite as simple as `cargo build` in a
directory, but rather the compiler is split into three different Cargo projects:

* `src/rustc/std_shim` - a project which builds and compiles libstd
* `src/rustc/test_shim` - a project which builds and compiles libtest
* `src/libstd` - the standard library
* `src/libtest` - testing support, depends on libstd
* `src/rustc` - the actual compiler itself

Each "project" has a corresponding Cargo.lock file with all dependencies, and
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,10 +346,10 @@ pub fn krate(build: &Build,
krate: Option<&str>) {
let (name, path, features, root) = match mode {
Mode::Libstd => {
("libstd", "src/rustc/std_shim", build.std_features(), "std_shim")
("libstd", "src/libstd", build.std_features(), "std")
}
Mode::Libtest => {
("libtest", "src/rustc/test_shim", String::new(), "test_shim")
("libtest", "src/libtest", String::new(), "test")
}
Mode::Librustc => {
("librustc", "src/rustc", build.rustc_features(), "rustc-main")
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ pub fn std(build: &Build, target: &str, compiler: &Compiler) {
}
cargo.arg("--features").arg(features)
.arg("--manifest-path")
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"));
.arg(build.src.join("src/libstd/Cargo.toml"));

if let Some(target) = build.config.target_config.get(target) {
if let Some(ref jemalloc) = target.jemalloc {
Expand Down Expand Up @@ -162,7 +162,7 @@ pub fn test(build: &Build, target: &str, compiler: &Compiler) {
build.clear_if_dirty(&out_dir, &libstd_stamp(build, compiler, target));
let mut cargo = build.cargo(compiler, Mode::Libtest, target, "build");
cargo.arg("--manifest-path")
.arg(build.src.join("src/rustc/test_shim/Cargo.toml"));
.arg(build.src.join("src/libtest/Cargo.toml"));
build.run(&mut cargo);
update_mtime(build, &libtest_stamp(build, compiler, target));
}
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ pub fn std(build: &Build, stage: u32, target: &str) {

let mut cargo = build.cargo(&compiler, Mode::Libstd, target, "doc");
cargo.arg("--manifest-path")
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"))
.arg(build.src.join("src/libstd/Cargo.toml"))
.arg("--features").arg(build.std_features());

// We don't want to build docs for internal std dependencies unless
Expand Down Expand Up @@ -198,7 +198,7 @@ pub fn test(build: &Build, stage: u32, target: &str) {

let mut cargo = build.cargo(&compiler, Mode::Libtest, target, "doc");
cargo.arg("--manifest-path")
.arg(build.src.join("src/rustc/test_shim/Cargo.toml"));
.arg(build.src.join("src/libtest/Cargo.toml"));
build.run(&mut cargo);
cp_r(&out_dir, &out)
}
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ struct ResolveNode {
}

pub fn build(build: &mut Build) {
build_krate(build, "src/rustc/std_shim");
build_krate(build, "src/rustc/test_shim");
build_krate(build, "src/libstd");
build_krate(build, "src/libtest");
build_krate(build, "src/rustc");
}

Expand Down
50 changes: 25 additions & 25 deletions src/bootstrap/step.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,14 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
crate_rule(build,
&mut rules,
"libstd-link",
"build-crate-std_shim",
"build-crate-std",
compile::std_link)
.dep(|s| s.name("startup-objects"))
.dep(|s| s.name("create-sysroot").target(s.host));
crate_rule(build,
&mut rules,
"libtest-link",
"build-crate-test_shim",
"build-crate-test",
compile::test_link)
.dep(|s| s.name("libstd-link"));
crate_rule(build,
Expand All @@ -263,13 +263,13 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
compile::rustc_link)
.dep(|s| s.name("libtest-link"));

for (krate, path, _default) in krates("std_shim") {
for (krate, path, _default) in krates("std") {
rules.build(&krate.build_step, path)
.dep(|s| s.name("startup-objects"))
.dep(move |s| s.name("rustc").host(&build.config.build).target(s.host))
.run(move |s| compile::std(build, s.target, &s.compiler()));
}
for (krate, path, _default) in krates("test_shim") {
for (krate, path, _default) in krates("test") {
rules.build(&krate.build_step, path)
.dep(|s| s.name("libstd-link"))
.run(move |s| compile::test(build, s.target, &s.compiler()));
Expand Down Expand Up @@ -384,7 +384,7 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
"pretty", "run-fail-fulldeps");
}

for (krate, path, _default) in krates("std_shim") {
for (krate, path, _default) in krates("std") {
rules.test(&krate.test_step, path)
.dep(|s| s.name("libtest"))
.dep(|s| s.name("emulator-copy-libs"))
Expand All @@ -400,7 +400,7 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
Mode::Libstd, TestKind::Test, None));

// std benchmarks
for (krate, path, _default) in krates("std_shim") {
for (krate, path, _default) in krates("std") {
rules.bench(&krate.bench_step, path)
.dep(|s| s.name("libtest"))
.dep(|s| s.name("emulator-copy-libs"))
Expand All @@ -415,7 +415,7 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
.run(move |s| check::krate(build, &s.compiler(), s.target,
Mode::Libstd, TestKind::Bench, None));

for (krate, path, _default) in krates("test_shim") {
for (krate, path, _default) in krates("test") {
rules.test(&krate.test_step, path)
.dep(|s| s.name("libtest"))
.dep(|s| s.name("emulator-copy-libs"))
Expand Down Expand Up @@ -583,13 +583,13 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
.default(build.config.docs)
.host(true)
.run(move |s| doc::error_index(build, s.target));
for (krate, path, default) in krates("std_shim") {
for (krate, path, default) in krates("std") {
rules.doc(&krate.doc_step, path)
.dep(|s| s.name("libstd-link"))
.default(default && build.config.docs)
.run(move |s| doc::std(build, s.stage, s.target));
}
for (krate, path, default) in krates("test_shim") {
for (krate, path, default) in krates("test") {
rules.doc(&krate.doc_step, path)
.dep(|s| s.name("libtest-link"))
.default(default && build.config.compiler_docs)
Expand Down Expand Up @@ -1154,23 +1154,23 @@ mod tests {

let mut build = Build::new(flags, config);
let cwd = env::current_dir().unwrap();
build.crates.insert("std_shim".to_string(), ::Crate {
name: "std_shim".to_string(),
build.crates.insert("std".to_string(), ::Crate {
name: "std".to_string(),
deps: Vec::new(),
path: cwd.join("src/std_shim"),
doc_step: "doc-std_shim".to_string(),
build_step: "build-crate-std_shim".to_string(),
test_step: "test-std_shim".to_string(),
bench_step: "bench-std_shim".to_string(),
path: cwd.join("src/std"),
doc_step: "doc-std".to_string(),
build_step: "build-crate-std".to_string(),
test_step: "test-std".to_string(),
bench_step: "bench-std".to_string(),
});
build.crates.insert("test_shim".to_string(), ::Crate {
name: "test_shim".to_string(),
build.crates.insert("test".to_string(), ::Crate {
name: "test".to_string(),
deps: Vec::new(),
path: cwd.join("src/test_shim"),
doc_step: "doc-test_shim".to_string(),
build_step: "build-crate-test_shim".to_string(),
test_step: "test-test_shim".to_string(),
bench_step: "bench-test_shim".to_string(),
path: cwd.join("src/test"),
doc_step: "doc-test".to_string(),
build_step: "build-crate-test".to_string(),
test_step: "test-test".to_string(),
bench_step: "bench-test".to_string(),
});
build.crates.insert("rustc-main".to_string(), ::Crate {
name: "rustc-main".to_string(),
Expand Down Expand Up @@ -1360,7 +1360,7 @@ mod tests {
let all = rules.expand(&plan);
println!("all rules: {:#?}", all);
assert!(!all.contains(&step.name("rustc")));
assert!(!all.contains(&step.name("build-crate-std_shim").stage(1)));
assert!(!all.contains(&step.name("build-crate-std").stage(1)));

// all stage0 compiles should be for the build target, A
for step in all.iter().filter(|s| s.stage == 0) {
Expand Down Expand Up @@ -1425,7 +1425,7 @@ mod tests {

assert!(!plan.iter().any(|s| s.name.contains("rustc")));
assert!(plan.iter().all(|s| {
!s.name.contains("test_shim") || s.target == "C"
!s.name.contains("test") || s.target == "C"
}));
}

Expand Down
12 changes: 0 additions & 12 deletions src/liballoc_jemalloc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,18 +122,6 @@ mod imp {
let flags = align_to_flags(align);
unsafe { nallocx(size as size_t, flags) as usize }
}

// These symbols are used by jemalloc on android but the really old android
// we're building on doesn't have them defined, so just make sure the symbols
// are available.
#[no_mangle]
#[cfg(all(target_os = "android", not(cargobuild)))]
pub extern "C" fn pthread_atfork(_prefork: *mut u8,
_postfork_parent: *mut u8,
_postfork_child: *mut u8)
-> i32 {
0
}
}

#[cfg(dummy_jemalloc)]
Expand Down
46 changes: 0 additions & 46 deletions src/rustc/std_shim/Cargo.toml

This file was deleted.

17 changes: 0 additions & 17 deletions src/rustc/std_shim/lib.rs

This file was deleted.

16 changes: 0 additions & 16 deletions src/rustc/test_shim/Cargo.toml

This file was deleted.

15 changes: 0 additions & 15 deletions src/rustc/test_shim/lib.rs

This file was deleted.

34 changes: 34 additions & 0 deletions src/test/run-make/sysroot-crates-are-unstable/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
-include ../tools.mk

# This is a whitelist of crates which are stable, we don't check for the
# instability of these crates as they're all stable!
STABLE_CRATES := \
std \
core \
proc_macro \
rsbegin.o \
rsend.o \
dllcrt2.o \
crt2.o

# Generate a list of all crates in the sysroot. To do this we list all files in
# rustc's sysroot, look at the filename, strip everything after the `-`, and
# strip the leading `lib` (if present)
SYSROOT := $(shell $(RUSTC) --print sysroot)
LIBS := $(wildcard $(SYSROOT)/lib/rustlib/$(TARGET)/lib/*)
LIBS := $(foreach lib,$(LIBS),$(notdir $(lib)))
LIBS := $(foreach lib,$(LIBS),$(word 1,$(subst -, ,$(lib))))
LIBS := $(foreach lib,$(LIBS),$(patsubst lib%,%,$(lib)))
LIBS := $(filter-out $(STABLE_CRATES),$(LIBS))

all: $(foreach lib,$(LIBS),check-crate-$(lib)-is-unstable)

check-crate-%-is-unstable:
@echo verifying $* is an unstable crate
@echo 'extern crate $*;' | \
$(RUSTC) - --crate-type rlib 2>&1 | cat > $(TMPDIR)/$*; \
true
@grep -q 'use of unstable library feature' $(TMPDIR)/$* || \
(echo crate $* is not unstable && \
cat $(TMPDIR)/$* && \
false)

0 comments on commit 40aaa65

Please sign in to comment.