Компилировать исходники из каталога `src` в двоичные файлы из каталога`bin` с помощью CMake

Каталог моего проекта содержит CMakeLists.txt файл и src а также include каталоги в его корне. src также содержит свой собственный CMakeLists.txt, который связан с тем, что в корне. Есть ли способ, который я могу указать CMake, чтобы установить глобальный каталог сборки по умолчанию, чтобы синтаксис в src/CMakeLists.txt близко к следующему?

include_directories(include)
add_executable(first main.cpp foo.cpp)
add_executable(second bar.cpp)

Я хотел бы, чтобы это дерево каталогов было построено:

CMakeLists.txt

src/
    CMakeLists.txt
    main.cpp
    foo.cpp
    bar.cpp

include/
    ...

bin/ (or build/)
    first
    second

1 ответ

Решение

Вы могли бы установить CMAKE_RUNTIME_OUTPUT_DIRECTORY:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

Тем не менее, это не создаст подкаталоги внутри bin/ для каждой отдельной цели.

Если вы хотите, вы можете создать вспомогательную функцию для переноса add_subdirectories:

function(my_add_executable TargetName)
  set(Files ${ARGV})
  list(REMOVE_AT Files 0)
  add_executable(${TargetName} ${Files})
  set_target_properties(${TargetName} PROPERTIES
                            RUNTIME_OUTPUT_DIRECTORY
                                "${CMAKE_SOURCE_DIR}/bin/${TargetName}")
endfunction()

затем просто измените ваши звонки на:

my_add_executable(first main.cpp foo.cpp)
my_add_executable(second bar.cpp)


Для получения более подробной информации, запустите

cmake --help-variable "CMAKE_RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"
Другие вопросы по тегам