Parece que você quer uma compilação fora do código-fonte . Existem algumas maneiras de criar uma compilação fora do código-fonte.
Faça o que você estava fazendo, corra
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
o que fará com cmake para gerar uma árvore de construção em /path/to/my/build/folder
para a árvore de origem em /path/to/my/source/folder
.
Depois de criá-lo, o cmake lembra onde está a pasta de origem - para que você possa executar novamente o cmake na árvore de construção com
cmake /path/to/my/build/folder
ou mesmo
cmake .
se o seu diretório atual já for a pasta de construção.
Para CMake 3.13 ou posterior, use essas opções para definir as pastas de origem e de construção
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Para CMake mais antigo, use algumas opções não documentadas para definir as pastas de origem e de compilação :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
que fará exatamente a mesma coisa que (1), mas sem a dependência do diretório de trabalho atual.
O CMake coloca todas as suas saídas na árvore de construção por padrão, então a menos que você esteja usando liberalmente ${CMAKE_SOURCE_DIR}
ou ${CMAKE_CURRENT_SOURCE_DIR}
em seus arquivos cmake, ele não deve tocar em sua árvore de código-fonte .
A maior coisa que pode dar errado é se você gerou anteriormente uma árvore de construção em sua árvore de código-fonte (ou seja, você tem uma construção de código-fonte ). Depois de fazer isso, a segunda parte de (1) acima começa e o cmake não faz nenhuma alteração na origem ou nos locais de compilação. Portanto, você não pode criar uma compilação fora do código-fonte para um diretório de origem com uma compilação in-source . Você pode consertar isso facilmente removendo (no mínimo) CMakeCache.txt
do diretório de origem. Existem alguns outros arquivos (principalmente no CMakeFiles
diretório) que o CMake gera que você deve remover também, mas eles não farão com que o cmake trate a árvore de origem como uma árvore de construção.
Uma vez que compilações fora do código-fonte são frequentemente mais desejáveis do que compilações in-source, você pode querer modificar seu cmake para exigir compilações fora da fonte:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
A macro acima vem de um módulo comumente usado chamado MacroOutOfSourceBuild
. Existem inúmeras fontes para MacroOutOfSourceBuild.cmake
no google, mas não consigo encontrar o original e é curto o suficiente para incluir aqui na íntegra.
Infelizmente, o cmake geralmente grava alguns arquivos no momento em que a macro é chamada, portanto, embora ele vá impedi-lo de realmente executar a compilação, você ainda precisará excluir CMakeCache.txt
e CMakeFiles
.
Você pode achar útil definir os caminhos em que binários, bibliotecas compartilhadas e estáticas são gravados - nesse caso, veja como faço para fazer a saída cmake em um diretório 'bin'? (isenção de responsabilidade, eu tenho a resposta mais votada para essa pergunta ... mas é como eu sei sobre isso).
CMAKE_BINARY_DIR
ouCMAKE_CACHEFILE_DIR
. O que acontece se você remover todas essasset()
chamadas e apenas fazercd Compile; rm -rf *; cmake ../src
?