Skip to content

Commit

Permalink
deduplicate logic shared with build_context::env_args
Browse files Browse the repository at this point in the history
  • Loading branch information
japaric committed Sep 8, 2018
1 parent 6a12aa5 commit 33a6d99
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 27 deletions.
15 changes: 4 additions & 11 deletions src/cargo/core/compiler/build_context/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::env;
use std::path::{Path, PathBuf};
use std::str::{self, FromStr};
use std::str;

use core::profiles::Profiles;
use core::{Dependency, Workspace};
Expand Down Expand Up @@ -393,16 +393,9 @@ fn env_args(
// ...including target.'cfg(...)'.rustflags
if let Some(target_cfg) = target_cfg {
if let Some(table) = config.get_table("target")? {
let cfgs = table.val.keys().filter_map(|t| {
if t.starts_with("cfg(") && t.ends_with(')') {
let cfg = &t[4..t.len() - 1];
CfgExpr::from_str(cfg).ok().and_then(|c| {
if c.matches(target_cfg) {
Some(t)
} else {
None
}
})
let cfgs = table.val.keys().filter_map(|key| {
if CfgExpr::matches_key(key, target_cfg) {
Some(key)
} else {
None
}
Expand Down
26 changes: 10 additions & 16 deletions src/cargo/core/compiler/compilation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use std::collections::{BTreeSet, HashMap, HashSet};
use std::env;
use std::ffi::OsStr;
use std::path::PathBuf;
use std::str::FromStr;

use semver::Version;

Expand Down Expand Up @@ -275,22 +274,17 @@ fn target_runner(bcx: &BuildContext) -> CargoResult<Option<(PathBuf, Vec<String>
if let Some(table) = bcx.config.get_table("target")? {
let mut matching_runner = None;

for t in table.val.keys() {
if t.starts_with("cfg(") && t.ends_with(')') {
let cfg = &t[4..t.len() - 1];
if let Ok(c) = CfgExpr::from_str(cfg) {
if c.matches(target_cfg) {
let key = format!("target.{}.runner", t);
if let Some(runner) = bcx.config.get_path_and_args(&key)? {
// more than one match, error out
if matching_runner.is_some() {
bail!("several matching instances of `target.'cfg(..)'.runner` \
in `.cargo/config`")
}

matching_runner = Some(runner.val);
}
for key in table.val.keys() {
if CfgExpr::matches_key(key, target_cfg) {
let key = format!("target.{}.runner", key);
if let Some(runner) = bcx.config.get_path_and_args(&key)? {
// more than one match, error out
if matching_runner.is_some() {
bail!("several matching instances of `target.'cfg(..)'.runner` \
in `.cargo/config`")
}

matching_runner = Some(runner.val);
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions src/cargo/util/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,17 @@ impl fmt::Display for Cfg {
}

impl CfgExpr {
/// Utility function to check if the key, "cfg(..)" matches the `target_cfg`
pub fn matches_key(key: &str, target_cfg: &[Cfg]) -> bool {
if key.starts_with("cfg(") && key.ends_with(')') {
let cfg = &key[4..key.len() - 1 ];

CfgExpr::from_str(cfg).ok().map(|ce| ce.matches(target_cfg)).unwrap_or(false)
} else {
false
}
}

pub fn matches(&self, cfg: &[Cfg]) -> bool {
match *self {
CfgExpr::Not(ref e) => !e.matches(cfg),
Expand Down

0 comments on commit 33a6d99

Please sign in to comment.