CMake动态生成的头依赖项

Maë*_*son 6 cmake

我有两个静态库:libfoolibbar,每个都在自己的目录中.

libfoo包含一个includes/包含单个文件的目录A.h.它还包含一个包含的sources/目录B.gen.自定义规则应创建新标头B.h和新源文件B.c.

libbar包含一个includes/包含单个文件的目录C.h.它还包含一个包含的sources/目录C.c.该文件包含A.hB.h来自libfoo.

问题是:根据这些规则,我如何编写两个库的CMakeFiles.txt(根据我的理解,棘手的部分是将所有libfoo头文件放在同一目录中,但也许我误导了)?

文件层次:

/
  libfoo/
    includes/
      A.h
    sources/
      A.c
      B.gen
    CMakeLists.txt
  libbar/
    includes/
      C.h
    sources/
      C.c
    CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

lan*_*tar 3

您不应将任何生成的文件复制到源目录。源目录和构建目录之间的分离是有意的,称为源外构建,以免在构建过程中使用生成的文件污染源目录。

在这种情况下你需要做的是:

  1. 定义一个自定义命令,使用 add_custom_command 将 B.gen 转换为 Bh 文件。这将在 CMAKE_CURRENT_BINARY_DIR 中生成 Bh,它反映了 CMakeLists.txt 相对于项目根 CMakeLists.txt 所在的源目录。它看起来像这样:

    add_custom_command(输出 Bh 命令 my-gen B.gen Bh 取决于 B.gen)

  2. 使用 include_directories 函数将生成文件的文件夹添加到包含目录中。如果所有这些都是在单个 CMakeLists.txt 中完成的,您可以使用 include_directories(${CMAKE_CURRENT_BINARY_DIR})

一旦 CMake 依赖解析器想要构建 Cc,它就会分析其内容并找出构建它所需的 Bh。通过 add_custom_command,您已经告诉它如何创建该标头,它将调用您的生成器。

您应该看看 CMake 中的源代码构建如何工作,以正确理解文件夹层次结构。