J'ai une collection d'exemples que je veux assurez-vous qu'ils ne parviennent pas à compiler. Quel est le meilleur moyen d'y parvenir avec un * GNU Makefile?Makefile Gnu, compile devrait échouer
test_nocompile: $(NOCOMPILE_CPP)
for cpp in $(NOCOMPILE_CPP) ; do \
echo === $$cpp === ; \
if $(CXX) $(CXXFLAGS) -c -o fail.o $$cpp ; then echo ok ; else exit 1; fi ; \
done
Comme vous pouvez le voir, j'ai plusieurs difficultés ici:
- la coquille Accès pour la variable
cpp
:$cpp
,\$cpp
et$$cpp
les deux ne fonctionnent pas. - Même avec mon
if
, le make s'arrête après l'échec de la première compilation g ++. Mais c'est exactement ce que je veux. Je veux échouer à g ++ - compiler pour être considéré comme le comportement correct. - Shell-pour-boucles dans Makefiles ne sont pas la meilleure idée. Y a-t-il un meilleur moyen? Je ne peux pas penser à un, parce que je m'attends à ce que les compiles échouent, je n'ai pas une bonne cible, non?
avancée et en option:
- Si je pouvais avoir le fail-vérifier ci-dessus travail, je pourrais essayer une deuxième passe de la compilation, cette fois avec un
-DEXCLUDE_FAIL
supplémentaire qui sort la ligne fautive de mes exemples, et le code devrait compiler. Une idée? - ou devrait écrire un script Python pour cela ...? ;-)
Edit:
Je pense que mon "avancé et en option" m'a donné une très bonne idée en ce moment. Je pourrais utiliser à nouveau la vérification des dépendances. Juste un croquis approximatif ici:
NOCOMPILE_CPP := $(wildcard nocompile/ *.cpp)
NOCOMPILE_XFAILS := $(addsuffix .xfail,$(basename $(NOCOMPILE_CPP)))
%.xfail: %.cpp
if $(CXX) $(CXXFLAGS) -o [email protected] $< ; then exit 1 ; else echo OK ; fi
$(CXX) $(CXXFLAGS) -DEXCLUDE_FAILCODE -o [email protected] $<
test_nocompile: $(NOCOMPILE_XFAILS)
Est-ce élégant? Ensuite, je dois seulement travailler comment -DEXCLUDE_FAILCODE
peut faire fonctionner les tests défaillants .... Non-trivial, mais faisable. Je pense que cela pourrait le faire, non?
Ahhh! Oui, je l'ai mal corrigé avant. Bien sûr, c'est le si. Prrrrr ... * Je pensais qu'avec l'option "avancée" je pourrais avoir les cibles-vérifications de faire fonctionner à nouveau * ... Attendez, je vais éditer la question ... – towi
@towi: Mais comme pour le '-DEXCLUDE_FAIL 'C'est facile à faire dans le script.Vérifiez d'abord s'il ne compile pas, quittez si c'est le cas. Ensuite, vérifiez la compilation avec define. Le code de retour du script doit être le code de retour de cette commande, c'est ce dont vous avez besoin. –
@towi: Pourquoi pas $ (NOCOMPILE_CPP: .cpp = .xfail) '? Vous pouvez également considérer '! $ (CXX) ', il doit annuler le résultat et quitter automatiquement quand vous en avez besoin → pas besoin de si. –