c – 执行cmake target的输出作为另一个的依赖

我有以下目录结构:

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

我想构建生成器,然后使用生成器生成将用于构建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)

但是,该命令不会执行.相反,我只是得到错误:

CMake Error at src/CMakeLists.txt:2 (add_library):
  Cannot find source file:

    /home/....(the cmake binary dir)..../generated.cpp

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

我如何告诉cmake执行我正在构建的程序?这在单一构建中是否可行?

最佳答案 问题来自于您在一个目录中生成文件generated.cpp,然后尝试将其添加到在不同目录中定义的目标. CMake仅支持将生成的文件添加到在同一目录范围中定义的目标.
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有助于填补一些空白.

点赞