Я новичок в CMake, прочитал несколько руководств о том, как его использовать, и написал несколько сложных 50 строк сценария CMake, чтобы создать программу для трех разных компиляторов. На этом, наверное, заканчиваются все мои познания в CMake.
Теперь моя проблема в том, что у меня есть исходный код, папку с которым я не хочу трогать / возиться, когда создаю программу. Я хочу, чтобы все make
файлы и папки CMake, а также выходные файлы и папки входили в него ../Compile/
, поэтому я изменил для этого несколько переменных в моем сценарии CMake, и когда-то это работало, когда я делал что-то подобное на своем ноутбуке:
Compile$ cmake ../src
Compile$ make
Где с этим у меня был чистый вывод в папке, в которой я сейчас нахожусь, и это именно то, что я ищу.
Теперь я перешел на другой компьютер и перекомпилировал CMake 2.8.11.2, и я почти вернулся к исходной точке! Он всегда компилирует вещь в src
папку, где CMakeLists.txt
находится my .
Часть, где я выбираю каталог в моем сценарии CMake, такова:
set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})
А теперь всегда заканчивается:
-- Build files have been written to: /.../src
Я что-то упускаю?
CMAKE_BINARY_DIR
илиCMAKE_CACHEFILE_DIR
. Что произойдет, если вы удалите все этиset()
вызовы и просто сделаете этоcd Compile; rm -rf *; cmake ../src
?Ответы:
Нет необходимости устанавливать все переменные, которые вы устанавливаете. CMake устанавливает для них разумные значения по умолчанию. Вам определенно не следует изменять
CMAKE_BINARY_DIR
илиCMAKE_CACHEFILE_DIR
. Считайте их доступными только для чтения.Сначала удалите существующий проблемный файл кеша из каталога src:
Затем удалите все
set()
команды и выполните:Пока вы находитесь за пределами исходного каталога при запуске CMake, он не будет изменять исходный каталог, если ваш CMakeList явно не сообщает об этом.
После того, как вы все заработаете, вы можете посмотреть, куда CMake помещает вещи по умолчанию, и только если вас не устраивают местоположения по умолчанию (например, значение по умолчанию
EXECUTABLE_OUTPUT_PATH
), изменяйте только те, которые вам нужны. И попытаться выразить их относительноCMAKE_BINARY_DIR
,CMAKE_CURRENT_BINARY_DIR
, иPROJECT_BINARY_DIR
т.д.Если вы посмотрите документацию CMake, вы увидите переменные, разделенные на семантические секции. За исключением очень особых обстоятельств, вы должны относиться ко всем перечисленным в разделе «Переменные , которые предоставляют информацию» только для чтения внутри CMakeLists.
источник
rm -rf *
. Неприятно, еслиcd Compile
неCompile
, удалите все там, а затем запустите CMake с путем к исходному каталогу». Я исхожу из здравого смысла и суждения со стороны читателя.Похоже, вам нужна сборка вне исходного кода . Есть несколько способов создать сборку вне исходного кода.
Делай то, что делал, беги
что приведет к CMake для создания сборки дерева в
/path/to/my/build/folder
для дерева исходных текстов в/path/to/my/source/folder
.После того, как вы создали его, cmake запоминает, где находится исходная папка, поэтому вы можете повторно запустить cmake в дереве сборки с помощью
или даже
если ваш текущий каталог уже является папкой сборки.
Для CMake 3.13 или более поздней версии используйте эти параметры для установки папок источника и сборки.
Для более старых версий CMake используйте некоторые недокументированные параметры для установки папок источника и сборки :
который будет делать то же самое, что и (1), но без зависимости от текущего рабочего каталога.
CMake помещает все свои выходные данные в дерево сборки по умолчанию, поэтому, если вы не используете
${CMAKE_SOURCE_DIR}
или${CMAKE_CURRENT_SOURCE_DIR}
в своих файлах cmake, он не должен касаться вашего исходного дерева .Самое большое, что может пойти не так, - это если вы ранее сгенерировали дерево сборки в своем дереве исходных кодов (т.е. у вас есть сборка в исходном коде ). Как только вы это сделаете, сработает вторая часть (1) выше, и cmake не вносит никаких изменений в исходный код или места сборки. Таким образом, вы не можете создать сборку вне исходного кода для исходного каталога с помощью сборки из исходного кода . Вы можете довольно легко исправить это, удалив (как минимум)
CMakeCache.txt
из исходного каталога.CMakeFiles
CMake генерирует еще несколько файлов (в основном в каталоге), которые вы также должны удалить, но они не заставят cmake рассматривать исходное дерево как дерево сборки.Поскольку сборки из исходных кодов часто более желательны, чем сборки из исходных кодов, вы можете изменить свой cmake, чтобы требовать сборки из исходных кодов:
Вышеупомянутый макрос исходит из часто используемого модуля с именем
MacroOutOfSourceBuild
. ВMacroOutOfSourceBuild.cmake
Google есть множество источников, но я не могу найти оригинал, и он достаточно короткий, чтобы включить его здесь полностью.К сожалению, cmake обычно записывает несколько файлов к моменту вызова макроса, поэтому, хотя это помешает вам выполнить сборку, вам все равно придется удалить
CMakeCache.txt
иCMakeFiles
.Возможно, вам будет полезно установить пути, по которым записываются двоичные файлы, общие и статические библиотеки - и в этом случае посмотрите, как мне сделать вывод cmake в каталог bin? (отказ от ответственности, у меня есть лучший ответ на этот вопрос ... но вот откуда я об этом знаю).
источник
-S
нет-H
Превращаю мой комментарий в ответ:
На случай, если кто-то сделал то, что сделал я, для начала поместил все файлы сборки в исходный каталог:
CMake поставит кучу файлов сборки и кэш - файлы (
CMakeCache.txt
,CMakeFiles
,cmake_install.cmake
и т.д.) вsrc
реж.Чтобы перейти на сборку вне исходного кода, мне пришлось удалить все эти файлы. Тогда я мог бы сделать то, что @Angew рекомендовал в своем ответе:
источник
По данным CMake Wiki :
Сравните эти две переменные, чтобы определить, была ли запущена сборка вне исходного кода.
источник
Вы не должны полагаться на жестко запрограммированное имя каталога сборки в своем скрипте, поэтому
../Compile
необходимо изменить строку с .Это потому, что пользователь должен решать, где компилировать.
Вместо этого используйте одну из предопределенных переменных: http://www.cmake.org/Wiki/CMake_Useful_Variables (ищите
CMAKE_BINARY_DIR
иCMAKE_CURRENT_BINARY_DIR
)источник
CMAKE_CURRENT_BINARY_DIR
обычно рассказывал о текущем пути сборки двоичного файла . Возможно, может использоваться для настройки зависимых сборок libs / bin.