模式文件的额外interface_include_directories。可能吗?

时间:2018-12-28 22:22:16

标签: cmake

我已经成功地使用target_include_directories()将使用要求传递给了相关的C ++库。一切都很好。但这是一个稍微不同的用例。

除了普通目录(即用于C / C ++标头的目录)之外,还有其他方法可以包含第二组包含目录吗?

如果您的C ++库是由模式语言(例如Protobuf,Capnproto)生成的,并且带有  add_custom_command()。模式文件可以通过import相互引用,因此我想将模式文件与库一起安装。

最好将有关模式文件目录以及C ++头目录的信息传递给从属库。

使用target_include_directories()跟踪不包含C / C ++头的目录可能是对该命令的滥用。但是也许还有其他方法可以实现这一目标?

编辑1

请澄清一下:我的目标是拥有两组目录路径,一组用于C ++包含头文件,另一组用于模式文件。 (模式文件和C ++头文件可能不在同一目录中)。属性INTERFACE_INCLUDE_DIRECTORIES将处理C ++标头,但是如何处理模式文件?

yet_to_be_written_ADD_CAPNP_TARGET(
  NAME target1 
  SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a1.capnp 
)
yet_to_be_written_ADD_CAPNP_TARGET(
  NAME target2 
  SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a2.capnp
  DEPENDENCIES target1
)

一种解决方法是让 yet_to_be_written_ADD_CAPNP_TARGET()创建两个库

add_library(${name}_cxx)
add_library(${name}_schema INTERFACE)

而不是一个库,因为那时我将拥有两个可以记住目录路径的INTERFACE_INCLUDE_DIRECTORIES${name}_schema的目的只是记住架构目录路径。以后可以通过生成器表达式检索它们  $<TARGET_PROPERTY:target2_schema,INTERFACE_INCLUDE_DIRECTORIES>

并在一个目录中提供给模式编译器(/usr/bin/capnp)  add_custom_command()

当然,如果所有架构文件都在手头的软件项目的源代码树中可用,那么整个过程就毫无意义,但是我想到的是从不同的外部软件项目中导入cmake目标的情况。模式文件可能安装在其他目录中。

另一种解决方法是直接指定外部架构目录路径(不使用目标来传递此信息)。

1 个答案:

答案 0 :(得分:0)

当然。我自己在ProtoBuf文件研究的项目中这样做:

set(Aperture_PROTO
    protoinclude/bcl.proto
    protoinclude/StratusAsset.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${Aperture_PROTO})

将原始文件列为源文件,以便它们与目标一起处理:

LIST(APPEND Aperture_SRCS ${Aperture_PROTO})

确保将HEADER_FILE_ONLY属性添加到文件组:

SET_SOURCE_FILES_PROPERTIES(${Aperture_PROTO}
                        PROPERTIES HEADER_FILE_ONLY TRUE)

使用source_group获得奖励积分,在IDE中对其进行分组:

source_group("Prototype Files" FILES ${Aperture_PROTO})