CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹

我想要将所有 Target 的工程在 Visual Studio 中加到同一个文件夹

一开始我想要重写 add_library 函数,来获取到那些 lib 添加了,进而获得所有的 library,存到一个 list 里面,最后对这个 list 遍历,设置 folder

cmake 复制代码
# 3RD_PARTY_LIB_LIST stores all lib targets that have folder properity
set(3RD_PARTY_LIB_LIST "" CACHE INTERNAL "3RD_PARTY_LIB_LIST")

function(add_library name)
    _add_library(${name} ${ARGN}) 
    # if not Meow Editor, it is 3rd party library
    if(NOT name STREQUAL ${RUNTIME_NAME})
        if(TARGET ${name})
            # alias target can not call set_target_properties
            # interface library doesn't have folder property
            # so exclude them
            get_property(ALIAS TARGET "${name}" PROPERTY ALIASED_TARGET)
            if("${ALIAS}" STREQUAL "")
                get_target_property(3RD_PARTY_LIB_TYPE ${name} TYPE)
                if(NOT ("${3RD_PARTY_LIB_TYPE}" STREQUAL "INTERFACE_LIBRARY"))
                    message(STATUS "Find 3rd lib: ${name}")
                    set(3RD_PARTY_LIB_LIST ${3RD_PARTY_LIB_LIST} ${name} CACHE INTERNAL "3RD_PARTY_LIB_LIST")
                endif()
            endif()
        endif()
    endif()
endfunction()
cmake 复制代码
# Set all 3rd party lib to one folder
foreach(3RD_PARTY_LIB ${3RD_PARTY_LIB_LIST})
    # I don't know why one name has passed if(TARGET ${name}) check
    # but still may not find target now in this line
    # so give this dirty check
    if(TARGET ${3RD_PARTY_LIB})
        get_property(OLD_FOLDER TARGET "${3RD_PARTY_LIB}" PROPERTY FOLDER)
        set_target_properties(${3RD_PARTY_LIB} PROPERTIES FOLDER "3rdparty/${OLD_FOLDER}")
    endif()
endforeach()

之后我发现还有 utility 类型的工程,我就觉得不能单单看 library 了,应该是要有一个方法找到所有 target,然后从中排除掉不需要的 target,将剩下的所有 target 的 folder 属性更改

cmake 复制代码
function(get_all_targets var)
    set(targets)
    get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR})
    set(${var} ${targets} PARENT_SCOPE)
endfunction()

macro(get_all_targets_recursive targets dir)
    get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
    foreach(subdir ${subdirectories})
        get_all_targets_recursive(${targets} ${subdir})
    endforeach()

    get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
    list(APPEND ${targets} ${current_targets})
endmacro()
cmake 复制代码
# Set all 3rd party project to one folder
get_all_targets(ALL_TAR_LIST)
foreach(TAR ${ALL_TAR_LIST})
    if("${TAR}" STREQUAL "${RUNTIME_NAME}" OR "${TAR}" STREQUAL "${EDITOR_NAME}")
        continue()
    endif()

    # alias target can not call set_target_properties
    # interface library doesn't have folder property
    # so exclude them
    get_property(ALIAS TARGET "${TAR}" PROPERTY ALIASED_TARGET)
    if(NOT ("${ALIAS}" STREQUAL ""))
        continue()
    endif()
    get_target_property(3RD_PARTY_LIB_TYPE ${TAR} TYPE)
    if("${3RD_PARTY_LIB_TYPE}" STREQUAL "INTERFACE_LIBRARY")
        continue()
    endif()

    message(STATUS "Found target: ${TAR}")
    get_property(OLD_FOLDER TARGET "${TAR}" PROPERTY FOLDER)
    set_target_properties(${TAR} PROPERTIES FOLDER "3rdparty/${OLD_FOLDER}")
endforeach()
相关推荐
-凌凌漆-8 分钟前
【QML】qml和C++中同时使用单例模式
java·c++·单例模式
6Hzlia8 分钟前
【Hot 100 刷题计划】 LeetCode 101. 对称二叉树 | C++ DFS 极简递归模板
c++·leetcode·深度优先
誰能久伴不乏8 分钟前
Qt 混合编程核心原理:C++ 与 QML 通信机制详解
linux·c++·qt·架构·状态模式
ximu_polaris25 分钟前
设计模式(C++)-结构型模式-享元模式
c++·设计模式·享元模式
Hello!!!!!!27 分钟前
C++基础(五)——屏幕和文件输入输出
开发语言·c++·算法
ytttr87328 分钟前
C++ LZW 文件压缩算法实现
开发语言·c++
王老师青少年编程42 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:加工生产调度
c++·算法·贪心·csp·信奥赛·排序贪心·加工生产调度
小菜鸡桃蛋狗1 小时前
C++——vector
开发语言·c++·算法
FuckPatience1 小时前
Visual Studio的配置管理器
windows·visual studio
少司府1 小时前
C++基础入门:初识模板
开发语言·c++·c·模板·函数模板·类模板·泛型编程