如何以编程方式循环访问所有 CMake 目标
How do I iterate over all CMake targets programmatically?
有没有办法从顶级CMakeLists.txt
中获取CMake项目的所有目标,即以编程方式迭代目标?
我想这样做的原因是将一些 XCode 特定的设置应用于每个目标......
if (CMAKE_GENERATOR MATCHES "Xcode")
include(sanitize_xcode)
sanitize_xcode(myTarget)
endif()
仅供参考 - 消毒模块看起来像这样. .
macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
endmacro (set_xcode_property)
macro (sanitize_xcode TARGET)
set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES")
set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=MinSizeRel] "NO")
set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES")
set_xcode_property(${TARGET} GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "NO")
set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=Debug] "NO")
set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=MinSizeRel] "YES")
set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=RelWithDebInfo] "NO")
set_xcode_property(${TARGET} COPY_PHASE_STRIP[variant=Release] "YES")
set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=Debug] "0")
set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=MinSizeRel] "s")
set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=RelWithDebInfo] "3")
set_xcode_property(${TARGET} GCC_OPTIMIZATION_LEVEL[variant=Release] "3")
set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=Debug] "7.0")
set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=MinSizeRel] "7.0")
set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=RelWithDebInfo] "7.0")
set_xcode_property(${TARGET} IPHONEOS_DEPLOYMENT_TARGET[variant=Release] "7.0")
endmacro (sanitize_xcode)
更正 Florian 的答案,BUILDSYSTEM_TARGETS 不是一个真正的全局属性,而是一个目录范围的属性。目前正在接受增强请求,以请求真正的全球财产。使用 SUBDIRECTORY 属性,可以使用以下函数递归检索当前目录范围内的所有目标:
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()
get_all_targets(all_targets)
message("All targets: ${all_targets}")
将我的评论变成答案
列出所有目标的愿望已经存在了一段时间,但全球财产TARGETS
尚未实施(至于2016年5月,请参阅"列出所有目标"讨论)。
编辑:现已实现:全局BUILDSYSTEM_TARGETS
属性已随CMake 3.7一起发布
因此,您可以使用 CMake 脚本本身自己实现这一点 - @DevSolar注释/回答或像这里一样 - 但我在使用 CMake 的过程中了解到,您也可以全局更改许多目标属性。 例如,大多数目标属性默认为等效的全局变量设置。
您可以在您的案例中利用这一点,并通过将以下内容添加到全局CMakeLists.txt
文件中来解决此问题:
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES")
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=MinSizeRel] "NO")
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES")
set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "NO")
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=Debug] "NO")
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=MinSizeRel] "YES")
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=RelWithDebInfo] "NO")
set(CMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=Release] "YES")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=Debug] "0")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=MinSizeRel] "s")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=RelWithDebInfo] "3")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=Release] "3")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=Debug] "7.0")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=MinSizeRel] "7.0")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=RelWithDebInfo] "7.0")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET[variant=Release] "7.0")
引用
-
XCODE_ATTRIBUTE_<an-attribute>
-
CMAKE_XCODE_ATTRIBUTE_<an-attribute>
如果要
查看目标列表,请首先设置CMakeLists.txt以提供该列表。
if ( CMAKE_GENERATOR MATCHES "Xcode" )
include(sanitize_xcode)
endif()
# A list of executables to build
set( project_EXECUTABLES
foo
bar
)
# List of sources for each executable, following some naming scheme
# foo
set( EXE_foo_SOURCES
foo/main.c
)
# bar
set( EXE_bar_SOURCES
bar/main.c
)
# For each executable in the list...
foreach( exe ${project_EXECUTABLES} )
# declare the target...
add_executable( ${exe} ${EXE_${exe}_SOURCES} )
# ...and do whatever additional configuration you need
if ( CMAKE_GENERATOR MATCHES "Xcode" )
sanitize_xcode( ${exe} )
endif()
endforeach()
相关文章:
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何在 CMake 中对目标依赖项进行分组?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 在对象库中包含 CMake 目标的标头
- 导出(安装)的 cmake 目标是否可分发?
- CMAKE 目标链接打开 SSL 错误
- 在构建 Android 应用程序时禁用 CMake 目标
- 安装了要来源的特征cmake目标点包括但不安装
- 是否可以在编译后创建 CMake 目标和文件目录?
- 执行CMAKE目标的输出作为另一个目标的依赖
- 如何使用于 catch2 测试和项目运行的 cmake 目标更具可扩展性和合理性?
- 链接到CMake目标会产生什么影响
- 如何在 CMake 目标上请求 C++11 或更高版本
- 在特定的CMAKE目标之前运行NPM命令
- 如何以编程方式循环访问所有 CMake 目标
- CMAKE:目标依赖项存在问题(add_dependency不起作用?
- 如何为主机应用程序和任何使用过的库使用单独的CMake目标
- 如何在另一个CMake目标中加载主应用程序的接口类
- 根据cmake目标启用宏
- 在cmake目标的解决方案资源管理器中添加一些源文件的头依赖项