Похоже, вам нужна сборка вне исходного кода . Есть несколько способов создать сборку вне исходного кода.
Делай то, что делал, беги
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 3.13 или более поздней версии используйте эти параметры для установки папок источника и сборки.
cmake -B/path/to/my/build/folder -S/path/to/my/source/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? (отказ от ответственности, у меня есть лучший ответ на этот вопрос ... но вот откуда я об этом знаю).
CMAKE_BINARY_DIR
илиCMAKE_CACHEFILE_DIR
. Что произойдет, если вы удалите все этиset()
вызовы и просто сделаете этоcd Compile; rm -rf *; cmake ../src
?