pass real target to dependency callbacks

master
Daniel Kolesa 2018-05-02 21:00:37 +02:00
parent 3673438e8c
commit 08e8dc3f19
2 changed files with 7 additions and 5 deletions

View File

@ -76,7 +76,7 @@ struct make_rule {
void(string_range, iterator_range<string_range *>) void(string_range, iterator_range<string_range *>)
>; >;
using depend_func = std::function< using depend_func = std::function<
void(decltype(appender<std::vector<std::string>>()) &) void(string_range, decltype(appender<std::vector<std::string>>()) &)
>; >;
make_rule() = delete; make_rule() = delete;
@ -133,11 +133,13 @@ struct make_rule {
return p_cond(target); return p_cond(target);
} }
void depends(std::function<void(string_range)> body) const { void depends(
string_range tgt, std::function<void(string_range)> body
) const {
auto app = appender<std::vector<std::string>>(); auto app = appender<std::vector<std::string>>();
for (auto &f: p_deps) { for (auto &f: p_deps) {
app.clear(); app.clear();
f(app); f(tgt, app);
for (auto &s: app.get()) { for (auto &s: app.get()) {
body(s); body(s);
} }
@ -167,7 +169,7 @@ private:
template<typename R> template<typename R>
void add_depend(R &&v) { void add_depend(R &&v) {
if constexpr (std::is_constructible_v<std::string, R const &>) { if constexpr (std::is_constructible_v<std::string, R const &>) {
p_deps.push_back([s = std::string{v}](auto &app) { p_deps.push_back([s = std::string{v}](auto, auto &app) {
app.put(std::move(s)); app.put(std::move(s));
}); });
} else if constexpr(std::is_constructible_v<depend_func, R &&>) { } else if constexpr(std::is_constructible_v<depend_func, R &&>) {

View File

@ -185,7 +185,7 @@ void make::find_rules(string_range target, std::vector<rule_inst> &rlist) {
rlist.emplace_back(); rlist.emplace_back();
rule_inst &sr = rlist.back(); rule_inst &sr = rlist.back();
sr.rule = &rule; sr.rule = &rule;
rule.depends([&sr, &tgt](string_range d) { rule.depends(target, [&sr, &tgt](string_range d) {
sr.deps.push_back(tgt.replace(d)); sr.deps.push_back(tgt.replace(d));
}); });
if (!rule.has_body()) { if (!rule.has_body()) {