Похоже, вы хотите из исходной сборки . Есть несколько способов, которыми вы можете создать сборку источника.
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
, из-за чего cmake будет генерировать дерево сборки в /path/to/my/build/folder
для дерева источника в /path/to/my/source/folder
. Когда вы его создали, cmake запоминает, где находится исходная папка, поэтому вы можете повторно запустить cmake в дереве сборки с помощью cmake /path/to/my/build/folder
или даже cmake .
, если ваш текущий каталог уже является папкой сборки. cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
, которые будут делать то же самое, что и (1), но без зависимости от текущего рабочего каталога. По умолчанию CMake выставляет все свои выходы в дереве сборки , поэтому, если вы не используете ${CMAKE_SOURCE_DIR}
или ${CMAKE_CURRENT_SOURCE_DIR}
в ваших файлах cmake, не должны касаться вашего исходное дерево .
Самое большое, что может пойти не так, если вы уже создали дерево сборки в исходном дереве (т. е. у вас есть в источнике строить). После того, как вы сделали это, вторая часть (1) выше ударит, а cmake не вносит никаких изменений в места источника или сборки. Таким образом, вы не можете создать сборку вне источника для исходного каталога с встроенной сборкой. Вы можете исправить это довольно легко, удалив (как минимум) CMakeCache.txt
из исходного каталога. Есть еще несколько файлов (в основном в каталоге CMakeFiles
), которые CMake генерирует, которые вы также должны удалить, но это не приведет к тому, что cmake обработает исходное дерево как дерево сборки.
Поскольку сборки вне исходного кода часто более желательны, чем сборники в источнике, вы можете изменить свой cmake, чтобы потребовать от исходных построений:
# 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."
)
Вышеуказанный макрос происходит из обычно используемого модуля, называемого MacroOutOfSourceBuild
. Есть много источников для MacroOutOfSourceBuild.cmake
в google, но я не могу найти оригинал, и он достаточно короткий, чтобы включить здесь полностью.
К сожалению, cmake обычно записывал несколько файлов к тому моменту, когда макрос вызывается, так что, хотя это не остановит вас от фактического выполнения сборки, вам все равно нужно удалить CMakeCache.txt
и CMakeFiles
.
Возможно, вам будет полезно установить пути, в которых используются двоичные, общие и статические библиотеки записываются в - в этом случае см. , как я могу сделать вывод cmake в «bin» dir? (отказ от ответственности, у меня есть главный голосовой ответ на этот вопрос ... но вот как я знаю о она).