2017-05-07 41 views
3

我有以下的目录结构:执行cmake的目标的输出作为依赖于另一

. 
├── 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) 

但是,命令是没执行。相反,我刚刚得到的错误:

 
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的执行,我用它开发程序?这是甚至可能在一个单一的构建?

回答

1

的问题来自于事实,你生成一个目录中的文件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有助于填补一些空白。