从子目录中的CMakeLists.txt填充$ {SRCS}

时间:2011-08-12 22:25:15

标签: cmake

我目前在项目根目录的${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 个答案:

答案 0 :(得分:28)

最好隐藏在CMake macro中设置变量SRCS的所有详细信息。然后可以在所有项目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}")

宏首先计算源文件相对于每个参数的项目根目录的路径。如果从项目子目录内调用宏,则需要使用PARENT_SCOPE选项将变量SRCS的新值传播到父文件夹。

在子目录中,您只需添加一个宏调用,例如在dir1/CMakeLists.txt添加:

add_sources(file1.cpp file2.cpp)

dir2/CMakeLists.txt添加:

add_sources(file3.cpp file4.cpp)

答案 1 :(得分: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})

答案 2 :(得分:2)

类似于sakra建议的宏,由Michael Wild [1]发布在CMake邮件列表上。它使用全局属性而不是向上传播变量。

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

相关问题