web-dev-qa-db-ja.com

CMakeにカスタムビルドステップを追加する

いくつかのファイルを生成するCMakeにカスタムビルドステップを追加しようとしています。どのように機能するかについての説明は見つかりませんでした。

ソース、ヘッダー、実装ファイルをODB for C++で生成する必要があるプロジェクトがあります。 ODBはクラスヘッダーを引数として取り、プロジェクトで使用するソースファイルを生成します。

現在、CMakeLists.txtに次のコマンドがあります。

add_custom_command(TARGET ${PROJECT_NAME}
    PRE_BUILD
    COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
    DEPENDS ${PROJECT_NAME}
    VERBATIM
)

ファイルの場合、person.hpp ODBはperson-odb.hxxperson-odb.cxxperson-odb.ixxを生成する必要がありますが、使用したCMakeコマンドは何も生成しません。端末では、このコマンドは正常に機能します。

何が悪いのですか?

[〜#〜] edit [〜#〜]:次の行を追加することで問題を解決できます:

set(FAKE_TARGET fakeTarget)
add_custom_target(fakeTarget
    odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)
add_dependencies(${PROJECT_NAME} ${FAKE_TARGET})
15
David Bulczak

私にとっては、似たようなものを使って、私は単に使用します

add_custom_command(TARGET ${PROJECT_NAME}
    PRE_BUILD
    COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)

DEPENDSVERBATIMは使用しません。

DEPENDSオプションは、このオプションに指定したプロジェクトがビルドされた後にのみコマンドを実行する必要があることを指定します。

編集:

PRE_BUILDオプションはVisual Studio 7以降でのみサポートされていることに注意してください。他のすべてのジェネレータでは、PRE_BUILDはPRE_LINKとして扱われます。

多分それがあなたにとってうまくいかない理由です。

回避策は(少し醜い)かもしれません:

  • 偽のプロジェクトを作成する
  • カスタムコマンドをPOST_BUILDとして追加します
  • 現在のプロジェクトを偽物に依存させる
16

私がそれを使っている方法は:

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
    COMMAND xsltproc --output ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp ${CMAKE_SOURCE_DIR}/xml/genictabc.xslt ${CMAKE_SOURCE_DIR}/xml/icminstr.xml
)

add_executable(
    du4

    ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
    .
    .
    .
)

重要なのは、.hppファイルもadd_executableブロックに追加することでした。

3
graywolf