Skip to content

Commit

Permalink
Merge pull request #123 from taiki-e/target
Browse files Browse the repository at this point in the history
Add cfg to always treat target as host
  • Loading branch information
dtolnay authored Aug 15, 2021
2 parents 0b33c0b + 48db84d commit 09aba1f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 29 deletions.
31 changes: 2 additions & 29 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,12 @@ use std::path::Path;

fn main() -> io::Result<()> {
let out_dir = env::var_os("OUT_DIR").unwrap();
let mut target = env::var("TARGET").ok();

// When --target flag is passed, cargo does not pass RUSTFLAGS to rustc when
// building proc-macro and build script even if the host and target triples
// are the same. Therefore, if we always pass --target to cargo, tools such
// as coverage that require RUSTFLAGS do not work for tests run by trybuild.
//
// To avoid that problem, do not pass --target to cargo if we know that it
// has not been passed.
//
// Cargo does not have a way to tell the build script whether --target has
// been passed or not, so we use the following heuristic:
//
// - The host and target triples are the same.
// - And RUSTFLAGS is available when *building* the build script.
//
// Note that the second is when building, not when running. This is due to:
//
// - After rust-lang/cargo#9601, cargo does not pass RUSTFLAGS to the build
// script when running.
// - CARGO_ENCODED_RUSTFLAGS, which was introduced in rust-lang/cargo#9601,
// cannot be used for this purpose because it contains the value of
// RUSTFLAGS even if --target is passed and the host and target triples
// are the same.
if target == env::var("HOST").ok() && option_env!("RUSTFLAGS").is_some() {
target = None;
}

let target = env::var("TARGET").ok();
let path = Path::new(&out_dir).join("target.rs");
let value = match target {
Some(target) => format!(r#"Some("{}")"#, target.escape_debug()),
None => "None".to_owned(),
};
let content = format!("const TARGET: Option<&'static str> = {};", value);
let content = format!("const TARGET: Option<&str> = {};", value);
fs::write(path, content)
}
16 changes: 16 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,22 @@ mod normalize;
mod run;
mod rustflags;

// When --target flag is passed, cargo does not pass RUSTFLAGS to rustc when
// building proc-macro and build script even if the host and target triples are
// the same. Therefore, if we always pass --target to cargo, tools such as
// coverage that require RUSTFLAGS do not work for tests run by trybuild.
//
// To avoid that problem, do not pass --target to cargo if we know that it has
// not been passed.
//
// Currently, cargo does not have a way to tell the build script whether
// --target has been passed or not, and there is no heuristic that can handle
// this well.
//
// Therefore, expose a cfg to always treat the target as host.
#[cfg(trybuild_no_target)]
const TARGET: Option<&str> = None;
#[cfg(not(trybuild_no_target))]
include!(concat!(env!("OUT_DIR"), "/target.rs"));

use std::cell::RefCell;
Expand Down

0 comments on commit 09aba1f

Please sign in to comment.