如何让 CMake 在 IDE 中显示不属于任何二进制目标的标头

How to have CMake show headers-that are not part of any binary target-in the IDE?

本文关键字:二进制 任何 目标 不属于 显示 CMake IDE      更新时间:2023-10-16

在我们的工作流程中,我们可以有一个由多个头文件组成的模块A模块A不产生任何二进制文件(旁注:它显然会被其他模块使用,其中包括模块A中的一些头文件来生成二进制文件)。

一个很好的例子是仅标头库,由于INTERFACE库的概念,CMake 3 引入了很好的支持(请参阅此 SO 答案和 CMake 的功能文档)。

我们可以从模块 A 中创建一个接口库目标:

add_library(module_A INTERFACE)

这为我们提供了 CMakes 目标的所有漂亮功能(可以将其用作另一个目标的依赖项、导出它、传递转发需求等)。

但是在这种情况下,模块 A 中的标头不会显示在我们的 IDE 中(Xcode,但我们希望它与大多数/所有其他 IDE 相同)。

这被证明是工作流程中的一个主要缺点,因为我们需要在 IDE 中显示组成模块 A 的文件以进行编辑。有可能实现吗?

几个月

后,我没有找到直接列出INTERFACE库头文件的方法。

由于这个问题仍然有一些观点,这就是我最终所做的(即看起来像目前可用的较小黑客)。

假设模块 A 是一个仅标头库。在 CMakeList 中.txt声明其目标:

# Define 'modA_headers' variable to list all the header files
set(modA_headers 
  utility.h
  moreUtilities.h
  ...)
add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target
#
# From here, the target 'moduleA' can be customised
#
target_include_directories(moduleA ...) # Transitively forwarded
install(TARGETS moduleA ...)
#
#  HACK: have the files showing in the IDE, under the name 'moduleA_ide'
#
add_custom_target(moduleA_ide SOURCES ${modA_headers})

我不接受这个答案,因为我希望CMake的进一步版本能够提供一种语义上更正确的方法,然后将被接受:)

您可以在 CMake 3.1 中使用新的 target_sources 命令。

add_library(moduleA INTERFACE)
target_include_directories(moduleA INTERFACE ...)
target_sources(moduleA INTERFACE 
  ${CMAKE_CURRENT_SOURCE_DIR}/utility.h
  ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h
)

它也是可传递的。

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

CMake 3.3取消了无法导出已INTERFACE_SOURCES目标的限制。