Pergunta

Eu estou tentando configurar um comando pós-compilação para CMake, o que eu fiz usando a diretiva ADD_CUSTOM_COMMAND como indicado na documentação do CMake. O que eu gostaria de fazer, porém, é só têm o pós-build prazo, se eu estou criando uma compilação de lançamento do meu executável.

Como se conseguir isso?

Foi útil?

Solução

Para os geradores baseados em Makefile você pode verificar a variável CMAKE_BUILD_TYPE e agir de acordo com o seu 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 Visual Studio baseado constrói, esta pergunta SO parece sugerir que CMAKE_BUILD_TYPE também trabalha com VS 2005 +.

Outras dicas

Eu corri para algo semelhante, querendo copiar um arquivo DLL para um diretório de destino, mas somente para compilações. Depois de muita cabelo rasgado eu consegui fazê-lo funcionar usando algumas expressões gerador (as coisinhas $<...>). Estou colocando isso aqui sete anos mais tarde, não tanto para resolver o seu problema (embora eu admiro o seu nível de pertinência), mas para salvar o cabelo cranial da próxima pessoa que tem esse mesmo problema e encontrar esta pergunta no 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})

O truque é escrever um echo na frente do comando que de outra forma seriam emitidas. Desta forma, o comando não é executado, mesmo que um pouco de ruído é emitido. Pode-se colocar o restante da linha de comando em uma série de gerador de expressões para encurtar a saída à custa de um arquivo cmake completamente ilegível. Por outro lado, parece haver nenhuma maneira para suprimir a cópia portably sem gerar qualquer saída. Finalmente, se você acha que há uma saída fácil e você pode if($<CONFIG:Release>) ... endif() apenas escrever, eu aconselhá-lo a poupar-se a decepção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top