如何在CMake中包含外部代码生成器?

时间:2019-04-07 15:09:29

标签: cmake gnu-make flatbuffers

我一直在研究CMake试图理解它。据我了解,它在结合C ++软件包方面确实很棒。

但是,我没有看到如何在其中包含代码生成器。 使用GNU Makefile,我会写一个简单的规则:

%.h: %.fbs
    flatc ... $< -o $@

如何在CMake中编写相同的规则?

1 个答案:

答案 0 :(得分:2)

与Make不同,CMake既没有根据当前 target 命令扩展的 pattern 规则和自动变量

相反,CMake允许定义一个函数或宏,该函数或宏封装了 target 或具有相应内容的命令的创建。

您的命令可以包装到以下函数中:

function(add_fbs_header name)
  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}.h
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.fbs
    COMMAND flatc ${CMAKE_CURRENT_SOURCE_DIR}/${name}.fbs -o ${CMAKE_CURRENT_BINARY_DIR}/${name}.h
    )
endfunction(add_fbs_header name)

具有临时用途:

# equivalent to
#   flatc <source_dir>/foo.fbs -o <binary_dir>/foo.h
# with proper dependencies and output.
add_fbs_header(foo)

BTW,FindFlatBuffers.cmake脚本中已经提供了使用FlatBuffers生成头文件的功能,该脚本随FlatBuffers软件包一起提供。


对于包含FindXXX.cmake脚本,请使用find_package(XXX)

使用add_custom_command创建的命令仅在某些目标(或其他命令)取决于命令的输出时才执行。例如。以给定的方式:

add_fbs_header(foo)
add_executable(my_exe my.cpp foo.h)