Question

J'essaie de configurer une commande post-build pour CMake, ce que j'ai fait à l'aide de la directive ADD_CUSTOM_COMMAND, comme indiqué dans la documentation de CMake. Ce que je voudrais faire, c’est de ne lancer l’exécution post-génération que si je crée une version corrigée de mon exécutable.

Comment accomplit-on cela?

Était-ce utile?

La solution

Pour les générateurs basés sur Makefile, vous pouvez vérifier la CMAKE_BUILD_TYPE variable 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 les versions basées sur Visual Studio, cette question SO semble suggérer que <=> fonctionne également avec VS 2005 +.

Autres conseils

J'ai rencontré quelque chose de similaire, voulant copier un fichier DLL dans un répertoire de destination, mais uniquement pour les versions validées. Après beaucoup de cheveux déchirés, j’ai réussi à les faire fonctionner en utilisant quelques expressions de générateur (les $<...> trucs). Je le pose ici sept ans plus tard, non pas tant pour résoudre votre problème (bien que j'admirerais votre degré de pertinence), mais pour sauver les cheveux crâniens de la prochaine personne ayant ce même problème et trouvant cette question sur Google:

set(no_copy $<NOT:$<CONFIG:Release>>) # An abbreviation to make the example easier to read.
add_custom_command(TARGET myDLL POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E
    # do nothing for non-Release build
    $<${no_copy}:echo>
    # output text to make clear that the copy command is not actually issued
    $<${no_copy}:"copy omitted for non-release build, command would have been ">
    # the actual copy command, which is overridden by the "echo" above
    # in the case of a non-release build
    copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL})

Le truc consiste à écrire un echo devant la commande qui serait sinon émise. De cette façon, la commande n'est pas exécutée, même si un peu de bruit est généré. On pourrait inclure 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'autre part, il semble n'y avoir aucun moyen de supprimer la copie de manière portable sans générer de sortie. Enfin, si vous pensez qu'il est facile de sortir et que vous pouvez simplement écrire if($<CONFIG:Release>) ... endif(), je vous conseille d'éviter la déception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top