Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cfg to always treat target as host #123

Merged
merged 2 commits into from
Aug 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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