Loading executor.cpp +25 −15 Changes for executor.cpp: 25 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -612,26 +612,36 @@ int Executor::execute_rule(const std::string& target, const Rule* rule, bool ignore_error = false; bool force_exec = false; for (size_t i = 0; i < rule->recipes.size(); ++i) { for (size_t r_idx = 0; r_idx < rule->recipes.size(); ++r_idx) { std::string expanded = parser_.expand_with_automatic( rule->recipes[i], *mfp, target, first_prereq, prereqs, newer, stem, &order_only); // Jede einzelne Zeile des Rezepts auf Präfixe (@, -, +) prüfen und diese entfernen, // damit auch in mehrzeiligen if/then/fi-Blöcken kein "@if" entsteht. rule->recipes[r_idx], *mfp, target, first_prereq, prereqs, newer, stem, &order_only); // Ein Rezept kann intern selbst Zeilenumbrüche enthalten (z. B. durch Makros). // Wir müssen zeilenweise (split by \n) durchgehen und bei *jeder* Zeile // die Präfixe (@, -, +) am Zeilenanfang entfernen! std::string line_accum; std::stringstream ss(expanded); std::string single_line; bool first_subline = (r_idx == 0); while (std::getline(ss, single_line)) { // Führende Leerzeichen/Tabs für das Parsen des Präfix überspringen size_t start = 0; while (start < expanded.size()) { if (expanded[start] == '@') { is_silent = true; start++; } else if (expanded[start] == '-') { ignore_error = true; start++; } else if (expanded[start] == '+') { force_exec = true; start++; } else if (expanded[start] == ' ' || expanded[start] == '\t') { start++; } while (start < single_line.size()) { if (single_line[start] == '@') { if (first_subline) is_silent = true; start++; } else if (single_link_has_dash: single_line[start] == '-') { start++; } // ignore_error falls gewünscht else if (single_line[start] == '+') { force_exec = true; start++; } else if (single_line[start] == ' ' || single_line[start] == '\t') { start++; } else break; } expanded = expanded.substr(start); if (expanded.empty()) continue; std::string cleaned_line = single_line.substr(start); if (i > 0) full_recipe += "\n"; full_recipe += expanded; if (!full_recipe.empty() || !line_accum.empty()) { full_recipe += "\n"; } full_recipe += cleaned_line; first_subline = false; } } if (full_recipe.empty()) return 0; Loading Loading
executor.cpp +25 −15 Changes for executor.cpp: 25 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -612,26 +612,36 @@ int Executor::execute_rule(const std::string& target, const Rule* rule, bool ignore_error = false; bool force_exec = false; for (size_t i = 0; i < rule->recipes.size(); ++i) { for (size_t r_idx = 0; r_idx < rule->recipes.size(); ++r_idx) { std::string expanded = parser_.expand_with_automatic( rule->recipes[i], *mfp, target, first_prereq, prereqs, newer, stem, &order_only); // Jede einzelne Zeile des Rezepts auf Präfixe (@, -, +) prüfen und diese entfernen, // damit auch in mehrzeiligen if/then/fi-Blöcken kein "@if" entsteht. rule->recipes[r_idx], *mfp, target, first_prereq, prereqs, newer, stem, &order_only); // Ein Rezept kann intern selbst Zeilenumbrüche enthalten (z. B. durch Makros). // Wir müssen zeilenweise (split by \n) durchgehen und bei *jeder* Zeile // die Präfixe (@, -, +) am Zeilenanfang entfernen! std::string line_accum; std::stringstream ss(expanded); std::string single_line; bool first_subline = (r_idx == 0); while (std::getline(ss, single_line)) { // Führende Leerzeichen/Tabs für das Parsen des Präfix überspringen size_t start = 0; while (start < expanded.size()) { if (expanded[start] == '@') { is_silent = true; start++; } else if (expanded[start] == '-') { ignore_error = true; start++; } else if (expanded[start] == '+') { force_exec = true; start++; } else if (expanded[start] == ' ' || expanded[start] == '\t') { start++; } while (start < single_line.size()) { if (single_line[start] == '@') { if (first_subline) is_silent = true; start++; } else if (single_link_has_dash: single_line[start] == '-') { start++; } // ignore_error falls gewünscht else if (single_line[start] == '+') { force_exec = true; start++; } else if (single_line[start] == ' ' || single_line[start] == '\t') { start++; } else break; } expanded = expanded.substr(start); if (expanded.empty()) continue; std::string cleaned_line = single_line.substr(start); if (i > 0) full_recipe += "\n"; full_recipe += expanded; if (!full_recipe.empty() || !line_accum.empty()) { full_recipe += "\n"; } full_recipe += cleaned_line; first_subline = false; } } if (full_recipe.empty()) return 0; Loading