CMake动态生成的头依赖项

时间:2012-11-17 02:03:30

标签: cmake

我有两个静态库: libfoo libbar ,每个都在自己的目录中。

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

libbar 包含includes/目录,其中包含单个文件C.h。它还包含一个sources/目录,其中包含C.c。此文件包含A.h libfoo 中的B.h

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

文件层次结构:

/
  libfoo/
    includes/
      A.h
    sources/
      A.c
      B.gen
    CMakeLists.txt
  libbar/
    includes/
      C.h
    sources/
      C.c
    CMakeLists.txt

1 个答案:

答案 0 :(得分:1)

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

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

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

    add_custom_command(OUTPUT B.h                    命令我的B.gen B.h.                    DEPENDS B.gen)

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

  3. CMake依赖解析器现在,一旦想要构建C.c,就会分析其内容,并发现构建它需要B.h.使用add_custom_command,您已告诉它如何创建该标头,它将调用您的生成器。

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