Skip to content

Commit

Permalink
Auto merge of #3157 - japaric:target-rustflags, r=alexcrichton
Browse files Browse the repository at this point in the history
add support for per-target rustflags in .cargo/config

you can now specify rustflags on a per-target basis in .cargo/config:

``` toml
[target.x86_64-unknown-linux-gnu]
rustflags = ["x86", "specific", "flags"]

[target.arm-unknown-linux-gnueabi]
rustflags = ["arm", "specific", "flags"]
```

If both build.rustflags and target.*.rustflags are specified, the
target.* ones will be used.

As before RUSTFLAGS overrides either set.

closes #3153

r? @alexcrichton I've only added a smoke test and a precedence test. Let me know if I should add more tests!
  • Loading branch information
bors authored Oct 5, 2016
2 parents fe0a4a7 + ef727b7 commit 85df188
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/cargo/ops/cargo_rustc/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -775,8 +775,16 @@ fn env_args(config: &Config,
return Ok(args.collect());
}

// Then the build.rustflags value
let name = name.chars().flat_map(|c| c.to_lowercase()).collect::<String>();
// Then the target.*.rustflags value
let target = build_config.requested_target.as_ref().unwrap_or(&build_config.host_triple);
let key = format!("target.{}.{}", target, name);
if let Some(args) = try!(config.get_list(&key)) {
let args = args.val.into_iter().map(|a| a.0);
return Ok(args.collect());
}

// Then the build.rustflags value
let key = format!("build.{}", name);
if let Some(args) = try!(config.get_list(&key)) {
let args = args.val.into_iter().map(|a| a.0);
Expand Down
3 changes: 3 additions & 0 deletions src/doc/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ linker = ".."
# Similar to the above linker configuration, but this only applies to
# when the `$triple` is being compiled for.
linker = ".."
# custom flags to pass to all compiler invocations that target $triple
# this value overrides build.rustflags when both are present
rustflags = ["..", ".."]

# Configuration keys related to the registry
[registry]
Expand Down
71 changes: 71 additions & 0 deletions tests/rustflags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -878,3 +878,74 @@ fn build_rustflags_with_home_config() {
assert_that(p.cargo("build").arg("-v"),
execs().with_status(0));
}

#[test]
fn target_rustflags_normal_source() {
let p = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
version = "0.0.1"
"#)
.file("src/lib.rs", "")
.file("src/bin/a.rs", "fn main() {}")
.file("examples/b.rs", "fn main() {}")
.file("tests/c.rs", "#[test] fn f() { }")
.file("benches/d.rs", r#"
#![feature(test)]
extern crate test;
#[bench] fn run1(_ben: &mut test::Bencher) { }"#)
.file(".cargo/config", &format!("
[target.{}]
rustflags = [\"-Z\", \"bogus\"]
", rustc_host()));
p.build();

assert_that(p.cargo("build")
.arg("--lib"),
execs().with_status(101));
assert_that(p.cargo("build")
.arg("--bin=a"),
execs().with_status(101));
assert_that(p.cargo("build")
.arg("--example=b"),
execs().with_status(101));
assert_that(p.cargo("test"),
execs().with_status(101));
assert_that(p.cargo("bench"),
execs().with_status(101));
}

// target.{}.rustflags takes precedence over build.rustflags
#[test]
fn target_rustflags_precedence() {
let p = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
version = "0.0.1"
"#)
.file("src/lib.rs", "")
.file(".cargo/config", &format!("
[build]
rustflags = [\"--cfg\", \"foo\"]
[target.{}]
rustflags = [\"-Z\", \"bogus\"]
", rustc_host()));
p.build();

assert_that(p.cargo("build")
.arg("--lib"),
execs().with_status(101));
assert_that(p.cargo("build")
.arg("--bin=a"),
execs().with_status(101));
assert_that(p.cargo("build")
.arg("--example=b"),
execs().with_status(101));
assert_that(p.cargo("test"),
execs().with_status(101));
assert_that(p.cargo("bench"),
execs().with_status(101));
}

0 comments on commit 85df188

Please sign in to comment.