【问题标题】:How to include an external code generator in CMake?如何在 CMake 中包含外部代码生成器?
【发布时间】:2019-08-28 20:04:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: cmake gnu-make flatbuffers


    【解决方案1】:

    与Make不同,CMake既没有pattern规则,也没有自动变量,它们根据当前的target命令展开.

    相反,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)
    

    【讨论】:

    • 这不会导致在 CMake 的配置时进行编译吗?
    • add_custom_commandconfigure 阶段处理时,其命令在 build 阶段 运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2011-07-05
    • 2015-09-21
    相关资源
    最近更新 更多