如何获取ExternalProject定义的目标的输出路径?

时间:2017-12-26 14:50:18

标签: c++ xcode cmake flatbuffers

我正在构建Google的FlatBuffers作为我自己项目的依赖项,我需要在构建时编译模式。我不想使用BuildFlatBuffers.cmakeFindFlatBuffers.cmake,因为我使用的是特定版本,我不能依赖它在本地安装。

这是我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}
)

它适用于Make和Ninja但在Xcode中失败,Xcode在flatc目录中构建Debug

我想到了这些可能的解决方案:

  • 使用add_subdirectory代替ExternalProject_Add,以便我可以使用${FLATBUFFERS_FLATC_EXECUTABLE}$<TARGET_FILE:flatc>;
  • RUNTIME_OUTPUT_DIRECTORY;
  • 手动分配flatbuf
  • 在多个路径中搜索flatc(不可移植;我也不知道如何在构建时实现)。

我尝试过(2)和(3)但没有成功。至于(1),我不确定这是个好主意。如何以可移植的方式构建模式?

2 个答案:

答案 0 :(得分: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}
)

note2:

  

如果COMMAND指定了可执行目标名称(由add_executable()命令创建),它将自动替换为在构建时创建的可执行文件的位置。如果设置,CROSSCOMPILING_EMULATOR可执行目标属性也将添加到命令前面,以允许可执行文件在主机上运行。此外,还将添加目标级依赖关系,以便在此自定义目标之前构建可执行目标。

注3: 令人遗憾的是,目标ALIAS无法处理IMPORTED目标......

答案 1 :(得分:0)

显然,CMake提供了一个变量来解决这个确切的问题,即CMAKE_CFG_INTDIRdocs)。然后,flatc可执行文件的路径应为

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