ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache Thrift 编译器(thrift-compiler)多平台构建指南:使用 CMake 从源码编译 IDL 编译器

Apache Thrift 编译器(thrift-compiler)多平台构建指南:使用 CMake 从源码编译 IDL 编译器 Apache Thrift 编译器thrift-compiler多平台构建指南使用 CMake 从源码编译 IDL 编译器【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/GitHub_Trending/thr/thriftApache Thrift 的 IDL 编译器thrift-compiler是整个代码生成链路的起点负责把.thrift接口定义文件解析为抽象语法树并为 30 余种语言生成对应的 RPC 与序列化代码。本文以 compiler/cpp/README.md 为核心系统讲解如何在 Unix-like 系统Linux/macOS与 Windows 上通过 CMake 构建该编译器并深入解读 compiler/cpp/CMakeLists.txt 中的关键机制、编译器单元测试的组织方式以及不依赖 CMake 的手工构建流程。读完本文你将能够在 Linux、macOS、WindowsGit Bash / Visual Studio / MinGW 交叉编译等环境中独立编译出可用的thrift可执行文件并理解其内部构建管线与测试体系。一、编译器源码结构速览在动手构建之前先了解编译器源码的组织方式有助于理解构建过程中 flex/bison 等工具的作用。入口与主流程src/thrift/main.cc 是编译器主引擎负责调度词法扫描、语法解析与代码生成其文件头注释明确指出invokes the scanner/parser to build the thrift object tree各语言生成器位于generate/目录所有解析结构体位于parse/目录词法扫描器src/thrift/thriftl.llflex 输入语法解析器src/thrift/thrifty.yybison/yacc 输入AST 数据结构src/thrift/parse/ 下存放t_program.h、t_struct.h、t_service.h、t_field.h等类型定义各语言代码生成器src/thrift/generate/ 下每个文件对应一种语言例如t_cpp_generator.cc、t_go_generator.cc、t_py_generator.cc、t_netstd_generator.cc等编译器审计工具src/thrift/audit/t_audit.cpp。由此可见flex 与 bison 是构建编译器所必需的解析器生成工具——这正是 README 将二者列为前置依赖的原因。二、构建前置条件无论哪个平台都需要先安装 CMakeCMake 官方下载地址https://cmake.org/download/README 中给出的官方来源flex 与 bisonUnix-like 系统下两者通常可通过系统包管理器安装Windows 下若不用 Git Bash则需要安装 winflexbison若使用 Visual Studio 构建需安装 Visual StudioREADME 建议使用最新稳定版 Visual Studio Community Edition并在 VS2017 中确保安装了 Desktop Development with C 工作负载从 CMakeLists.txt 可以看到构建脚本要求cmake_minimum_required(VERSION 3.16)并通过find_package(FLEX REQUIRED)与find_package(BISON REQUIRED)强制查找这两个工具缺失时 CMake 配置阶段会直接报错。三、在 Unix-like 系统上构建3.1 标准 CMake 构建流程进入compiler/cpp目录即仓库中的 compiler/cpp执行mkdir cmake-build cd cmake-build cmake .. make构建完成后可执行文件默认输出到构建目录下的bin/子目录并命名为thrift。这一行为由 CMakeLists.txt 中的配置决定add_executable(thrift-compiler ${thrift-compiler_SOURCES}) set_target_properties(thrift-compiler PROPERTIES RUNTIME_OUTPUT_DIRECTORY bin/) set_target_properties(thrift-compiler PROPERTIES OUTPUT_NAME thrift) target_link_libraries(thrift-compiler parse)也就是说CMake 目标名是thrift-compiler但最终生成的二进制文件名为thrift并链接了一个名为parse的静态库。parse库正是由 flex/bison 生成的thrifty.cc、thriftl.cc等文件编译而来的见下文构建管线解读。3.2 使用 Eclipse IDE 构建如果希望用 Eclipse CDT 打开工程进行开发调试可以生成 Eclipse 风格的工程文件mkdir cmake-ec cd cmake-ec cmake -G Eclipse CDT4 - Unix Makefiles .. make随后直接用 Eclipse 打开cmake-ec目录即可。3.3 使用 Xcode IDEmacOS构建macOS 下先用 Homebrew 安装/更新依赖brew install flex brew install bison brew install cmake然后在compiler/cpp下生成 Xcode 工程并构建mkdir cmake-build cd cmake-build cmake -G Xcode .. cmake --build .cmake --build .是跨生成器的通用构建命令比make更适用于 Xcode 等非 Makefile 生成器。3.4 其他 IDECMake 支持多种 IDE 生成器可通过cmake --help查看当前系统支持的生成器列表再选用-G参数指定例如 CodeBlocks、KDevelop、Sublime Text 2 等。四、在 Windows 上构建4.1 前置条件安装 CMakehttps://cmake.org/download/若不使用 Git Bash需安装 winflexbisonhttps://sourceforge.net/projects/winflexbison/若要使用 Visual Studio安装 Visual Studio建议最新稳定版 Community 版并在 VS2017 中安装 Desktop Development with C 工作负载4.2 使用 Git Bash 构建Git Bash 自带 flex 与 bison因此无需额外安装解析器工具。在 Git Bash 中进入compiler/cpp后执行mkdir cmake-vs cd cmake-vs cmake -DWITH_SHARED_LIBoff .. cmake --build .这里-DWITH_SHARED_LIBoff用于关闭共享库构建仅生成静态目标是纯编译器构建场景下的常见设置。4.3 使用 Visual Studio 与 Win flex-bison先用cmake --help确认 CMake 支持哪些 Visual Studio 版本生成器不同 VS 版本对应不同 generator 名称然后执行mkdir cmake-vs cd cmake-vs cmake -G Visual Studio 15 2017 ..例如Visual Studio 15 2017对应 VS2017如果你的环境是其他版本请替换为对应的 generator 名称。生成成功后用 Visual Studio 打开cmake-vs目录即可加载工程并构建。4.4 使用 MinGW32 交叉编译并生成 Windows 安装包CPackREADME 还给出了一种在 Linux 下交叉编译 Windows 版本并通过 CPack 生成 Windows 安装包的方案。仓库中已提供工具链文件 build/cmake/mingw32-toolchain.cmake在compiler/cpp下执行mkdir cmake-mingw32 cd cmake-mingw32 cmake -DCMAKE_TOOLCHAIN_FILE../build/cmake/mingw32-toolchain.cmake -DBUILD_COMPILERON -DBUILD_LIBRARIESOFF -DBUILD_TESTINGOFF .. cpack参数说明CMAKE_TOOLCHAIN_FILE指定 MinGW32 交叉编译工具链描述文件BUILD_COMPILERON只构建编译器BUILD_LIBRARIESOFF跳过各语言运行时库的构建BUILD_TESTINGOFF跳过测试目标加快交叉编译速度最后用cpack生成 Windows 安装包。五、不借助 CMake 的 Windows 手工构建如果你不想使用 CMake仓库中保留了 Visual Studio 解决方案 compiler/cpp/compiler.slnx 及配套的 compiler.vcxproj基于 VS2010 工程格式。该工程包含预构建Pre-Build命令用于生成构建编译器必需的thriftl.cc、thrifty.cc与thrifty.hh文件这些命令依赖 bison、flex 及其依赖库正常工作。具体步骤如下按上文方法下载 flex 与 bison将win_flex.exe与win_bison.exe放入 PATH并分别重命名为flex.exe与bison.exe若预构建步骤在特定系统上无法工作可尝试手工预构建打开compiler.slnx在工程的Properties - Build Events - Pre-Build Events中删除预构建命令在命令行中进入compiler/cpp目录先用 flex 生成词法文件flex -o src\thrift\thriftl.cc src\thrift\thriftl.ll在生成的thriftl.cc中注释掉#include unistd.hWindows 无此头文件将一份bison.simple放到compiler/cpp目录然后运行bison -y -o src/thrift/thrifty.cc --defines src/thrift/thrifty.yy move src\thrift\thrifty.cc.hh src\thrift\thrifty.hh注意bison 也可能生成带单个.h扩展名的 yacc 头文件thrifty.cc.h此时需将其重命名为thrifty.h生成版本头文件move src\thrift\version.h.in src\thrift\version.h从网络获取inttypes.h并放入某个 include 路径例如compiler/cpp/src目录最后在 Visual Studio 中构建整个工程。六、编译器单元测试6.1 基于 Boost.Test 的测试test 目录仓库中的 compiler/cpp/test 目录包含使用 Boost.Test 风格的编译器测试资源其中包括keyword-samples/一组以 PHP 关键字命名类型/字段的.thrift样例文件struct1_return.thrift、service1_return.thrift、union1_return.thrift等。对应 test/CMakeLists.txt 会为每个样例注册一个 CTest 用例调用thrift-compiler --gen php sample并断言输出包含Cannot use reserved language keyword用于验证编译器对目标语言保留字的拦截能力即 THRIFT-4655目前仅针对 PHPcompiler/staleness_check.py检查生成代码与源码是否同步的脚本compiler/markdown_doc_test.py配合 DocTest.thrift 验证 Markdown 文档生成器的输出。需要说明的是这两个 Python 脚本测试只有在找到 Python3 解释器时才会注册test/CMakeLists.txt。6.2 基于 Catch 的通用语言生成器测试tests 目录compiler/cpp/tests/README.md 介绍了另一套更通用的测试体系它为所有语言生成器提供统一的测试框架只需为你的语言生成器写一个正确的头文件即可接入示例实现见netstd语言。当前测试使用单头文件的 Catch 测试库tests/catch/catch.hpp选择它的理由是简单易用、单头文件即可引入、社区稳定。测试代码按语言分目录组织例如cpp/t_cpp_generator_enum_class_tests.cc、t_cpp_parser_comment_tests.cc、t_cpp_parser_string_constant_tests.cc等覆盖 C 生成器的 enum class、前向 setter、private optional、模板流运算符等特性并配套了对应的.thrift输入文件与expected_*.txt期望输出netcore/t_netcore_generator_functional_tests.cc等功能性测试ocaml/、rb/各自的生成器测试。如何为新的语言添加测试摘自 tests/README.md打开tests/CMakeLists.txt将对应语言的THRIFT_ADD_COMPILER开关设为ONTHRIFT_ADD_COMPILER(netstd Enable compiler for .NET Standard ON)在tests/下创建以该语言命名的文件夹编写测试源文件扩展名*.cc、*.cpp等并在测试文件中包含 Catch 头文件#include ../catch/catch.hpp如有需要可将文件手动追加到thrift_compiler_tests_manual_SOURCES变量中例如tests_main.cc用于避免每个测试文件重复定义 main 函数重新运行 CMake 配置并构建。6.3 构建并运行测试Unix-like 系统在compiler/cpp/tests目录下mkdir cmake-vs cd cmake-vs cmake .. cmake --build . ctest -C Debug -VWindows确保已安装 VS在compiler/cpp/tests目录下mkdir cmake-vs cd cmake-vs cmake .. cmake --build . ctest -C Debug -Vctest -C Debug -V中的-C指定配置Debug-V输出详细日志。注意测试目录默认只在开启BUILD_TESTING时才会被加入构建CMakeLists.txt 中if(BUILD_TESTING)分支会add_subdirectory(test)与add_subdirectory(tests)。七、CMake 构建管线深度解读7.1 flex/bison 生成与 parse 静态库compiler/cpp/CMakeLists.txt 展示了完整的解析器生成管线find_package(FLEX REQUIRED) find_package(BISON REQUIRED) # create directory for thrifty and thriftl file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/) # Create flex and bison files and build the lib parse static library BISON_TARGET(thrifty ${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/thrifty.yy ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc COMPILE_FLAGS --file-prefix-map...) FLEX_TARGET(thriftl ${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/thriftl.ll ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc) ADD_FLEX_BISON_DEPENDENCY(thriftl thrifty) set(parse_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.hh ) add_library(parse STATIC ${parse_SOURCES})BISON_TARGET/FLEX_TARGET分别从thrifty.yy与thriftl.ll生成 C 源码到构建目录而非源码目录保证源码树不被污染ADD_FLEX_BISON_DEPENDENCY让 flex 生成的词法扫描依赖 bison 生成的头文件语法 token 定义解决生成顺序问题生成的三个文件被打包成静态库parse再被主程序thrift-compiler链接。7.2 语言生成器的可裁剪开关CMakeLists.txt 中通过宏THRIFT_ADD_COMPILER为每种语言定义了独立的 CMake 选项macro(THRIFT_ADD_COMPILER name description initial) string(TOUPPER THRIFT_COMPILER_${name} enabler) set(src src/thrift/generate/t_${name}_generator.cc) option(${enabler} ${description} ${initial}) if(${enabler}) list(APPEND thrift-compiler_SOURCES ${src}) list(APPEND thrift_compiler_LANGS ${name}) endif() endmacro()每种语言的选项名形如THRIFT_COMPILER_语言默认全部为ON。已注册的语言包括c_glib、cl、cpp、d、dart、delphi、erl、go、gvGraphViz、haxe、html、markdown、mmdMermaid 图、java、javame、js、json、kotlin、lua、netstd、ocaml、perl、php、py、rb、rs、st、xml、xsd。另有THRIFT_ADD_VALIDATOR_COMPILER(go ...)用于 Go 参数校验器的生成开关。实际含义若你只需要 C 与 Go 两种生成能力可在配置阶段传入-DTHRIFT_COMPILER_PYOFF -DTHRIFT_COMPILER_PHPOFF ...裁剪编译器体积、缩短编译时间。thrift_compiler_LANGS变量记录了实际启用的语言供后续逻辑如thrift --help输出支持语言列表使用。7.3 可执行文件的输出与安装构建产物除了进入构建目录bin/外CMakeLists.txt 还定义了copy-thrift-compiler自定义目标将编译好的thrift复制回源码树根目录compiler/cpp/thrift以便下游目标如各语言库的代码生成测试直接使用同时install(TARGETS thrift-compiler DESTINATION bin)支持标准的cmake --install安装到系统bin目录。八、Automake 备选构建方式除 CMake 外仓库同样维护了 Autotools 构建入口 compiler/cpp/Makefile.am。它声明了bin_PROGRAMS thrift将main.cc、parse/下全部 AST 结构、generate/下全部语言生成器以及audit/t_audit.cpp编入thrift可执行文件并通过thrift_LDADD LEXLIB src/thrift/libparse.a链接 flex 运行时库与本地libparse.a。该路径由仓库根目录的 configure.ac 与 bootstrap.sh 驱动适用于偏好 autoconf/automake 流程的 Unix 环境。九、构建完成后快速验证构建产物thrift可以直接对仓库中的示例 IDL 做冒烟测试例如使用 tutorial/tutorial.thrift./cmake-build/bin/thrift --gen py tutorial/tutorial.thrift若成功会在当前目录生成tutorialPython 包结构--gen cpp、--gen java等参数可生成对应语言代码--help会列出当前构建实际启用的所有语言生成器与 7.2 节裁剪开关一一对应。这也正是上文所述构建管线与源码布局的价值所在无论通过 CMake、Automake 还是手工 flex/bison 流程最终都能得到同一套完整可用的 IDL 编译器。【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/GitHub_Trending/thr/thrift创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表