2009-10-25 7 views
3

J'essaie de configurer une commande post-construction pour CMake, ce que j'ai fait en utilisant la directive ADD_CUSTOM_COMMAND comme indiqué dans la documentation de CMake. Ce que je voudrais faire cependant, c'est seulement avoir le post-build si je crée une version release de mon exécutable.Étape de post-construction uniquement pour la version finale

Comment y parvenir?

Répondre

2

Pour les générateurs basés sur Makefile vous pouvez vérifier la variable CMAKE_BUILD_TYPE et agir sur sa valeur:

if(CMAKE_BUILD_TYPE STREQUAL Debug) 
    message(STATUS "Do debug stuff") 
elseif(CMAKE_BUILD_TYPE STREQUAL Release) 
    message(STATUS "Do release stuff") 
elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo) 
    message(STATUS "Do release with debug info stuff") 
elseif(CMAKE_BUILD_TYPE STREQUAL MinSizeRel) 
    message(STATUS "Do minimal size release stuff") 
endif() 

Pour Visual Studio basé builds, this SO question semble suggérer que CMAKE_BUILD_TYPE fonctionne également avec VS 2005+.

+0

J'utilise VS2008 et CMake 2.8 et cela ne fonctionne pas. – Robert

+0

-1: CMAKE_BUILD_TYPE est uniquement défini lors de l'exécution. Cette réponse est fausse. – Gili

+1

@Gili: pour les générateurs à configuration unique (générateur Makefile), il est disponible au moment de la génération. – richq

1

Je suis tombé sur quelque chose de similaire, voulant copier un fichier DLL dans un répertoire de destination, mais uniquement pour les versions de version. Après beaucoup de cheveux déchirés, j'ai réussi à le faire fonctionner en utilisant quelques expressions génératrices (les $<...> thingies). Je le mets ici sept ans plus tard pas tellement pour résoudre votre problème (bien que j'admire votre niveau de pertinence), mais afin de sauver les cheveux crâniens de la prochaine personne ayant ce même problème et de trouver cette question sur google:

set(no_copy $<NOT:$<CONFIG:Release>>) 
add_custom_command(TARGET myDLL POST_BUILD 
    COMMAND "${CMAKE_COMMAND}" -E 
    # do nothing for non-Release build 
    $<${no_copy}:echo> $<${no_copy}:"copy omitted for non-release build, command would have been "> 
    # copy file for release build 
    copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL}) 

l'astuce consiste à écrire un echo devant la commande qui seraient autrement émis. On pourrait entourer le reste de la ligne de commande dans un certain nombre d'expressions de générateur pour raccourcir la sortie au détriment d'un fichier cmake complètement illisible. D'un autre côté, il semble qu'il n'y ait aucun moyen de supprimer la copie de manière portative sans générer de sortie. Enfin, si vous pensez qu'il y a une sortie facile et que vous pouvez simplement écrire , je vous conseille de vous épargner la déception.

Questions connexes