我想要将所有 Target 的工程在 Visual Studio 中加到同一个文件夹
一开始我想要重写 add_library 函数,来获取到那些 lib 添加了,进而获得所有的 library,存到一个 list 里面,最后对这个 list 遍历,设置 folder文章来源:https://www.toymoban.com/news/detail-705191.html
# 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()
# 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 属性更改文章来源地址https://www.toymoban.com/news/detail-705191.html
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()
# 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()
到了这里,关于CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!