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()
相关推荐
apocelipes10 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
郝学胜_神的一滴2 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天2 天前
C++ 基础入门完全指南
c++
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK4 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境5 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境5 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴6 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境8 天前
C++ 的Eigen 库全解析
c++
卷无止境8 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端