Исходное место CMake

У меня очень простая структура каталогов:

Project
Project/src
Project/build

Исходные файлы находятся в Project/src, и я делаю сборку out-of-src в Project/build. После запуска cmake ../ ; make я могу запустить исполняемый файл таким образом: Project/build$ src/Executable - то есть Executable создается в каталоге build/src.

Как установить местоположение исполняемого файла в файле CMakeLists.txt? Я попытался выполнить некоторые из примеров, найденных в cmake.org, но ссылки, которые работают, похоже, не показывают этого поведения.

Здесь указан мой Project/src/CMakeLists.txt файл.


include_directories(${SBSProject_SOURCE_DIR}/src)
link_directories(${SBSProject_BINARY_DIR}/src)

set ( SBSProject_SOURCES
    main.cpp
    )

add_executable( TIOBlobs ${SBSProject_SOURCES})

И верхний уровень Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6)
project (SBSProject)

set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 

add_subdirectory(src)

Ответ 1

У вас есть несколько вариантов.

Чтобы изменить местоположение исполняемых файлов по умолчанию, установите CMAKE_RUNTIME_OUTPUT_DIRECTORY в нужное место. Например, если вы добавили

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

в команду Project/CMakeLists.txt до add_subdirectory, ваш исполняемый файл окажется в Project/build для сборников Unix или build/<config type> для сборки Win32. Для получения дополнительной информации запустите:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY

Другой вариант для проекта такого размера - иметь только один CMakeLists.txt. Вы могли бы более или менее заменить add_subdirectory(src) на содержимое Project/src/CMakeLists.txt для достижения тех же выходных путей.

Однако есть еще несколько проблем.

Вы, вероятно, хотите избежать использования link_directories в целом. Для объяснения выполните

cmake --help-command link_directories

Даже если вы используете link_directories, вряд ли какие-либо библиотеки будут найдены в ${SBSProject_BINARY_DIR}/src

Другая проблема заключается в том, что CMAKE_CXX_FLAGS применяется к сборкам Unix, поэтому, вероятно, он должен быть обернут в блок if (UNIX) ... endif(). Конечно, если вы не планируете строить что-либо кроме Unix, это не проблема.

Наконец, я бы рекомендовал использовать CMake 2.8 как минимум, если вы не должны использовать 2.6 - CMake - это активно разработанный проект, и текущая версия имеет много существенных улучшений по сравнению с 2.6

Таким образом, одна замена для Project/CMakeLists.txt может выглядеть так:

cmake_minimum_required (VERSION 2.8)
project (SBSProject)

if (UNIX)
  set (CMAKE_CXX_FLAGS "-g3 -Wall -O0")
endif ()

include_directories (${SBSProject_SOURCE_DIR}/src)

set (SBSProject_SOURCES
    ${SBSProject_SOURCE_DIR}/src/main.cpp
    )

add_executable (TIOBlobs ${SBSProject_SOURCES})

Ответ 2

Другой способ переместить местоположение исполняемого файла через set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)