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

C++ 如何获取ExternalProject定义的目标的输出路径?,c++,xcode,cmake,flatbuffers,C++,Xcode,Cmake,Flatbuffers,我正在构建Google的FlatBuffers作为我自己项目的依赖项,我需要在构建时编译一个模式。我不想使用BuildFlatBuffers.cmake或FindFlatBuffers.cmake,因为我使用的是一个特定的版本,我不能依赖它在本地安装 这是myCMakeLists.txt的简化版本: ExternalProject_Add ( flatbuf URL "https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz"

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

这是my
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在
Debug
目录中构建
flatc

我考虑了以下可能的解决方案:

  • 使用
    add_subdirectory
    而不是
    ExternalProject_add
    ,这样我就可以使用
    ${FLATBUFFERS\u FLATC\u EXECUTABLE}
    $
  • 手动为
    flatbuf
    分配
    RUNTIME\u OUTPUT\u目录
    
  • 在多个路径中搜索
    flatc
    (不可移植;我也不知道如何在构建时实现)
我试了(2)和(3),但没有成功。至于(1),我不确定这是个好主意。如何以可移植的方式构建模式?

您可以使用类似这样的方法

注意:我想您甚至不需要安装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()命令创建),则该名称将自动替换为生成时创建的可执行文件的位置。如果设置了,交叉编译\u EMULATOR可执行文件目标属性也将添加到命令之前,以允许可执行文件在主机上运行。此外,还将添加一个目标级依赖项,以便在该自定义目标之前构建可执行目标

注3:
不幸的是,目标别名无法在导入的目标上工作…

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

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

不太确定Xcode中的问题是什么。如果你真的被卡住了,你可以做的一件事就是看看它能做什么,因为它也依赖于FlatBuffers,至少用于在所有平台上平等构建,包括Xcode。Xcode的问题是它在不同的目录中构建flatc:它没有将flatc放入
flatbuf build/
而是进入
flatbuf build/build/
。不仅构建外部项目,而且安装它。这个项目完全定义了它的安装布局,一个构建工具(在你的例子中是XCode)不会改变它。这是有意义的。那么,我应该设置哪些变量使安装目录在所有构建系统中都相同?注意:Xcode中flatc的路径是
flatbuf build/Debug/
,而不是
flatbuf build/build/
。这是一个输入错误。最后我可以用
CMAKE\u CFG\u INTDIR
来完成,但是使用
ExternalProject\u Get\u属性来代替硬编码构建路径也是一个好主意。