Подтвердить что ты не робот

Заполнение ${SRCS} из CMakeLists.txt в подкаталогах

В настоящее время я определяю переменную ${SRCS} в файле CMakeLists.txt в корневом каталоге проектов, перечисляя все исходные файлы, необходимые для моего исполняемого файла:

SET (SRCS main.cpp
          dir1/file1.cpp
          dir1/file2.cpp
          dir2/file3.cpp
          dir2/file4.cpp)

Как я могу распространять этот список в файлах CMakeLists.txt в каждом из подкаталогов? То есть:

CMakeLists.txt
    Adds main.cpp to SRCS and subdirectories dir1 and dir2

dir1/CMakeLists.txt
    Adds file1.cpp, file2.cpp to SRCS

dir2/CMakeLists.txt
    Adds file3.cpp, file4.cpp to SRCS
4b9b3361

Ответ 1

Лучше всего скрыть все детали настройки переменной SRCS в CMake macro. Затем макрос можно вызвать во всех файлах списка проектов CMake для добавления источников.

В CMakeLists.txt в корневой папке проекта добавьте следующее определение макроса:

macro (add_sources)
    file (RELATIVE_PATH _relPath "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
    foreach (_src ${ARGN})
        if (_relPath)
            list (APPEND SRCS "${_relPath}/${_src}")
        else()
            list (APPEND SRCS "${_src}")
        endif()
    endforeach()
    if (_relPath)
        # propagate SRCS to parent directory
        set (SRCS ${SRCS} PARENT_SCOPE)
    endif()
endmacro()

add_sources(main.cpp)
add_subdirectory(dir1)
add_subdirectory(dir2)

message(STATUS "${SRCS}")

Сначала макрос вычисляет путь исходного файла относительно корня проекта для каждого аргумента. Если макрос вызывается из подкаталога проекта, новое значение переменной SRCS должно быть распространено в родительскую папку с помощью PARENT_SCOPE вариант.

В подкаталогах вы можете просто добавить вызов макроса, например. в dir1/CMakeLists.txt добавить:

add_sources(file1.cpp file2.cpp)

И в dir2/CMakeLists.txt добавить:

add_sources(file3.cpp file4.cpp)

Ответ 2

В dir1/CMakeLists.txt поместите это:

set(SRCS ${SRCS} file1.cpp PARENT_SCOPE)

Если это не сработает, единственным решением будет

set(DIR1_SRCS "file1.cpp" PARENT_SCOPE)

а затем в. /CMakeLists.txt

set(SRCS ${DIR1_SRCS} ${DIR2_SRCS})

Ответ 3

Подобный макрос, подобный тому, который предложил сакра, был опубликован в списке рассылки CMake Майклом Диком [1]. Он использует глобальные свойства вместо распространения переменной вверх.

[1] http://www.cmake.org/pipermail/cmake/2010-March/035992.html