[SWIFT] Construction ninja avec construction différentielle intelligente

Bonjour. Récemment, j'ai rejoint un projet de SDK Android / iOS écrit en langage C, et je fais divers essais et erreurs sur l'automatisation de la construction et des tests unitaires.

Au début, je faisais beaucoup avec Makefile, mais j'ai essayé d'utiliser un outil de construction appelé ninja-build que je voulais essayer auparavant, et je vais le partager parce que c'était pratique de manière inattendue. Il a également été utilisé pour construire apple / swift, donc il est peut-être célèbre parmi les personnes C et C ++. Il est open source et semble être implémenté en C ++. https://ninja-build.org https://github.com/ninja-build/ninja

$ brew install ninja
$ ninja --version
1.7.1

Par exemple, le script de construction écrit comme suit dans Makefile.

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

Même si je réécris add.c, le travail principal ne détecte pas la différence. (* Ajout: [Ce n'était qu'une erreur d'écriture du Makefile. Vous pouvez également faire une compilation différentielle avec Makefile!](# 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.

Vous pouvez facilement résoudre le problème de construction différentielle en décrivant les dépendances dans ninja-build.

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

J'ai seulement réécrit add.c, donc j'ai laissé addapp.o tel quel. La syntaxe est simple et la sortie est facile à comprendre.

Je voudrais que vous vous référiez au document et au site de référence pour savoir comment l'écrire, mais comme le répertoire peut être spécifié comme cible de la détection de différence ($ in), je pense qu'il peut être utilisé pour de grands projets.

Comme il n'est pas possible de faire des choses difficiles comme la lecture des variables d'environnement, je pense qu'en fonctionnement réel, vous devrez écrire un script séparé qui génère le fichier build.ninja et exécute la commande ninja.

ninja = ninja -v

build-hoge:
    ./createbuildninja.sh hoge
    $(ninja)

build-fuga:
    ./createbuildninja.sh fuga
    $(ninja)

En passant, Xcode 8 a considérablement amélioré les performances de LLVM et prend en charge les constructions différentielles complexes. était. J'aimerais continuer à vérifier diverses choses à l'avenir.

référence: http://bigoyayubi.hatenablog.com/entry/2015/08/02/222909 http://mattn.kaoriya.net/software/ninja/20140121141906.htm

Recommended Posts

Construction ninja avec construction différentielle intelligente
Construire Doma1 avec Ant
Construisez Growai avec Centos7
Construire Java avec Wercker
Construisez bazel avec alpin
Construire GitLab / Mattermost avec DockerForWindows
Créez un VPN softether avec Centos7.
Créer un environnement Docker avec WSL
Créez AWS Lambda avec Quarkus
[Introduction] Construire MVC avec Scala
Construire DynamoDB local avec Docker
Créer un environnement local Couchbase avec Docker
Construire un projet Java avec Gradle
Créer un environnement Node.js avec Docker
Créer un environnement Tomcat 8.5 avec Pleiades 4.8
Créer une application Web avec Javalin
Construire Java avec Mac vs Code
Créer un environnement de développement Jooby avec Eclipse
Créez un environnement Docker + Laravel avec Laradock