Move logic for test output generation forward

By performing this logic very late in the build process, it ended up leading to
bugs like those found in #10973 where certain stages of the build process
expected a particular output format which didn't end up being the case. In order
to fix this, the build output generation is moved very early in the build
process to the absolute first thing in phase 2.

Closes #10973
This commit is contained in:
Alex Crichton 2013-12-14 23:11:13 -08:00
parent f73c9c9bbc
commit 6ebacf2fd7
4 changed files with 16 additions and 11 deletions

View file

@ -722,17 +722,10 @@ pub fn link_binary(sess: Session,
obj_filename: &Path,
out_filename: &Path,
lm: &LinkMeta) -> ~[Path] {
// If we're generating a test executable, then ignore all other output
// styles at all other locations
let outputs = if sess.opts.test {
~[session::OutputExecutable]
} else {
(*sess.outputs).clone()
};
let mut out_filenames = ~[];
for output in outputs.move_iter() {
let out_file = link_binary_output(sess, trans, output, obj_filename, out_filename, lm);
for &output in sess.outputs.iter() {
let out_file = link_binary_output(sess, trans, output, obj_filename,
out_filename, lm);
out_filenames.push(out_file);
}

View file

@ -405,13 +405,13 @@ pub fn expect<T:Clone>(sess: Session, opt: Option<T>, msg: || -> ~str) -> T {
}
pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
if options.test { return false }
for output in options.outputs.iter() {
match *output {
OutputExecutable => {}
OutputStaticlib | OutputDylib | OutputRlib => return true
}
}
if options.test { return false }
match syntax::attr::first_attr_value_str_by_name(crate.attrs, "crate_type") {
Some(s) => "lib" == s || "rlib" == s || "dylib" == s || "staticlib" == s,
_ => false
@ -419,6 +419,11 @@ pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
}
pub fn collect_outputs(options: &options, crate: &ast::Crate) -> ~[OutputStyle] {
// If we're generating a test executable, then ignore all other output
// styles at all other locations
if options.test {
return ~[OutputExecutable];
}
let mut base = options.outputs.clone();
let mut iter = crate.attrs.iter().filter_map(|a| {
if "crate_type" == a.name() {

View file

@ -0,0 +1,7 @@
# Regression test for issue #10973
-include ../tools.mk
all:
$(RUSTC) --rlib --test foo.rs
rm $(TMPDIR)/foo.bc && exit 1 || exit 0