From 4c4c06228eaf9a709fb2e87f75501d2242345ed2 Mon Sep 17 00:00:00 2001 From: q66 Date: Sun, 22 Apr 2018 23:06:31 +0200 Subject: [PATCH] collect all deps during rlist resolution --- ostd/build/make.hh | 71 +++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/ostd/build/make.hh b/ostd/build/make.hh index fd0b71c..aa4b7f2 100644 --- a/ostd/build/make.hh +++ b/ostd/build/make.hh @@ -60,7 +60,7 @@ struct make_error: std::runtime_error { namespace detail { static bool check_exec( - string_range tname, std::vector const &deps + string_range tname, std::vector const &deps ) { if (!fs::exists(tname)) { return true; @@ -215,16 +215,12 @@ private: struct make_task { make_task() = delete; make_task( - string_range target, std::vector deps, make_rule &rl + string_range target, std::vector deps, make_rule &rl ) { p_coro = std::make_unique>( - [target, deps = std::move(deps), &rl](auto) { - std::vector rdeps; - for (auto &s: deps) { - rdeps.push_back(s); - } + [target, deps = std::move(deps), &rl](auto) mutable { rl.call(target, iterator_range( - rdeps.data(), rdeps.data() + rdeps.size() + deps.data(), deps.data() + deps.size() )); } ); @@ -289,8 +285,8 @@ struct make { } private: - struct rule_inst { + std::vector deps; string_range sub; make_rule *rule; }; @@ -356,36 +352,16 @@ private: } } - void exec_deps( - std::vector const &rlist, std::vector &rdeps, - string_range tname - ) { - std::string repd; - for (auto &sr: rlist) { - for (auto &target: sr.rule->depends()) { - string_range atgt = ostd::iter(target); - repd.clear(); - auto lp = ostd::find(atgt, '%'); - if (!lp.empty()) { - repd.append(atgt.slice(0, &lp[0] - &atgt[0])); - repd.append(sr.sub); - ++lp; - if (!lp.empty()) { - repd.append(lp); - } - atgt = ostd::iter(repd); - } - rdeps.push_back(std::string{atgt}); - exec_rule(atgt, tname); - } - } - } - void exec_rlist(string_range tname, std::vector const &rlist) { - std::vector rdeps; - if ((rlist.size() > 1) || !rlist[0].rule->depends().empty()) { + std::vector rdeps; + if ((rlist.size() > 1) || !rlist[0].deps.empty()) { wait_for([&rlist, &rdeps, &tname, this]() { - exec_deps(rlist, rdeps, tname); + for (auto &sr: rlist) { + for (auto &tgt: sr.deps) { + rdeps.push_back(tgt); + exec_rule(tgt, tname); + } + } }); } make_rule *rl = nullptr; @@ -432,7 +408,12 @@ private: for (auto &rule: p_rules) { if (target == string_range{rule.target()}) { rlist.emplace_back(); - rlist.back().rule = &rule; + rule_inst &sr = rlist.back(); + sr.rule = &rule; + sr.deps.reserve(rule.depends().size()); + for (auto &d: rule.depends()) { + sr.deps.push_back(d); + } if (rule.has_body()) { if (frule && exact) { throw make_error{"redefinition of rule '%s'", target}; @@ -456,6 +437,20 @@ private: rule_inst &sr = rlist.back(); sr.rule = &rule; sr.sub = sub; + sr.deps.reserve(rule.depends().size()); + for (auto &d: rule.depends()) { + string_range dp = d; + auto lp = ostd::find(dp, '%'); + if (!lp.empty()) { + auto repd = std::string{dp.slice(0, &lp[0] - &dp[0])}; + repd.append(sub); + lp.pop_front(); + repd.append(lp); + sr.deps.push_back(std::move(repd)); + } else { + sr.deps.push_back(d); + } + } if (frule) { if (sub.size() == frule->sub.size()) { throw make_error{"redefinition of rule '%s'", target};