Каталог вывода/сборки CMake


Я довольно новичок в cmake, и прочитал несколько учебников о том, как его использовать, и написал несколько сложных 50 строк сценария CMake, чтобы сделать программу для 3 разных компиляторов. Это, вероятно, завершает все мои знания в cmake.

Теперь моя проблема заключается в том, что у меня есть исходный код, папку которого я не хочу трогать/беспорядок, когда я делаю программу. Я хочу, чтобы все cmake и сделать выходные файлы и папки, чтобы войти ../Compile/, поэтому я изменил несколько переменных в моем скрипте cmake для это, и это сработало когда-то, когда я сделал что-то подобное на своем ноутбуке:

Compile$ cmake ../src
Compile$ make

где с этим у меня был чистый вывод в папке, в которой я сейчас нахожусь, что именно то, что я ищу.

Теперь я перешел на другой компьютер и перекомпилировал CMake 2.8.11.2, и я почти вернулся к квадрату! Он всегда компилирует вещь в папку src, где мои CMakeLists.txt находится.

часть, где я выбираю каталог в моем скрипте 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

Я что-то пропустила?

5 72

5 ответов:

нет необходимости устанавливать все переменные, которые вы устанавливаете. CMake устанавливает их в разумные значения по умолчанию. Вы должны обязательно не изменить CMAKE_BINARY_DIR или CMAKE_CACHEFILE_DIR. Рассматривайте их как доступные только для чтения.

Сначала удалите существующий проблемный файл кэша из каталога src:

cd src
rm CMakeCache.txt
cd ..

затем удалите все set() команды и делать:

cd Compile
rm -rf *
cmake ../src

пока вы находитесь за пределами исходного каталога при запуске CMake, он не будет изменять исходный каталог, если ваш CMakeList явно не говорит об этом.

как только у вас это работает, вы можете посмотреть, где CMake ставит вещи по умолчанию, и только если вы не удовлетворены местоположениями по умолчанию (например, значением по умолчанию EXECUTABLE_OUTPUT_PATH), изменить только те, которые вам нужны. И попробуйте выразить их относительно CMAKE_BINARY_DIR,CMAKE_CURRENT_BINARY_DIR,PROJECT_BINARY_DIR etc.

если вы посмотрите на документацию CMake, вы увидите переменные, разделенные на семантические разделы. Кроме очень особые обстоятельства, вы должны рассматривать все перечисленные в разделе "переменные, которые предоставляют информацию" только для чтения внутри CMakeLists.

похоже, вы хотите из исходного сборки. Существует несколько способов создания сборки из исходного кода.

  1. делай то, что ты делал, беги

    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder
    

    что заставит cmake генерировать построить дерево in /path/to/my/build/folder на источник дерева in /path/to/my/source/folder.

    после того, как вы создали его, cmake запоминает, где находится исходная папка - так что вы можете повторить CMake на дереве построить с

    cmake /path/to/my/build/folder
    

    или даже

    cmake .
    

    если ваш текущий каталог уже находится в папке build.

  2. использовать некоторые недокументированные параметры для установки исходных и построения папок:

    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
    

    который будет делать то же самое, что и (1), но без опоры на текущий рабочий каталог.

CMake помещает все свои выходы в построить дерево по умолчанию, поэтому, если вы не используете либерально ${CMAKE_SOURCE_DIR} или ${CMAKE_CURRENT_SOURCE_DIR} в ваших файлах cmake он не должен касаться вашего источник дерева.

самое большое, что может пойти не так, если вы ранее создали дерево сборки в исходном дереве (т. е. у вас есть источник build). После того, как вы это сделали, вторая часть (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? (отказ от ответственности, у меня есть топ проголосовал ответ на этот вопрос...но вот как я об этом узнал).

по состоянию на CMake Wiki:

CMAKE_BINARY_DIR если вы создаете in-source, это то же самое, что и CMAKE_SOURCE_DIR, иначе это каталог верхнего уровня вашего построить дерево

сравните эти две переменные, чтобы определить, была ли запущена сборка вне источника

прежде всего, вы не должны ретранслировать имя сборки dir в своем скрипте. линия С../Компиляция должна быть изменена.

Это потому, что это до пользователя, где для компиляции.

вместо этого используйте одну из предопределенных переменных: http://www.cmake.org/Wiki/CMake_Useful_Variables (ищите CMAKE_BINARY_DIR и CMAKE_CURRENT_BINARY_DIR)

превращая мой комментарий в ответ:

в случае, если кто-то сделал то, что я сделал, который был начать с размещения всех файлов сборки в исходном каталоге:

cd src
cmake .

cmake поместит кучу файлов сборки и файлов кэша (CMakeCache.txt,CMakeFiles,cmake_install.cmake, etc) в src реж.

чтобы перейти на исходную сборку, мне пришлось удалить все эти файлы. Тогда я мог бы сделать то, что @ Agnew рекомендовал в своем ответе:

mkdir -p src/build
cd src/build
cmake ..