J'écris une bibliothèque C ++ et j'utilise déjà un processus CI (intégration continue) pour vous assurer que les fonctionnalités fonctionnent.
La construction est basée sur le filet, de sorte que le script CI détient un test Les bonnes pratiques exigent qu'une mauvaise utilisation de la bibliothèque par code d'utilisateur doit de préférence déclencher une erreur de compilation, au lieu d'une exécution. Erreur de temps. J'ai donc inclus beaucoup de vérification statique. P> Cependant, je tiens à vous assurer dans mon processus de test automatisé que c'est vraiment le cas (que le code d'utilisateur à l'aide de la bibliothèque échouera à tort). P > J'ai donc mis en place un dossier qui détient plusieurs fichiers .CPP, chacun démontrant une utilisation incorrecte de la bibliothèque, chacun d'entre eux ne devrait pas échouer. P> Mon problème est que si j'ajoute un nouveau cible dans mon maquillage pour les construire, il reviendra après la première défaillance. P> Ce que je veux faire est de vous assurer que Tous forts> Ces fichiers échouent et ne renvoient que 0 Ce cas. P> Comment puis-je écrire une cible qui effectue cela? p> Certains code (ne fonctionne pas), cela reviendra après la première défaillance. P> Test code>. Cette cible exécutera les tests automatisés (disons, à l'aide de la capture) et ne construira que si elle réussit.
SRC_FILES := $(wildcard *.cpp)
OBJ_FILES := $(patsubst %.cpp, %.o, $(SRC_FILES))
all: $(OBJ_FILES)
@echo "done"
%.o: %.cpp
$(CXX) -o $@ -c $<
3 Réponses :
Le seul moyen de le faire si vous souhaitez utiliser la même règle de motif, consiste à utiliser et à transmettre le drapeau -k code> (
- continuez code>
), comme ceci: test_compile:
ok=true; \
for src in $(TEST_SRCS); do \
$(CXX) -o $${src%.cpp}.o -c $$src || ok=false; \
done; \
$$ok
Merci de jeter un coup d'œil, je vais vérifier et essayer cela dès que possible.
srcs := fail1.cpp fail2.cpp fail3.cpp failed := ${srcs:.cpp=.failed} PHONY: test test: ${failed} ; : $@ Success ${failed}: %.failed: %.cpp ! gcc blah blah $< -o ${@:.failed=.o} touch $@ What happens here is that when you want to build test, make first tries to build fail1.failed.If the compile succeeds, make fails with an error.OTOH if the compile fails, the output file fail1.failed is created.BTW, make knows that fail1.failed depends on fail1.cpp. If the .failed is newer than the .cpp, the test will not even run. Nice.Same for fail2.failed and fail3.failed. Parallel safe, and if you get your dependencies right, only the tests that need to run get run. The whole point of make really.
Merci de réponse, une approche intéressante, je vais essayer.
Accepter le formulaire de réponse @madscientist, mais pour l'enregistrement, il semble que cela puisse être fait aussi de cette façon: juste en inversant la valeur de retour de la commande shell compile: si un seul fichier réussit , alors faire une sortie immédiatement avec une valeur de retour "erreur". p> p>
Kinda associée: Stackoverflow.com/questions/2188376 Mais cette question demande un code de retour nul si le code d'exécution échoue, pas la construction .