2017-05-07 30 views
3

のための依存関係としてcmakeのターゲットの出力を実行します。私はこれを試してみました:は、私は次のディレクトリ構造を持っている別の

ジェネレータ/ 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 

私はそれを使ってビルドしているプログラムを実行するにはどうしたらよいですか?これは単一ビルドでも可能ですか?

答えて

1

問題は、ファイルgenerated.cppを1つのディレクトリに生成し、それを別のディレクトリに定義されているターゲットに追加しようとしていることに起因します。 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があります。

関連する問題