我正在构建Google的FlatBuffers作为我自己项目的依赖项,我需要在构建时编译模式。我不想使用BuildFlatBuffers.cmake
或FindFlatBuffers.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),我不确定这是个好主意。如何以可移植的方式构建模式?
答案 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_INTDIR
(docs)。然后,flatc
可执行文件的路径应为
ExternalProject_Get_Property(flatbuf BINARY_DIR)
set (FLATC "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/flatc")