2010-01-29 3 views
11

Les paramètres -S -save-temps fonctionnent très bien, tant que je ne les utilise pas sur des fichiers portant le même nom. Pensez à la situation suivante: J'ai un projet avec un répertoire principal et un sous-répertoire avec le nom subDir et dans les deux répertoires sont des fichiers placés sous le nom file.c. Si j'appelle maintenant gcc -S -save-temps file.cpp subDir/file.c, un seul fichier intermédiaire portant le nom file.i sera généré.gcc avec les paramètres "-S -save-temps" met les fichiers intermédiaires dans le répertoire courant

C'est le comportement attendu, comme le fichier man de gcc me dit, que les fichiers intermédiaires seront toujours placés dans le chemin actuel, lors de l'utilisation -save-temps.

Mon problème est que je travaille sur des projets que je ne connais pas à l'avance. Il pourrait très bien être, que quelqu'un a construit l'exemple mentionné ci-dessus dans ses Makefiles. Dans ce cas, je serais coincé, car j'ai besoin des deux fichiers intermédiaires.

Quelques mots au système que je construis (pour mieux comprendre): Mon outil utilise make --just-print pour collecter les appels, un fichier make d'un projet invoque. Je scanne ces appels pour les appels du compilateur et ajoute les options -save-temps et -S. Le but est d'obtenir chaque fichier prétraité, qui est utilisé dans le processus de compilation du projet.

Avez-vous des idées, comment puis-je obtenir chaque fichier prétraité, même si l'exemple mentionné ci-dessus devrait apparaître?

Répondre

3

Il n'y a pas de problème avec fichier.cpp/fichier.c dans différents répertoires. GCC créera un *.ii et un *.i en fonction de l'extension des fichiers.

Si les deux ont c || cpp, vous pouvez utiliser -E et ne recevoir qu'un seul *.i où vous pouvez rechercher le pragma # 1 "<FILE_PATH>" et l'extraire via un script.

+1

Désolé, il y avait une faute de frappe dans mon post. Les deux fichiers dans mon exemple ont la même extension. – Customizer

+1

Oui, je connais le paramètre -E. Mais le problème est, qu'il y a plus d'une ligne du modèle # 1 "". Eh bien, jusqu'à il y a une minute, j'ai pensé, ce serait un problème. Mais je pense que toutes les autres lignes avec ce modèle déclarent simplement un chemin ou incluent un fichier d'en-tête avec la fin .h. Donc, il devrait vraiment être possible d'analyser ce genre de choses. Mais je ne suis pas encore sûr, si je peux compter sur ça. – Customizer

+1

Merci beaucoup. Avec l'aide de http://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html#Preprocessor-Output je devrais pouvoir analyser les fichiers que j'obtiens en utilisant '-E'. – Customizer

8

Dans gcc 4.5, vous pouvez utiliser l'option "-save-temps = obj" lorsque vous utilisez l'option -o. Cela enregistre les fichiers intermédiaires dans le même répertoire que le fichier de sortie, ce qui peut aider à éviter les problèmes lorsque vous avez le même nom de fichier en utilisant différents répertoires source et de sortie.

gcc -save-temps=obj -c dir1/foo.c -o dir1/foo.o 
gcc -save-temps=obj -c dir2/foo.c -o dir2/foo.o 

Les fichiers intermédiaires seront enregistrés en tant que dir1/foo.* et dir2/foo.*

Questions connexes