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