Pregunta

Estoy intentando configurar un comando posterior a la compilación para CMake, lo cual hice usando la directiva ADD_CUSTOM_COMMAND como se indica en la documentación de CMake.Sin embargo, lo que me gustaría hacer es ejecutar la compilación posterior solo si estoy creando una compilación de lanzamiento de mi ejecutable.

¿Cómo se logra esto?

¿Fue útil?

Solución

Para generadores basados ​​en Makefile, puede consultar el CMAKE_BUILD_TYPE variable y actuar sobre su valor:

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

Para compilaciones basadas en Visual Studio, esta pregunta SO parece sugerir que CMAKE_BUILD_TYPE También funciona con VS 2005+.

Otros consejos

Me encontré con algo similar, queriendo copiar un archivo DLL en un directorio de destino, pero solo para versiones de lanzamiento. Después de un montón de cabello desgarrado, logré que funcionara usando algunas expresiones generadoras (las $<...> cositas). Lo pondré aquí siete años después, no tanto para resolver su problema (aunque admiraría su nivel de pertinencia), sino para salvar el pelo craneal de la próxima persona que tenga este mismo problema y encuentre esta pregunta en 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})

El truco es escribir un echo delante del comando que de otro modo se emitiría. De esta forma, el comando no se ejecuta, aunque se emite un poco de ruido. Uno podría encerrar el resto de la línea de comando en varias expresiones generadoras para acortar la salida a expensas de un archivo cmake completamente ilegible. Por otro lado, parece que no hay forma de suprimir la copia de forma portátil sin generar ningún resultado. Finalmente, si cree que hay una salida fácil y puede escribir if($<CONFIG:Release>) ... endif(), le aconsejo que se ahorre la decepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top