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()
相关推荐
apcipot_rain1 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克6052 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_6782 小时前
深挖C++:类和对象(中)
开发语言·c++
D e re k ZH4 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai10076 小时前
【Effective Modern C++】学习第一章
c++
Fruiticecake6 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
坤坤子吖10 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢10 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公