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()
相关推荐
普通网友2 小时前
高性能TCP服务器设计
开发语言·c++·算法
普通网友2 小时前
C++与硬件交互编程
开发语言·c++·算法
Elias不吃糖2 小时前
整合了c++里面常用的STL及其常用API
开发语言·c++·学习·stl
FLPGYH3 小时前
BMC 深度解析:服务器带外管理的核心技术架构与实践
linux·服务器·c++·驱动开发
普通网友4 小时前
内存对齐与缓存友好设计
开发语言·c++·算法
普通网友5 小时前
C++编译期数据结构
开发语言·c++·算法
代码程序猿RIP5 小时前
【C++开发面经】全过程面试问题详解
java·c++·面试
普通网友5 小时前
嵌入式C++安全编码
开发语言·c++·算法
云知谷5 小时前
【软件测试】《集成测试全攻略:Mock/Stub 原理 + Postman/JUnit/TestNG 实战》
c语言·开发语言·c++·软件工程·团队开发
普通网友6 小时前
分布式锁服务实现
开发语言·c++·算法