utils cmake module

BuildFlatBuffers.cmake

此文件来源于 https://github.com/google/flatbuffers/blob/bd1b2d0bafb8be6059a29487db9e5ace5c32914d/CMake/BuildFlatBuffers.cmake#L50

在 ubuntu 系统中,使用 sudo apt install libflatbuffers-dev flatbuffers-compiler 安装好相应的依赖之后,会发现在系统目录下:

/usr/lib/x86_64-linux-gnu/cmake/flatbuffers/
├── FlatbuffersConfig.cmake
├── FlatbuffersConfigVersion.cmake
├── FlatbuffersSharedTargets.cmake
├── FlatbuffersSharedTargets-none.cmake
├── FlatbuffersTargets.cmake
├── FlatbuffersTargets-none.cmake
├── FlatcTargets.cmake
└── FlatcTargets-none.cmake

并不存在上面这个这么好用的 cmake module,所以需要自己下载使用

How to use

一个简单的示例: https://github.com/HRXWEB/build_flatbuffer_example

目录结构如下:

examples/
├── cmake
│   └── BuildFlatBuffers.cmake
├── CMakeLists.txt
├── flatbuffers
│   ├── ArrowPrimitive.fbs
│   ├── ByteVector.fbs
│   ├── CameraCalibration.fbs
│   ├── CircleAnnotation.fbs
│   ├── Color.fbs
│   ├── CompressedImage.fbs
│   ├── CubePrimitive.fbs
│   ├── CylinderPrimitive.fbs
│   ├── Duration.fbs
│   ├── FrameTransform.fbs
│   ├── FrameTransforms.fbs
│   ├── GeoJSON.fbs
│   ├── Grid.fbs
│   ├── ImageAnnotations.fbs
│   ├── KeyValuePair.fbs
│   ├── LaserScan.fbs
│   ├── LinePrimitive.fbs
│   ├── LocationFix.fbs
│   ├── Log.fbs
│   ├── ModelPrimitive.fbs
│   ├── PackedElementField.fbs
│   ├── Point2.fbs
│   ├── Point3.fbs
│   ├── PointCloud.fbs
│   ├── PointsAnnotation.fbs
│   ├── Pose.fbs
│   ├── PoseInFrame.fbs
│   ├── PosesInFrame.fbs
│   ├── Quaternion.fbs
│   ├── RawImage.fbs
│   ├── SceneEntityDeletion.fbs
│   ├── SceneEntity.fbs
│   ├── SceneUpdate.fbs
│   ├── SpherePrimitive.fbs
│   ├── TextAnnotation.fbs
│   ├── TextPrimitive.fbs
│   ├── Time.fbs
│   ├── TriangleListPrimitive.fbs
│   ├── Vector2.fbs
│   └── Vector3.fbs
└── src
    ├── example_server_flatbuffers.cpp

主要重点关注 CMakeLists.txt 的内容

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(Examples CXX)
 
set(CMAKE_CXX_STANDARD 17)
 
find_package(Flatbuffers REQUIRED)
 
include(cmake/BuildFlatBuffers.cmake)
FILE(GLOB flatbuffers_schemas "flatbuffers/*.fbs")
build_flatbuffers(
    "${flatbuffers_schemas}" # flatbuffers_schemas
    flatbuffers # schema_include_dirs
    flatbuffers_generated_schemas # custom_target_name
    "" # additional_dependencies
    ${CMAKE_BINARY_DIR}/autogenerated_flatbuffers # generated_includes_dir
    ${CMAKE_BINARY_DIR}/autogenerated_flatbuffers # binary_schemas_dir
    "" # copy_text_schemas_dir
)
 
add_executable(example_server_flatbuffers src/example_server_flatbuffers.cpp)
add_dependencies(example_server_flatbuffers flatbuffers_generated_schemas)
target_link_libraries(example_server_flatbuffers flatbuffers::flatbuffers)

重点就是 build_flatbuffers 的使用方法,传入的几个变量作用如下:

  • flatbuffers_schemas : schema 文件的所在处,使用通配符
  • schema_include_dirs : 告诉 flatc 去哪里寻找包含 schema 的目录,类似头文件,因为 schema 可能引用了其他的基础的 schema
  • custom_target_name : 指定生成的 target 的命令
  • additional_dependencies : 其他的依赖,暂时没有需要,不清楚其作用
  • generated_includes_dir : 生成的头文件所在的目录
  • binary_schemas_dir : 生成的二进制 bfbs 文件所在的目录
  • copy_text_schemas_dir : 暂时没用到,不知道作用

example_server_flatbuffers 这个 target 单纯只是为了触发生成 flatbuffers_generated_schemas ,如果没有 add_dependencies(example_server_flatbuffers flatbuffers_generated_schemas) ,根据 CMake 的构建规则,如果用不上的话就不会构建,就没法触发 flatc 的代码自动生成。