Skip to content

Commit ab99baf

Browse files
Merge #1142
1142: Ensure ignored CLI arguments to cross are always passed at the end. r=Emilgardis a=Alexhuszagh Closes #1141. Co-authored-by: Alex Huszagh <ahuszagh@gmail.com>
2 parents 6635e20 + 2ee4d61 commit ab99baf

File tree

3 files changed

+60
-27
lines changed

3 files changed

+60
-27
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"type": "changed",
33
"description": "stop parsing arguments to `cross run` after `--`",
4-
"issues": [1048]
4+
"issues": [1048, 1141]
55
}

src/cli.rs

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use crate::Target;
1010

1111
#[derive(Debug)]
1212
pub struct Args {
13-
pub all: Vec<String>,
13+
pub cargo_args: Vec<String>,
14+
pub rest_args: Vec<String>,
1415
pub subcommand: Option<Subcommand>,
1516
pub channel: Option<String>,
1617
pub target: Option<Target>,
@@ -163,7 +164,8 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
163164
let mut manifest_path: Option<PathBuf> = None;
164165
let mut target_dir = None;
165166
let mut sc = None;
166-
let mut all: Vec<String> = Vec::new();
167+
let mut cargo_args: Vec<String> = Vec::new();
168+
let mut rest_args: Vec<String> = Vec::new();
167169
let mut version = false;
168170
let mut quiet = false;
169171
let mut verbose = 0;
@@ -176,69 +178,98 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
176178
continue;
177179
}
178180
if matches!(arg.as_str(), "--") {
179-
all.push(arg);
180-
all.extend(args.by_ref());
181+
rest_args.push(arg);
182+
rest_args.extend(args.by_ref());
181183
} else if let v @ 1.. = is_verbose(arg.as_str()) {
182184
verbose += v;
183-
all.push(arg);
185+
cargo_args.push(arg);
184186
} else if matches!(arg.as_str(), "--version" | "-V") {
185187
version = true;
186188
} else if matches!(arg.as_str(), "--quiet" | "-q") {
187189
quiet = true;
188-
all.push(arg);
190+
cargo_args.push(arg);
189191
} else if let Some(kind) = is_value_arg(&arg, "--color") {
190192
color = match kind {
191193
ArgKind::Next => {
192-
match parse_next_arg(arg, &mut all, str_to_owned, identity, &mut args)? {
194+
match parse_next_arg(
195+
arg,
196+
&mut cargo_args,
197+
str_to_owned,
198+
identity,
199+
&mut args,
200+
)? {
193201
Some(c) => Some(c),
194202
None => shell::invalid_color(None),
195203
}
196204
}
197-
ArgKind::Equal => Some(parse_equal_arg(arg, &mut all, str_to_owned, identity)?),
205+
ArgKind::Equal => Some(parse_equal_arg(
206+
arg,
207+
&mut cargo_args,
208+
str_to_owned,
209+
identity,
210+
)?),
198211
};
199212
} else if let Some(kind) = is_value_arg(&arg, "--manifest-path") {
200213
manifest_path = match kind {
201214
ArgKind::Next => parse_next_arg(
202215
arg,
203-
&mut all,
216+
&mut cargo_args,
204217
parse_manifest_path,
205218
store_manifest_path,
206219
&mut args,
207220
)?
208221
.flatten(),
209-
ArgKind::Equal => {
210-
parse_equal_arg(arg, &mut all, parse_manifest_path, store_manifest_path)?
211-
}
222+
ArgKind::Equal => parse_equal_arg(
223+
arg,
224+
&mut cargo_args,
225+
parse_manifest_path,
226+
store_manifest_path,
227+
)?,
212228
};
213229
} else if let ("+", ch) = arg.split_at(1) {
214230
channel = Some(ch.to_owned());
215231
} else if let Some(kind) = is_value_arg(&arg, "--target") {
216232
let parse_target = |t: &str| Ok(Target::from(t, target_list));
217233
target = match kind {
218234
ArgKind::Next => {
219-
parse_next_arg(arg, &mut all, parse_target, identity, &mut args)?
235+
parse_next_arg(arg, &mut cargo_args, parse_target, identity, &mut args)?
220236
}
221-
ArgKind::Equal => Some(parse_equal_arg(arg, &mut all, parse_target, identity)?),
237+
ArgKind::Equal => Some(parse_equal_arg(
238+
arg,
239+
&mut cargo_args,
240+
parse_target,
241+
identity,
242+
)?),
222243
};
223244
} else if let Some(kind) = is_value_arg(&arg, "--features") {
224245
match kind {
225246
ArgKind::Next => {
226-
let next =
227-
parse_next_arg(arg, &mut all, str_to_owned, identity, &mut args)?;
247+
let next = parse_next_arg(
248+
arg,
249+
&mut cargo_args,
250+
str_to_owned,
251+
identity,
252+
&mut args,
253+
)?;
228254
if let Some(feature) = next {
229255
features.push(feature);
230256
}
231257
}
232258
ArgKind::Equal => {
233-
features.push(parse_equal_arg(arg, &mut all, str_to_owned, identity)?);
259+
features.push(parse_equal_arg(
260+
arg,
261+
&mut cargo_args,
262+
str_to_owned,
263+
identity,
264+
)?);
234265
}
235266
}
236267
} else if let Some(kind) = is_value_arg(&arg, "--target-dir") {
237268
match kind {
238269
ArgKind::Next => {
239270
target_dir = parse_next_arg(
240271
arg,
241-
&mut all,
272+
&mut cargo_args,
242273
parse_target_dir,
243274
store_target_dir,
244275
&mut args,
@@ -247,7 +278,7 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
247278
ArgKind::Equal => {
248279
target_dir = Some(parse_equal_arg(
249280
arg,
250-
&mut all,
281+
&mut cargo_args,
251282
parse_target_dir,
252283
store_target_dir,
253284
)?);
@@ -258,13 +289,14 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
258289
sc = Some(Subcommand::from(arg.as_ref()));
259290
}
260291

261-
all.push(arg.clone());
292+
cargo_args.push(arg.clone());
262293
}
263294
}
264295
}
265296

266297
Ok(Args {
267-
all,
298+
cargo_args,
299+
rest_args,
268300
subcommand: sc,
269301
channel,
270302
target,

src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ To override the toolchain mounted in the image, set `target.{}.image.toolchain =
649649
.map_or(false, |s| !s.needs_target_in_command())
650650
{
651651
let mut filtered_args = Vec::new();
652-
let mut args_iter = args.all.clone().into_iter();
652+
let mut args_iter = args.cargo_args.clone().into_iter();
653653
while let Some(arg) = args_iter.next() {
654654
if arg == "--target" {
655655
args_iter.next();
@@ -661,14 +661,14 @@ To override the toolchain mounted in the image, set `target.{}.image.toolchain =
661661
}
662662
filtered_args
663663
// Make sure --target is present
664-
} else if !args.all.iter().any(|a| a.starts_with("--target")) {
665-
let mut args_with_target = args.all.clone();
664+
} else if !args.cargo_args.iter().any(|a| a.starts_with("--target")) {
665+
let mut args_with_target = args.cargo_args.clone();
666666
args_with_target.push("--target".to_owned());
667667
args_with_target.push(add_libc(target.triple()));
668668
args_with_target
669669
} else if zig_version.is_some() {
670670
let mut filtered_args = Vec::new();
671-
let mut args_iter = args.all.clone().into_iter();
671+
let mut args_iter = args.cargo_args.clone().into_iter();
672672
while let Some(arg) = args_iter.next() {
673673
if arg == "--target" {
674674
filtered_args.push("--target".to_owned());
@@ -683,7 +683,7 @@ To override the toolchain mounted in the image, set `target.{}.image.toolchain =
683683
}
684684
filtered_args
685685
} else {
686-
args.all.clone()
686+
args.cargo_args.clone()
687687
};
688688

689689
let is_test = args.subcommand.map_or(false, |sc| sc == Subcommand::Test);
@@ -693,6 +693,7 @@ To override the toolchain mounted in the image, set `target.{}.image.toolchain =
693693
if uses_build_std {
694694
filtered_args.push("-Zbuild-std".to_owned());
695695
}
696+
filtered_args.extend(args.rest_args.iter().cloned());
696697

697698
let needs_docker = args
698699
.subcommand

0 commit comments

Comments
 (0)