Keeping file hierarchy across subdirectories in CMake

前端 未结 3 1263
北恋
北恋 2020-12-06 12:57

Till date I still do not really understand what the \'best practice\' is for doing this for a CMake project with many subdirectories.

Say I have a project hierarchy

3条回答
  •  囚心锁ツ
    2020-12-06 13:46

    There are 3 ways I have used before. I normally prefer the 1st way, but have already used all 3 depending on the use case:

    1. You directly name the sources in your root CMakeLists.txt file

    set(
        SUBD1_SOURCES
        "SubD1/SubSubD1/Source2.cpp"
        "SubD1/Source.cpp"
    )
    
    set(
        SUBD2_SOURCES
        "SubD2/Source3.cpp"
    )
    
    add_executable(myProg ${SUBD1_SOURCES} ${SUBD2_SOURCES})
    

    2. You use OBJECT intermediate libraries to collect/group your sources

    SubD1/SubSubD1/CMakeLists.txt:

    add_library(SubSubD1Objs OBJECT Source2.cpp)
    

    SubD1/CMakeLists.txt:

    add_subdirectory(SubSubD1)
    add_library(SubD1Objs OBJECT Source.cpp)
    

    CMakeLists.txt:

    add_executable(myProg $ $)
    

    3. You write your own function() to collect the data (and do the prefixing)

    CMakeLists.txt:

    function(my_collect_sources)
        foreach(_source IN ITEMS ${ARGN})
            if (IS_ABSOLUTE "${_source}")
                set(source_abs "${_source}")
            else()
                get_filename_component(_source_abs "${_source}" ABSOLUTE)
            endif()
            set_property(GLOBAL APPEND PROPERTY GlobalSourceList "${_source_abs}")
        endforeach()
    endfunction(my_collect_sources)
    
    add_subdirectory(SubD1)
    #add_subdirectory(SubD2)
    
    get_property(MY_SOURCES GLOBAL PROPERTY GlobalSourceList)
    add_executable(myProg ${MY_SOURCES})
    

    SubD1/CMakeLists.txt:

    add_subdirectory(SubSubD1)
    my_collect_sources(Source.cpp)
    

    SubD1/SubSubD1/CMakeLists.txt:

    my_collect_sources(Source2.cpp)
    

提交回复
热议问题