【问题标题】:Execute output of cmake target as dependency for another执行 cmake 目标的输出作为另一个的依赖项
【发布时间】:2017-10-05 19:26:08
【问题描述】:

我的目录结构如下:

.
├── CMakeLists.txt
├── generator
│   ├── CMakeLists.txt
│   └── main.cpp
├── include
└── src
    ├── CMakeLists.txt
    └── mylib.cpp

我想构建generator,然后使用生成器生成将用于构建mylib 的源文件。我试过这个:

生成器/CMakeLists.txt:

add_executable(gen main.cpp)

add_custom_command(
    OUTPUT
        ${CMAKE_BINARY_DIR}/generated.cpp
    DEPENDS
        gen
    COMMAND
        ${CMAKE_BINARY_DIR}/gen -d /tmp
    VERBATIM
)

src/CMakeLists.txt:

add_library(py-cppast
        ${CMAKE_BINARY_DIR}/generated.cpp
        mylib.cpp)

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1.2)
project(my-project)

add_subdirectory(generator)    
add_subdirectory(src)

但是,该命令未执行。相反,我只是得到错误:

src/CMakeLists.txt:2 (add_library) 处的 CMake 错误: 找不到源文件: /home/....(cmake 二进制目录)..../generated.cpp 尝试过扩展 .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx

如何告诉 cmake 执行我正在使用它构建的程序?这甚至可以在单个构建中实现吗?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    问题在于您在一个目录中生成文件generated.cpp,然后尝试将其添加到另一个目录中定义的目标。 CMake 仅支持将生成的文件添加到 same 目录范围内定义的目标。 add_custom_command() 文档明确提到了这个限制。

    您可能希望将generated.cpp 的生成移动到src 目录中。您还应该只使用gen 目标名称来引用要运行的可执行文件,而不是${CMAKE_BINARY_DIR}/gen,这对于所有CMake 生成器类型都不正确。使用当前二进制目录而不是顶级二进制目录作为输出目录也是更好的风格。你的src/CMakeLists.txt 应该是这样的:

    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated.cpp
        DEPENDS gen
        COMMAND gen -d /tmp
        VERBATIM
    )
    add_library(py-cppast
        ${CMAKE_CURRENT_BINARY_DIR}/generated.cpp
        mylib.cpp
    )
    

    CMake 会自动为您替换 gen 目标的位置,即使它是在不同的目录中定义的。在使用生成的源时,还需要注意一些更细微的地方,尤其是与依赖关系有关的地方。您可能会发现this article 有助于填补一些空白。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多