2011-03-15 2 views
1

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?

Répondre

1
  1. Fonctionne pour moi. Qu'obtenez-vous en echo?
  2. Vous devez annuler la condition dans if puis. En ce moment, il se ferme lorsque le fichier ne compile pas et AFAIU vous avez besoin du contraire.
  3. Pourquoi ce n'est pas une bonne idée? Mais vous pouvez écrire un script qui appellera $(CXX) et retournera un code d'erreur correct (0 s'il ne compile pas). Ensuite, vous pouvez avoir des cibles normales avec ce script. Je ne suis pas très bon avec les spécificités de GNU make, c'est probablement possible avec les choses intégrées.

avancée & en option: 1.
nous allons d'abord faire le travail chose :)
2. Personnellement, je ne l'utilise python, donc ne voient pas besoin ici =: P

+0

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

+0

@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. –

+1

@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. –

Questions connexes