2017-12-26 8 views
0

私は自分のプロジェクトの依存関係としてGoogleのFlatBuffersを構築しており、ビルド時にはスキーマをコンパイルする必要があります。私はBuildFlatBuffers.cmakeまたはFindFlatBuffers.cmakeを使用したくないのですが、私は特定のバージョンを使用しているため、ローカルにインストールされているため信頼できません。ExternalProjectで定義されたターゲットの出力パスを取得するには?

これは私のCMakeLists.txtの簡易版である:それはメイクや忍者のために正常に動作しますが、Debugディレクトリにflatcを構築するXcodeの、に失敗し

ExternalProject_Add (
    flatbuf 
    URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz" 
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 
) 
add_custom_target (
    flatbuf_schema 
    PREFIX ${FLATBUF_PREFIX} 
    DEPENDS flatbuf 
    COMMAND ${FLATBUF_PREFIX}/src/flatbuf-build/flatc --cpp ${FLATBUF_SCHEMA} 
) 

私は、これらの可能な解決策について考えた:私は${FLATBUFFERS_FLATC_EXECUTABLE}または$<TARGET_FILE:flatc>を使用できるように

  • add_subdirectoryの代わりExternalProject_Addを使用します。
  • flatbufにはRUNTIME_OUTPUT_DIRECTORYを手動で割り当てます。
  • flatcを複数のパスで検索します(ポータブルではありませんが、ビルド時にそれを実現する方法もわかりません)。

私は(2)と(3)を試みましたが、成功しませんでした。 (1)については、それが良い考えであるかどうかはわかりません。どのようにして移植可能な方法でスキーマを構築できますか?

+0

である必要があります。Xcodeの問題点は不明です。あなたが本当に立ち往生した場合にできることの1つは、https://github.com/google/fplbaseの機能をチェックすることです。これはFlatBuffersにも依存し、少なくともXcodeを含めてすべてのプラットフォームで同じように構築していました。 – Aardappel

+0

Xcodeの問題点は、flatcを 'flatbuf-build /'にする代わりに 'flatbuf-build/Build /'に入るということです。 –

+1

*外部プロジェクトをビルドするだけでなく、**インストールします。プロジェクトがインストールレイアウトを完全に定義すると、ビルドツール(あなたのケースではXCode)はそれを変更しません。 – Tsyvarev

答えて

1

あなたは、このような何かをExternalProject_Get_Propertyを使用することができます...

注:私はあなたもそれを構築し、それを使用し、flatbufをインストールする必要はありませんと仮定します。

ExternalProject_Add (
    flatbuf_project 
    URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz" 
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 
    INSTALL_COMMAND "" 
) 

ExternalProject_Get_Property(flatbuf_project source_dir) 
ExternalProject_Get_Property(flatbuf_project binary_dir) 

# Export flatbuf executable to consume schema file during build 
add_executable(flatbuf::flatbuf IMPORTED) 
set_target_properties(flatbuf::flatbuf PROPERTIES IMPORTED_LOCATION 
    "${binary_dir}/flatc") 
add_dependencies(flatbuf::flatbuf flatbuf_project) 

add_custom_target(flatbuf_schema 
    PREFIX ${FLATBUF_PREFIX} 
    COMMAND flatbuf::flatbuff --cpp ${FLATBUF_SCHEMA} 
) 

注2:コマンドが(add_executable()コマンドによって作成された)実行可能なターゲット名を指定している場合

それは自動的にビルド時に作成された実行可能ファイルの場所に置き換えられます。設定されている場合、CROSSCOMPILING_EMULATOR実行可能ターゲットプロパティもコマンドに付加され、ホスト上で実行可能ファイルを実行できるようになります。さらに、実行可能なターゲットがこのカスタムターゲットの前にビルドされるように、ターゲットレベルの依存関係が追加されます。

注3: ターゲットエイリアス残念なことにIMPORTEDターゲットで動作していない...

+0

最後に 'CMAKE_CFG_INTDIR'でそれを行うことができましたが、ビルドパスをハードコーディングする代わりに' ExternalProject_Get_Property'を使うことも良い考えです。 –

0

明らかCMakeのは、この正確な問題を解決するための変数を提供し、すなわちCMAKE_CFG_INTDIRdocs)。 flatc実行ファイルへのパスは、

ExternalProject_Get_Property(flatbuf BINARY_DIR) 
set (FLATC "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/flatc") 
関連する問題