From 4c8b39d97346751552c2916e60823942ceae0228 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Tue, 28 Feb 2017 20:13:21 +0200 Subject: [PATCH] rustbuild: sort rules by the order of matching CLI paths. --- src/bootstrap/step.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/bootstrap/step.rs b/src/bootstrap/step.rs index 01431c50ed76..af99eea3ffb3 100644 --- a/src/bootstrap/step.rs +++ b/src/bootstrap/step.rs @@ -985,6 +985,8 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd? // 2. Next, we determine which rules we're actually executing. If a // number of path filters were specified on the command line we look // for those, otherwise we look for anything tagged `default`. + // Here we also compute the priority of each rule based on how early + // in the command line the matching path filter showed up. // // 3. Finally, we generate some steps with host and target information. // @@ -1015,11 +1017,22 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd? Subcommand::Clean => panic!(), }; - self.rules.values().filter(|rule| rule.kind == kind).filter(|rule| { - (paths.len() == 0 && rule.default) || paths.iter().any(|path| { - path.ends_with(rule.path) - }) - }).flat_map(|rule| { + let mut rules: Vec<_> = self.rules.values().filter_map(|rule| { + if rule.kind != kind { + return None; + } + + if paths.len() == 0 && rule.default { + Some((rule, 0)) + } else { + paths.iter().position(|path| path.ends_with(rule.path)) + .map(|priority| (rule, priority)) + } + }).collect(); + + rules.sort_by_key(|&(_, priority)| priority); + + rules.into_iter().flat_map(|(rule, _)| { let hosts = if rule.only_host_build || rule.only_build { &self.build.config.host[..1] } else if self.build.flags.host.len() > 0 {