Si encuentras algún detalle que no comprendes puedes dejarnos un comentario y trataremos de ayudarte tan rápido como podamos.
Solución:
Parece que quieres una compilación fuera de la fuente. Hay un par de formas en que puede crear una compilación fuera de la fuente.
-
Haz lo que estabas haciendo, corre
cd /path/to/my/build/folder cmake /path/to/my/source/folder
lo que hará que cmake genere un construir arbol en
/path/to/my/build/folder
Para el árbol de origen 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 pone todas sus salidas en el construir arbol por defecto, así que a menos que estés usando liberalmente $CMAKE_SOURCE_DIR
o $CMAKE_CURRENT_SOURCE_DIR
en sus archivos cmake, no debería tocar su árbol de origen.
Lo más importante que puede salir mal es si previamente generó un árbol de compilación en su árbol fuente (es decir, tiene un en fuente construir). Una vez que haya hecho esto, la segunda parte de (1) se activa y cmake no realiza ningún cambio en las ubicaciones de origen o compilación. Por lo tanto, no puede crear una compilación externa para un directorio de origen con una compilación interna. 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 CMake genera y que también debe eliminar, pero esto no hará que cmake trate el árbol de origen como un árbol de compilación.
Dado que las compilaciones fuera de la fuente a menudo son 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."
)
Lo anterior macro proviene de un módulo de uso común llamado MacroOutOfSourceBuild
. Hay numerosas fuentes para 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 para cuando el macro se invoca, por lo que, aunque le impedirá realizar la compilación, aún tendrá que eliminar CMakeCache.txt
y CMakeFiles
.
Puede que le resulte útil establecer las rutas que los archivos binarios, compartidos y static se escriben las bibliotecas, en cuyo caso, vea cómo hago que cmake la salida en un directorio ‘bin’? (descargo de responsabilidad, tengo la respuesta más votada en esa pregunta … pero así es como lo sé).
Hay poca necesidad de configurar todas las variables que está configurando. CMake los establece en valores predeterminados razonables. definitivamente deberías no modificar CMAKE_BINARY_DIR
o CMAKE_CACHEFILE_DIR
. Trátelos como de solo lectura.
Primero elimine el archivo de caché problemático existente del directorio src:
cd src
rm CMakeCache.txt
cd ..
Luego quita todos los set()
comandos y hacer:
cd Compile && rm -rf *
cmake ../src
Mientras esté fuera del directorio de origen cuando ejecute CMake, no modificará el directorio de origen a menos que su CMakeList le indique explícitamente que lo haga.
Una vez que tenga esto funcionando, puede ver dónde CMake coloca las cosas de forma predeterminada, y solo si no está satisfecho con las ubicaciones predeterminadas (como el valor predeterminado de EXECUTABLE_OUTPUT_PATH
), modifique solo los que necesite. Y tratar de expresarlos en relación con CMAKE_BINARY_DIR
, CMAKE_CURRENT_BINARY_DIR
, PROJECT_BINARY_DIR
etc
Si observa la documentación de CMake, verá las variables divididas en secciones semánticas. Excepto por muy En circunstancias especiales, debe tratar todas las enumeradas en “Variables que proporcionan información” como de solo lectura dentro de CMakeLists.
Convirtiendo mi comentario en una respuesta:
En caso de que alguien haya hecho lo que hice yo, que fue comenzar colocando todos los archivos de compilación en el directorio de origen:
cd src
cmake .
cmake pondrá un montón de archivos de compilación y archivos de caché (CMakeCache.txt
, CMakeFiles
, cmake_install.cmake
etc) en el src
dirección
Para cambiar a una compilación fuera de la fuente, tuve que eliminar todos esos archivos. Entonces podría hacer lo que @Angew recomendó en su respuesta:
mkdir -p src/build
cd src/build
cmake ..