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

Rez*_*zie 20 cmake

我目前在我的项目根目录${SRCS}中的CMakeLists.txt文件中定义一个变量,列出了我的可执行文件所需的每个源文件:

SET (SRCS main.cpp
          dir1/file1.cpp
          dir1/file2.cpp
          dir2/file3.cpp
          dir2/file4.cpp)
Run Code Online (Sandbox Code Playgroud)

如何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
Run Code Online (Sandbox Code Playgroud)

sak*_*kra 29

最好隐藏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}")
Run Code Online (Sandbox Code Playgroud)

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

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

add_sources(file1.cpp file2.cpp)
Run Code Online (Sandbox Code Playgroud)

另外dir2/CMakeLists.txt:

add_sources(file3.cpp file4.cpp)
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试过你的宏,如果我有一个顶级目录和一个级别的子目录,它的工作原理.然而,它不适用于更多级别的嵌套,例如.,./.sub1和./sub1/sub2.在这种情况下,sub2正确看到了SRCS,也看到了sub1,但顶层文件夹(.)只看到了自己的源和sub1中的那些,没有sub2 ......事实证明我需要先做add_subdirectory()然后才调用add_sources() - 这种方式有效.有没有办法避免这种行为? (2认同)