Hallo. Vor kurzem habe ich mich einem Projekt von Android / iOS SDK angeschlossen, das in C-Sprache geschrieben wurde, und ich mache verschiedene Versuche und Fehler bezüglich der Automatisierung von Build und Unit-Test.
Anfangs habe ich viel mit Makefile gemacht, aber ich habe versucht, ein Build-Tool namens Ninja-Build zu verwenden, das ich zuvor ausprobieren wollte, und ich werde es teilen, weil es unerwartet praktisch war. Es wurde auch verwendet, um [apple / swift] zu erstellen (https://github.com/apple/swift), so dass es unter C- und C ++ - Leuten berühmt sein kann. Es ist Open Source und scheint in C ++ implementiert zu sein. https://ninja-build.org https://github.com/ninja-build/ninja
$ brew install ninja
$ ninja --version
1.7.1
Beispiel: Das Build-Skript wurde wie folgt in Makefile geschrieben.
obj=clang -c -g
app=clang
add:
$(obj) add.c
addapp: add
$(obj) addapp.c -o addapp.o
main: addapp add
$(app) addapp.o add.o -o main
Selbst wenn ich add.c neu schreibe, erkennt der Hauptjob den Unterschied nicht. (* Ergänzung: [Dies war nur ein Fehler beim Schreiben des Makefiles. Sie können auch mit Makefile einen differenziellen Build erstellen!](# Comment-78827f4ccd5b44133347))
c $ make main
clang -c -g add.c -o add.o
clang -c -g addapp.c -o addapp.o
clang addapp.o add.o -o main
c $ make main
make: `main' is up to date.
c $ echo "// hello" >> add.c
c $ make main
make: `main' is up to date.
Sie können das Differential-Build-Problem leicht lösen, indem Sie die Abhängigkeiten in Ninja-Build beschreiben.
build.ninja
rule obj
command=clang -c -g $in -o $out
rule app
command=clang $in -o $out
build addapp.o: obj addapp.c
build add.o: obj add.c
build main: app addapp.o add.o
default main
c $ ninja -v
[1/3] clang -c -g add.c -o add.o
[2/3] clang -c -g addapp.c -o addapp.o
[3/3] clang addapp.o add.o -o main
c $ ninja -v
ninja: no work to do.
c $ echo "// hello" >> add.c
c $ ninja -v
[1/2] clang -c -g add.c -o add.o
[2/2] clang addapp.o add.o -o main
Ich habe nur add.c umgeschrieben, also habe ich addapp.o so belassen, wie es ist. Die Syntax ist einfach und die Ausgabe ist leicht zu verstehen.
Ich möchte, dass Sie sich beim Schreiben auf das Dokument und die Referenzseite beziehen. Da das Verzeichnis jedoch als Ziel für die Differenzerkennung ($ in) angegeben werden kann, kann es meiner Meinung nach für große Projekte verwendet werden.
Da es nicht möglich ist, schwierige Dinge wie das Lesen von Umgebungsvariablen auszuführen, müssen Sie im tatsächlichen Betrieb ein separates Skript schreiben, das die Datei build.ninja ausgibt und den Befehl ninja ausführt.
ninja = ninja -v
build-hoge:
./createbuildninja.sh hoge
$(ninja)
build-fuga:
./createbuildninja.sh fuga
$(ninja)
Abgesehen davon hat Xcode 8 die Leistung von LLVM erheblich verbessert und unterstützt komplexe Differential-Builds. war. Ich möchte auch in Zukunft verschiedene Dinge überprüfen.
Referenz: http://bigoyayubi.hatenablog.com/entry/2015/08/02/222909 http://mattn.kaoriya.net/software/ninja/20140121141906.htm
Recommended Posts