Parece que desea una compilación fuera de origen . Hay un par de formas de crear una compilación fuera de código fuente.
Haz lo que estabas haciendo, corre
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
lo que hará que cmake para generar un árbol de construcción en /path/to/my/build/folder
el árbol de fuentes en /path/to/my/source/folder
.
Una vez que lo haya creado, cmake recuerda dónde está la carpeta de origen, por lo que puede volver a ejecutar cmake en el árbol de compilación con
cmake /path/to/my/build/folder
o incluso
cmake .
si su directorio actual ya es la carpeta de compilación.
Para CMake 3.13 o posterior, use estas opciones para configurar las carpetas de origen y compilación
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Para CMake más antiguo, use algunas opciones no documentadas para configurar las carpetas de origen y compilación :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
que hará exactamente lo mismo que (1), pero sin depender del directorio de trabajo actual.
CMake coloca todas sus salidas en el árbol de compilación de forma predeterminada, por lo que, a menos que esté usando generosamente ${CMAKE_SOURCE_DIR}
o ${CMAKE_CURRENT_SOURCE_DIR}
en sus archivos cmake, no debería tocar su árbol de fuentes .
Lo más importante que puede salir mal es si ha generado previamente un árbol de compilación en su árbol de fuentes (es decir, tiene una compilación en la fuente ). Una vez que haya hecho esto, la segunda parte de (1) anterior entra en acción y cmake no realiza ningún cambio en las ubicaciones de origen o compilación. Por lo tanto, no puede crear una compilación fuera de origen para un directorio de origen con una compilación en origen . Puede solucionar esto con bastante facilidad eliminando (como mínimo) CMakeCache.txt
del directorio de origen. Hay algunos otros archivos (principalmente en el CMakeFiles
directorio) que genera CMake que también debe eliminar, pero estos no harán que cmake trate el árbol de origen como un árbol de compilación.
Dado que las compilaciones fuera de la fuente son a menudo más deseables que las compilaciones en la fuente, es posible que desee modificar su cmake para requerir compilaciones fuera de la fuente:
# 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."
)
La macro anterior proviene de un módulo de uso común llamado MacroOutOfSourceBuild
. Hay numerosas fuentes MacroOutOfSourceBuild.cmake
en Google, pero parece que no puedo encontrar el original y es lo suficientemente corto como para incluirlo aquí en su totalidad.
Desafortunadamente, cmake generalmente ha escrito algunos archivos en el momento en que se invoca la macro, por lo que, aunque evitará que realice la compilación, aún deberá eliminar CMakeCache.txt
y CMakeFiles
.
Puede que le resulte útil establecer las rutas en las que se escriben los binarios, las bibliotecas compartidas y estáticas, en cuyo caso, vea cómo puedo convertir la salida de cmake en un directorio 'bin'. (descargo de responsabilidad, tengo la respuesta más votada sobre esa pregunta ... pero así es como lo sé).
CMAKE_BINARY_DIR
oCMAKE_CACHEFILE_DIR
. ¿Qué sucede si eliminas todas estasset()
llamadas y simplemente lo hacescd Compile; rm -rf *; cmake ../src
?