[SWIFT] Ninja-Build mit Smart Differential Build

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

Ninja-Build mit Smart Differential Build
Baue Doma1 mit Ant
Baue Growai mit Centos7
Erstellen Sie Java mit Wercker
Bazel mit Alpen bauen
Erstellen Sie GitLab / Mattermost mit DockerForWindows
Erstellen Sie mit Centos7 ein Softether-VPN.
Erstellen einer Docker-Umgebung mit WSL
Erstellen Sie AWS Lambda mit Quarkus
[Einführung] Erstellen Sie MVC mit Scala
Erstellen Sie DynamoDB local mit Docker
Erstellen Sie mit Docker eine lokale Couchbase-Umgebung
Erstellen eines Java-Projekts mit Gradle
Erstellen Sie mit Docker eine Node.js-Umgebung
Erstellen Sie mit Pleiades 4.8 eine Tomcat 8.5-Umgebung
Erstellen Sie eine Webanwendung mit Javalin
Erstellen Sie Java mit Mac vs Code
Erstellen Sie mit Eclipse eine Jooby-Entwicklungsumgebung
Erstellen Sie mit Laradock eine Docker + Laravel-Umgebung