gpt4 book ai didi

c++ - 检查 cmake 中顺序不正确的可选目标

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:25 24 4
gpt4 key购买 nike

我目前正在从事一个使用 cmake 作为构建系统的大型软件项目。但是我有一个问题要检查另一个目标是否存在(或将存在)。

例如,有根 CMakeLists.txt 和两个可以选择作为子文件夹添加到软件项目的模块。

.
├── A
│   └── CMakeLists.txt
├── B
│   └── CMakeLists.txt
└── CMakeLists.txt

在根 CMakeLists 中,这些模块使用 add_subdirectory 命令添加:

cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
project(root)
add_subdirectory(./A)
add_subdirectory(./B)

在某些情况下,我想检查模块 A 是否存在模块 B,并在模块 A 的编译选项中添加一个定义:

cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
project(A)
add_libary(A a.cpp a.hpp)
if (TARGET B)
target_compile_definitions(A PUBLIC HAVE_B)
endif()

if(TARGET target-name)

命令将返回 false,因为这只有在模块以正确的顺序添加到根 CMakeLists.txt 时才有效。

cmake 中是否还有另一个不依赖于目标顺序的检查?

问候语佩里

最佳答案

这可以使用宏来解决。

想法是每个子目录必须有一个关联的顶级变量,其他子目录可以检查,因此它们必须在顶部 CMakeLists.txt 文件中声明。此外,所有变量都必须在 add_subdirectory 规则开始之前定义。

因此我们的宏将子目录列表作为参数,首先输出变量声明列表,然后输出子目录列表。

下面是这样一个宏的代码:

macro(declare_modules)
foreach(module ${ARGN})
set(TARGET_${module} yes)
endforeach()

foreach(module ${ARGN})
add_subdirectory(./${module})
endforeach()
endmacro(declare_modules)

可以这样使用:

declare_modules(A B C)

它会展开成下面的代码:

foreach(module A B C)
set(TARGET_${module} yes)
endforeach()

foreach(module A B C)
add_subdirectory(./${module})
endforeach()

这将导致变量 TARGET_ATARGET_BTARGET_C 被声明并设置为 yes,它们可以从所有模块。

添加新模块只是向 declare_modules 调用添加新参数的问题。

关于c++ - 检查 cmake 中顺序不正确的可选目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com