Commit 82a9a7d6 authored by jan.koester's avatar jan.koester
Browse files

gnu func ext

parent 4b1478d7
Loading
Loading
Loading
Loading
+25 −15
Changes for executor.cpp: 25 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -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;