2017-12-26 6 views
0

Ich baue Googles FlatBuffers als eine Abhängigkeit für mein eigenes Projekt und ich muss ein Schema zur Build-Zeit kompilieren. Ich möchte nicht BuildFlatBuffers.cmake oder FindFlatBuffers.cmake verwenden, weil ich eine bestimmte Version verwende und ich kann nicht darauf verlassen, dass es lokal installiert ist.Wie erhält man den Ausgabepfad eines von ExternalProject definierten Zieles?

Dies ist eine vereinfachte Version meiner CMakeLists.txt:

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} 
) 

Es funktioniert gut für Make und Ninja, aber nicht in Xcode, die flatc im Debug Verzeichnis erstellt.

dachte ich über diese möglichen Lösungen:

  • Verwendung add_subdirectory statt ExternalProject_Add so dass ich ${FLATBUFFERS_FLATC_EXECUTABLE} oder $<TARGET_FILE:flatc> verwenden kann;
  • manuell zuweisen RUNTIME_OUTPUT_DIRECTORY für flatbuf;
  • Suche nach flatc in mehreren Pfaden (nicht tragbar; ich weiß auch nicht, wie man es zur Bauzeit passieren kann).

Ich versuchte (2) und (3) aber ohne Erfolg. Was (1) angeht, ich bin mir nicht sicher, ob das eine gute Idee ist. Wie kann ich Schemas auf tragbare Weise erstellen?

+0

Nicht ganz sicher, was das Problem in Xcode ist. Eine Sache, die Sie tun können, wenn Sie wirklich feststecken, ist, was https://github.com/google/fplbase tut, da es auch von FlatBuffers abhängt und mindestens verwendet wird, um auf allen Plattformen gleichermaßen zu erstellen, einschließlich Xcode. – Aardappel

+0

Das Problem mit Xcode ist, dass es flatc in einem anderen Verzeichnis erstellt: anstatt flatc in 'flatbuf-build /' zu haben, geht es in 'flatbuf-build/Build /'. –

+1

Nicht nur * bauen * das externe Projekt, sondern ** installieren ** es. Das Projekt definiert vollständig sein Installationslayout, ein Build-Tool (in Ihrem Fall XCode) ändert es nicht. – Tsyvarev

Antwort

1

Sie können ExternalProject_Get_Property, so etwas wie dieses verwenden ...

Anmerkung: Ich nehme an, Sie haben nicht einmal flatbuf installieren müssen, nur um es bauen und nutzen.

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} 
) 

Hinweis 2:

Wenn Befehl gibt einen ausführbaren Zielnamen (von der add_executable() Befehl erzeugt) wird automatisch durch die Lage der bei der Erstellung erstellt ausführbare ersetzt werden. Wenn diese Eigenschaft gesetzt ist, wird die ausführbare Zieleigenschaft CROSSCOMPILING_EMULATOR ebenfalls dem Befehl vorangestellt, damit die ausführbare Datei auf dem Host ausgeführt werden kann. Außerdem wird eine Abhängigkeit auf Zielebene hinzugefügt, sodass das ausführbare Ziel vor diesem benutzerdefinierten Ziel erstellt wird.

Anmerkung3: Ziel ALIAS arbeiten leider nicht auf IMPORTED Ziel ...

+0

Am Ende könnte ich es mit 'CMAKE_CFG_INTDIR' tun, aber' ExternalProject_Get_Property' anstelle von hart-Codierung der Build-Pfad ist auch eine gute Idee. –

0

Anscheinend CMake liefert eine variable genau dieses Problem zu lösen, das heißt CMAKE_CFG_INTDIR (docs). Der Pfad zur ausführbaren Datei flatc sollte dann

ExternalProject_Get_Property(flatbuf BINARY_DIR) 
set (FLATC "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/flatc") 
Verwandte Themen