web-dev-qa-db-fra.com

Faire des commandes d'impression CMake avant d'exécuter

Je travaille sur un grand projet C++ construit avec CMake sur Linux. CMake fonctionne correctement, produisant une horde de Makefiles dans l'arborescence des modules et des applications. L'exécution de GNU make entraîne des erreurs de l'éditeur de liens. Comment puis-je demander à make d'imprimer les commandes exactes avant de les exécuter?

L'option -d n'imprime pas les commandes, mais de nombreuses informations qui n'ont pas été utiles.

L'option -n imprime toutes les commandes, mais ne les exécute pas, donc je ne peux pas dire où était exactement le problème. En examinant la sortie standard de make -n, je ne vois aucune commande pertinente. Je soupçonne que certaines commandes changent en fonction des résultats des commandes précédentes, et la hiérarchie des Makefiles rend difficile de dire ce qui se passe réellement.

Je ne vois aucune autre option dans la page de make man qui semble utile.

59
DarenW

Je suis assez sûr que cela fonctionnera:

make VERBOSE=1

Vous devriez également pouvoir ajouter ceci à votre CMakeLists.txt pour définir de manière permanente que:

set(CMAKE_VERBOSE_MAKEFILE on)

Ceci est couvert dans la CMake FAQ .

72
Bill Lynch

Pour les Makefiles générés par automake, essayez:

make V=1
7
k107

Une option, qui s'applique à GNU make et fonctionne avec n'importe quel Makefile, qu'il soit généré par CMake ou non, consiste à utiliser le --trace option à faire. Cela affichera les commandes que make exécute et les exécutera toujours.

Cela s'applique à toutes les commandes, pas seulement à celles qui VERBOSE=1 ou V=1 déclenche l'impression des makefiles générés par CMake/automake.

Et encore une autre alternative sous Linux est d'exécuter make under strace , comme strace -f -e trace=execve make <make options>. La sortie de strace inclura chaque processus qui est exécuté: par make, par un script Shell qui fait courir, etc.

Par exemple, vous pourriez constater que le makefile généré par CMake exécute /usr/bin/cmake -E __run_co_compile <lots of options ...> et je me demande encore quelles sont les invocations exactes du compilateur pour que cela s'exécute à son tour. Vous pouvez l'obtenir avec la méthode strace.

2
TrentP