【发布时间】:2015-09-24 16:10:55
【问题描述】:
我目前正在开发一个使用 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)
在某些情况下,如果模块 B 存在,我想检查模块 A,并向模块 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)
command 将返回 false,因为这只有在模块以正确的顺序添加到根 CMakeLists.txt 时才有效。
cmake 中是否有另一个不依赖于目标顺序的检查?
问候 佩里
【问题讨论】:
-
CMake 进程配置阶段按顺序进行。所以,当
A/CMakeLists.txt正在处理时,CMake没有任何信息,B/CMakeLists.txt是否会被处理。以正确的顺序枚举它们是模块集成商的问题。 -
欢迎来到 StackOverflow。当我写一个关于如何处理你的 CMake 问题的答案时,我在想你的问题可能有一个 C++ 解决方案。一种解决方案是使用dependency injection pattern 吗?带有
#ifdef HAVE_B签入的东西可能比使用接口的东西更难进行单元测试。