在我们的工作流程中,我们可以有一个由几个头文件组成的模块A,模块A不产生任何二进制文件(注意:它显然会被其他模块使用,包括来自模块A的一些头文件来产生二进制文件) 。
一个很好的例子是仅 header 的库,由于INTERFACE
库的概念(请参阅this SO answer和CMake的documentation of the feature),CMake 3引入了良好的支持。
我们可以使模块A之外的接口(interface)库成为目标:
add_library(module_A INTERFACE)
这为我们提供了CMakes目标的所有出色功能(可以将其用作另一个目标的依赖项,将其导出,以传递方式转发需求等)。
但是在这种情况下,模块A中的 header 不会显示在我们的IDE中(Xcode,但我们希望它与大多数/其他所有IDE相同)。
事实证明,这是工作流程中的一个主要缺陷,因为我们需要在IDE的版本中显示组成模块A的文件。有可能实现这一目标吗?
最佳答案
几个月后,我没有找到直接列出INTERFACE
库的头文件的方法。
由于该问题仍然有一些观点,因此这就是我最后要做的事情(即看起来像当前可用的较小的hack)。
想象一下,模块A是仅 header 的库。在CMakeLists.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的进一步发行版可以提供一种在语义上更正确的方法,然后该方法将被接受:)