Mon projet C STRT> utilise des directives de préprocesseur pour activer / désactiver certaines fonctionnalités. Il n'est pas inhabituel de trouver certaines des configurations les moins courantes ne compilez plus en raison d'une modification apportée il y a quelques jours dans un Nous utilisons un script pour compiler les configurations les plus courantes, mais je cherche un outil pour vous assurer que tout est compilé (le test n'est pas un problème dans notre cas, nous voulons simplement détecter l'ASAP rien n'arrête de compiler). Habituellement, IFDEFS / IFNDEFS sont indépendants, donc normalement, chaque module doit être compilé à deux reprises (tous les symboles définis, tous non définis). Mais parfois, les IFDEFS sont imbriqués, ces modules doivent donc être compilés plus de fois. P>
Connaissez-vous de tout outil pour rechercher TOUS IFDEF / IFNDEF (également imbriqué) et donne combien de fois un module doit être compilé (avec l'ensemble de symboles de préprocesseur à définir dans chacun) pour assurer chaque source. La ligne de code est analysée par le compilateur? P> #Ifdef code>. P>
8 Réponses :
Peut-être que vous avez besoin de grep? p>
grep code> ne sera pas capable d'analyser quelles combinaisons d'option sont nécessaires pour obtenir une couverture complète sans avoir à essayer toutes les combinaisons.
Je ne suis au courant d'aucun outil de faire ce que vous voulez faire. Mais en regardant votre problème, je pense que tout ce dont vous avez besoin est un script qui compilera la source avec toutes les combinaisons les em> des symboles de préprocesseur. Comme si vous avez. P> #ifdef A
CallFnA();
#ifdef B
CallFnB();
#endif
CallFnC();
#endif
C'est exactement la bonne façon de le faire, et je l'ai mis en place dans ma réponse.
Je suis d'accord. L'OP peut avoir des défis intéressants cependant - le nombre de combinaisons possibles peut croître très rapidement et tous ne sont pas nécessairement valables. Cela va impliquer beaucoup de temps de compilation!
Merci pour le script, je viens de l'utiliser pour découvrir tous les noms de symboles utilisés dans le code et a fonctionné super. Cependant, il n'est pas pratique de compiler toutes les combinaisons car comme vous dites qu'ils grandissent très rapidement. Et ce n'est ni requis, à l'exception des IFDEF non imbriqués, et votre script shell ne peut pas filtrer ceux imbriqués.
hm, j'ai initialement pensé que Unifdef pourrait être utile, mais cherche plus loin ce que vous 'RE Demander, non, cela ne serait d'aucune aide immédiate. P>
Vous pouvez utiliser Hudson avec un Projet Matrix . (Notez que Hudson n'est pas simplement un outil de test Java, mais un serveur de construction très flexible pouvant construire à peu près n'importe quoi, y compris les projets C / C ++). Si vous configurez un projet matriciel, vous avez la possibilité de créer un ou plusieurs os=windows,linux,osx
wordsize=32,64
J'ai examiné le projet Hudson et Matrix et je ne vois aucune pertinence d'un cadre de test Java à un problème C #Ifdef. Veuillez expliquer pourquoi cela est pertinent pour la # IFDEF.
Désolé, je n'étais pas très clair. Je vais clarifier dans la question.
Merci pour la pointe, mais mon problème n'est pas l'outil utilisé pour la compilation de toutes les configurations (notre script simple est assez bon), mais découvrez quelles combinaisons de symboles de préprocesseur que je dois construire pour que chaque ligne de code soit compilée.
Une autre solution consiste à compiler dans toutes les fonctionnalités et à effectuer des tests de configuration d'exécution pour les fonctionnalités. Ceci est une "astuce" cool car elle permet de commercialiser différentes configurations et de sauvegarder le temps d'ingénierie en définissant simplement des valeurs dans un fichier de configuration. p>
Sinon, je suggère une langue de script pour construire toutes les configurations. P>
Voici un script Perl qui fait un travail hacky d'analyse #Ifdef et assemble une liste des symboles utilisés dans un fichier particulier. Il imprime ensuite le Produit cartésien de toutes les combinaisons possibles d'avoir ce symbole sur ou éteint. Cela fonctionne pour un projet de mien C ++ et peut nécessiter une modification mineure pour votre configuration.
-DMAC -DLINUX -DWINDOWS
Merci! Vous faites un excellent point sur le nombre de combinaisons dans un autre commentaire et j'ai ajouté une courte mention de cette idée à la réponse.
Je cherchais un script comme ça, merci! Toutefois, comme indiqué dans un autre commentaire, nous nous intéressons principalement dans toutes les combinaisons de IFDEF non imbriquées. Notre projet définit plus de 50 noms de symboles (et probablement à l'avenir d'autres seront ajoutés, tandis que d'autres seront supprimés), l'approche de la force brute de la compilation de toutes les combinaisons d'IFDEFS n'est pas possible dans notre cas. Je modifierai le script pour trouver tous les IFDEF indépendants, puis générer une combinaison de toutes les combinaisons pour simplement nichée IFDEFS. Merci!
@James Thompson, je ne sais pas Perl, alors je suis désolé pour la question idiote. Lorsque j'ai exécuté votre script dans le dossier source, j'ai une erreur: Directory Top non valide en C: /Strowberry/perl/lib/file/find.pm Ligne 472.
Désolé, je ne connais aucun outil pour vous aider, mais si je devais faire cela, j'irais avec un script simple qui fait cela: - Copier tous les fichiers source à un autre endroit, - Ajoutez un numéro d'exécution (dans un commentaire, évidemment) au début de chaque ligne (première ligne de code de premier fichier = 1, ne réinitialisez pas entre les fichiers), - pré-processus en utilisant toutes les configurations prédéfinies et vérifiez quelles lignes ont été incluses et qui n'étaient pas, - Vérifiez quelles lignes ont été incluses et qui manquent. P>
Ne devriez pas prendre plus de quelques jours pour que cela fonctionne avec ex. Perl ou python. Ce qui est requis est un fichier qui a une ligne comprenant les configurations. Cela devrait être suffisamment rapide à faire avec l'aide de ce script. Il suffit de vérifier que les lignes ne sont pas incluses avec les configurations déjà et modifiez le fichier jusqu'à ce que chaque ligne soit incluse. Ensuite, passez à cette occasion pour vous assurer qu'il n'y a pas de nouveaux chemins. P>
Analyse de la source comme si vous voulez que ce soit un script beaucoup plus complexe et je ne suis pas sûr que cela mérite la peine. P>
Vous pouvez utiliser UNIFDEF -S pour obtenir une liste de tous les symboles de préprocesseur utilisés dans les conditionnels du préprocesseur . Sur la base de la discussion autour des autres réponses, cela n'est clairement pas tout à fait l'information dont vous avez besoin, mais si vous utilisez l'option -D également, la sortie de débogage comprend le niveau de nidification. Il devrait être assez simple de filtrer la sortie pour produire les combinaisons de symboles que vous souhaitez. P>
Tony, merci beaucoup, ce superbe outil trouvera certainement lesquels sont la non imbriquée dans nos sources. Donc, cette information plus le script fourni dans une autre réponse est ce dont j'ai besoin. Une autre bonne chose que vous avez oubliée de mentionner est que l'outil UNIFDEF est actuellement emballé dans certaines distributions Linux (et vous pouvez utiliser l'option -D même si la page de l'homme ne mentionne rien à ce sujet).
J'ai modifié UNIFDEF pour ajouter une option A afin que vous puissiez obtenir ces informations sans mettre en marche le mode de débogage. La version 352 est disponible chez DOTAT.AT/PROG/UNIFDEF