6 Stimmen

Wie testet man ein Makefile auf fehlende Abhängigkeiten?

Gibt es eine Möglichkeit, fehlende Abhängigkeiten zu testen, die beim Kompilieren eines Projekts mit mehreren Jobs (-jN, wobei N > 1) auftreten?

Ich stoße oft auf Pakete, meist Open Source, bei denen der Build-Prozess einwandfrei funktioniert, solange ich -j1 oder -jN, wobei N ein relativ kleiner Wert wie 4 oder 8 ist, verwende. Aber wenn ich höhere Werte wie 48 verwende, etwas ungewöhnlich, beginnt er aufgrund fehlender Abhängigkeiten zu scheitern.

Ich habe versucht, mir selbst ein Bash-Skript zu erstellen, das, ausgehend von einem Ziel, alle Abhängigkeiten ermittelt und versucht, jede dieser Abhängigkeiten explizit mit -j1 zu erstellen, um zu überprüfen, dass keine von ihnen in ihrem eigenen Recht fehlende Abhängigkeiten hat. Es scheint mit kleinen/ mittleren Paketen zu funktionieren, scheitert jedoch bei wichtigeren wie z. B. uClibc.

Ich teile mein Skript hier, da einige Personen möglicherweise durch das Lesen des Codes besser verstehen können, was ich meine. Ich hoffe auch, dass eine robuster Lösung existiert und zurückgeteilt werden kann.

#!/bin/bash
ZIELE=$*
echo "ZIELE=$ZIELE"

für ziel in $ZIELE
do
    MAKE="make"
    REGEL=`make -j1 -n -p | grep "^$ziel:"`
    if [ -z "$REGEL" ]; then
        fortsetzen
    fi

    NEUEZIELE=${REGEL#* }
    if [ -z "$NEUEZIELE" ]; then
        fortsetzen
    fi

    if [ "${NEUEZIELE}" = "${REGEL}" ]; then
        # Blattziel, das wir nicht testen wollen.
        fortsetzen
    fi

    echo "REGEL=$REGEL"
#   echo "NEUEZIELE=$NEUEZIELE"
    $0 $NEUEZIELE
    if [ $? -ne 0 ]; then
        exit 1
    fi

    echo "Teste Ziel $ziel"
    make clean && make -j1 $ziel 
    if [ $? -ne 0 ]; then
        echo "Make-Parallel wird mit Ziel $ziel scheitern"
        exit 1
    fi
done

1voto

Eric Melski Punkte 15572

Ich kenne keine Open-Source-Lösung, aber genau das ist das Problem, das ElectricAccelerator, eine leistungsstarke Implementierung von GNU make, lösen soll. Es führt den Build parallel aus und erkennt und korrigiert dynamisch fehlende Abhängigkeiten, so dass die Build-Ausgabe die gleiche ist, als ob sie seriell ausgeführt worden wäre. Es kann ein annotiertes Build-Protokoll erstellen, das Details zu den fehlenden Abhängigkeiten enthält. Zum Beispiel hat dieses einfache Makefile eine nicht deklarierte Abhängigkeit zwischen abc und def:

all: abc def

abc:
        echo PASS > abc

def:
        cat abc

Führen Sie dies mit emake statt gmake aus und aktivieren Sie --emake-annodetail=history, und die resultierende Annotationsdatei enthält dies:

cat abc
cat abc

PASS

Insbesondere zeigt der -Abschnitt, dass dieser Job, Jf42015c0 (oder besser gesagt, def), vom Job Jf4201588 abhängt, weil letzterer die Datei /tmp/foo/abc geändert hat.

Sie können es kostenlos mit ElectricAccelerator Huddle ausprobieren.

(Haftungsausschluss: Ich bin der Architekt von ElectricAccelerator)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X