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

How to include an external code generator in CMake?

我一直在研究 CMake 以试图理解它。据我了解,它在组合 C++ 包方面非常好。

但是,我不知道如何将代码生成器包含到其中。 使用 GNU Makefile,我会写一个简单的规则:

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

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

与Make不同,CMake既没有模式规则,也没有自动变量根据当前目标展开 命令.

相反,CMake 允许定义函数或宏,它封装了 目标 或具有相应内容的命令的创建。

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

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)

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


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

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

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