Заполнение $ {SRCS} из CMakeLists.txt в подкаталогах - PullRequest
20 голосов
/ 13 августа 2011

В настоящее время я определяю переменную ${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

Ответы [ 3 ]

29 голосов
/ 13 августа 2011

Лучше скрыть все детали настройки переменной SRCS в CMake макросе . Затем макрос можно вызывать во всех файлах списка 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 голосов
/ 22 декабря 2011

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

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

2 голосов
/ 13 августа 2011

В 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})

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