simplify rule matching
parent
11a366f469
commit
c61dcb9597
|
@ -49,6 +49,9 @@ static string_range match_pattern(
|
||||||
auto rep = ostd::find(toexpand, '%');
|
auto rep = ostd::find(toexpand, '%');
|
||||||
/* no subst found */
|
/* no subst found */
|
||||||
if (rep.empty()) {
|
if (rep.empty()) {
|
||||||
|
if (expanded == toexpand) {
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
/* get the part before % */
|
/* get the part before % */
|
||||||
|
@ -135,52 +138,32 @@ void make::find_rules(string_range target, std::vector<rule_inst> &rlist) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rule_inst *frule = nullptr;
|
rule_inst *frule = nullptr;
|
||||||
bool exact = false;
|
|
||||||
string_range prev_sub{};
|
string_range prev_sub{};
|
||||||
for (auto &rule: p_rules) {
|
for (auto &rule: p_rules) {
|
||||||
if (target == string_range{rule.target()}) {
|
|
||||||
rlist.emplace_back();
|
|
||||||
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};
|
|
||||||
}
|
|
||||||
if (!frule) {
|
|
||||||
frule = &rlist.back();
|
|
||||||
} else {
|
|
||||||
*frule = rlist.back();
|
|
||||||
rlist.pop_back();
|
|
||||||
}
|
|
||||||
exact = true;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (exact || !rule.has_body()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
string_range sub = match_pattern(target, rule.target());
|
string_range sub = match_pattern(target, rule.target());
|
||||||
if (!sub.empty()) {
|
if (!sub.empty()) {
|
||||||
rlist.emplace_back();
|
rlist.emplace_back();
|
||||||
rule_inst &sr = rlist.back();
|
rule_inst &sr = rlist.back();
|
||||||
sr.rule = &rule;
|
sr.rule = &rule;
|
||||||
sr.deps.reserve(rule.depends().size());
|
sr.deps.reserve(rule.depends().size());
|
||||||
|
bool ematch = (sub.size() == target.size());
|
||||||
for (auto &d: rule.depends()) {
|
for (auto &d: rule.depends()) {
|
||||||
string_range dp = d;
|
string_range dp = d;
|
||||||
auto lp = ostd::find(dp, '%');
|
if (!ematch) {
|
||||||
if (!lp.empty()) {
|
auto lp = ostd::find(dp, '%');
|
||||||
auto repd = std::string{dp.slice(0, &lp[0] - &dp[0])};
|
if (!lp.empty()) {
|
||||||
repd.append(sub);
|
auto repd = std::string{dp.slice(0, &lp[0] - &dp[0])};
|
||||||
lp.pop_front();
|
repd.append(sub);
|
||||||
repd.append(lp);
|
lp.pop_front();
|
||||||
sr.deps.push_back(std::move(repd));
|
repd.append(lp);
|
||||||
} else {
|
sr.deps.push_back(std::move(repd));
|
||||||
sr.deps.push_back(d);
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
sr.deps.push_back(d);
|
||||||
|
}
|
||||||
|
if (!rule.has_body() && !ematch) {
|
||||||
|
throw make_error{"pattern rule '%s' needs a body", target};
|
||||||
}
|
}
|
||||||
if (frule) {
|
if (frule) {
|
||||||
if (sub.size() == prev_sub.size()) {
|
if (sub.size() == prev_sub.size()) {
|
||||||
|
|
Loading…
Reference in New Issue