Domanda

Sto cercando di impostare un comando post-build per CMake, che ho eseguito utilizzando la direttiva ADD_CUSTOM_COMMAND come indicato nella documentazione di CMake. Quello che mi piacerebbe fare, però, è solo l'esecuzione post-build se sto creando una build di rilascio del mio eseguibile.

Come si fa a farlo?

È stato utile?

Soluzione

Per i generatori basati su Makefile puoi controllare la CMAKE_BUILD_TYPE variabile e agire sul suo valore:

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()

Per le build basate su Visual Studio, questa domanda SO sembra suggerire che <=> funziona anche con VS 2005 +.

Altri suggerimenti

Mi sono imbattuto in qualcosa di simile, volendo copiare un file DLL in una directory di destinazione ma solo per build di rilascio. Dopo un sacco di capelli strappati sono riuscito a farlo funzionare usando alcune espressioni del generatore (le $<...> cose). Lo sto mettendo qui sette anni dopo non tanto per risolvere il tuo problema (anche se ammirerei il tuo livello di pertinenza), ma per salvare i capelli cranici della prossima persona che ha lo stesso problema e trovando questa domanda su 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})

Il trucco è scrivere un echo davanti al comando che altrimenti verrebbe emesso. In questo modo, il comando non viene eseguito, anche se viene emesso un po 'di rumore. Si potrebbe racchiudere il resto della riga di comando in un numero di espressioni del generatore per abbreviare l'output a spese di un file cmake completamente illeggibile. D'altra parte non sembra esserci modo di sopprimere la copia in modo portabile senza generare alcun output. Infine, se pensi che ci sia una soluzione facile e puoi semplicemente scrivere if($<CONFIG:Release>) ... endif(), ti consiglio di risparmiarti la delusione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top