ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Folly:Facebook 开源 C++20 组件库的架构设计、核心组件与跨平台构建实战指南

Folly:Facebook 开源 C++20 组件库的架构设计、核心组件与跨平台构建实战指南 FollyFacebook 开源 C20 组件库的架构设计、核心组件与跨平台构建实战指南【免费下载链接】follyAn open-source C library developed and used at Facebook.项目地址: https://gitcode.com/GitHub_Trending/fol/folly导读本文以 folly 仓库根目录的 README.md 为骨架系统讲解 Facebook 开源 C 组件库 Folly 的定位与设计哲学、逻辑与物理架构、核心组件清单并完整继承其构建文档给出基于getdeps.py与 CMake 的跨平台Linux / macOS / Windows编译、测试与集成实战方案。读者读完后将掌握 Folly 的目录结构与命名规范能够在自己的项目中正确获取、编译、链接并运行 Folly 测试。一、Folly 是什么定位与设计哲学Folly全称 Facebook Open Source Library即“Facebook 开源库”的松散缩写是一套以实用性和效率为设计核心的 C20 组件库。它不是单一功能的框架而是 Facebook 内部大量核心库组件沉淀后的开源集合常作为 Facebook 其他开源 C 项目的公共依赖让这些项目得以共享底层代码。从设计哲学上看Folly 与 Boost、标准库std是互补关系而非竞争关系只有在标准库或 Boost 没有提供、或者性能表现达不到要求时Folly 才会定义自己的组件一旦std或 Boost 的对应功能成熟Folly 会主动移除自己的实现。性能考量贯穿 Folly 的方方面面有时甚至会因此催生一些看起来“特立独行”的设计。README 中明确点名的两个典型例子是 folly/PackedSyncPtr.h把指针、1 位自旋锁与 15 位整数压缩进一个 64 位字和 folly/synchronization/SmallLocks.h1 字节、1 位的极小型自旋锁。这种“为大规模高性能服务而生”的统一主题是理解 Folly 每一个组件取舍的钥匙。仓库 folly/VERSION 记录当前版本为57:0顶层 CMakeLists.txt 中声明包版本为0.58.0-dev。二、逻辑设计Logical Design命名空间与组件边界Folly 的逻辑结构非常清晰相对独立的组件集合Folly 是一系列彼此相对独立的组件组成的集合有些组件简单到只有几个符号组件间允许内部依赖没有任何关于内部依赖的限制即某个 folly 模块可以使用其他任何 folly 组件统一顶层命名空间folly除宏以外所有符号都定义在顶层命名空间folly中宏命名规范宏名全部大写且必须以FOLLY_前缀开头内部命名空间不可依赖folly命名空间内还定义了internal、detail等内部命名空间用户代码不应依赖这些命名空间中的符号——它们不构成稳定接口。这一约定在仓库中随处可见例如在顶层头文件 folly/Bits.h、folly/Conv.h 中所有公开 API 都位于namespace folly内而FOLLY_前缀宏则广泛分布于 folly/CPortability.h、folly/Portability.h 等可移植性头文件中用于屏蔽不同编译器/平台的差异。三、物理设计Physical Designfolly/folly目录结构Folly 的顶层目录沿用了 Boost 等库经典的“stuttering”叠词方案folly/folly第一层目录是库的安装根目录可带版本号如folly-1.0/第二层目录用于区分库名使包含文件时写作#include folly/FBString.h而非#include FBString.h避免头文件冲突。具体布局要点如下扁平化目录结构目录结构是扁平的与命名空间结构一一对应不建立繁复的目录层级README 也提示未来版本可能调整。experimental子目录包含仅在 folly 内部以及 Facebook 内部使用、但对客户端而言还不够稳定的文件。用户代码不应使用folly/experimental下的文件否则升级 Folly 时可能编译失败。测试目录各组件的单元测试统一放在folly/test下命名遵循ComponentXyzTest.cpp对应每个ComponentXyz.*的规律例如 folly/test/FBStringTest.cpp、folly/test/ConvTest.cpp。这些测试通过顶层 CMakeLists.txt 中的folly_define_tests宏统一注册到 CTest并支持WINDOWS_DISABLED、SLOW、BROKEN、HANGING等标记来管理平台与运行时长。文档目录folly/docs存放各组件的专项文档建议从 folly/docs/Overview.md 开始阅读。四、组件全景folly 里有什么由于 Folly 结构扁平最好的“目录”就是顶层folly/目录下的头文件本身。下表按功能域整理了 folly/docs/Overview.md 中列出的主要组件均可在仓库中直接查看对应源码功能域组件一句话说明基础容器folly/container/F14Map.h、folly/container/F14Set.h高性能开放寻址哈希表Facebook 内部大规模使用字符串folly/FBString.h、folly/small_vector.h、folly/sorted_vector_types.hstd::string/std::vector的高性能替代实现并发与同步folly/MPMCQueue.h、folly/ProducerConsumerQueue.h、folly/Synchronized.h、folly/ThreadLocal.h、folly/ThreadCachedInt.h多生产者多消费者队列、无锁单写单读队列、高层同步与线程局部存储极小型锁folly/synchronization/SmallLocks.h、folly/MicroSpinLock.h、folly/PackedSyncPtr.h以字节/比特为单位的极紧凑自旋锁与压缩指针结构原子数据结构folly/AtomicHashMap.h、folly/ConcurrentSkipList.h、folly/EvictingCacheMap.h面向特定权衡的高性能原子数据结构异步编程folly/futures/、folly/coro/、folly/io/、folly/executors/Promise/Future 模式、协程、事件驱动 IO 与线程池执行器转换与格式化folly/Conv.h、folly/Format.h、folly/dynamic.h、folly/json.h高速安全的类型转换、Python 风格格式化、动态类型与 JSON哈希与编码folly/Hash.h、folly/GroupVarint.h、folly/Fingerprint.h、folly/base64.h多种哈希实现、Group Varint 压缩编码、Rabin 指纹内存管理folly/memory/、folly/Memory.h、folly/IndexedMemPool.hArena/ThreadCachedArena、jemalloc 辅助、索引内存池工具与元编程folly/ScopeGuard.h、folly/Singleton.h、folly/Function.h、folly/Range.h、folly/Traits.h、folly/Indirect.hRAII 守卫、可正确管理生命周期的单例、不可拷贝可调用对象包装、Boost 风格区间与类型萃取网络与地址folly/IPAddress.h、folly/Uri.h、folly/SocketAddress.h、folly/io/async/EventBase.hIPv4/IPv6 地址、URI 解析、socket 地址与异步事件循环统计与基准folly/stats/、folly/Benchmark.h时间序列计数器/直方图/分位数统计以及代码基准测试框架其他folly/Baton.h单次交接的信号量、folly/Subprocess.hPython 风格子进程库、folly/Demangle.h、folly/gen/LINQ 风格声明式序列处理面向特定场景的精简工具每个组件对应的深入文档位于 folly/docs/如 FBString.md、Futures.md、Synchronized.md、AtomicHashMap.md并有配套的可编译示例在 folly/docs/examples/。五、构建 Folly从 getdeps.py 到 CMake 的完整指南5.1 ABI 稳定性与静态库建议Folly不提供提交与提交之间的 ABI 兼容性保证因此官方一般建议将 folly 构建为静态库并把编译产物安装到临时目录再由你的项目构建系统指向该临时位置而不是安装到传统系统目录。这一建议在顶层 CMakeLists.txt 中也有印证BUILD_SHARED_LIBS选项被显式标记为“一般不建议开启folly 不承诺稳定 ABI”。5.2 平台与编译器支持README 明确的支持矩阵为编译器gcc5.1、clang、MSVC操作系统Linuxx86-32、x86-64 与 ARM、iOS、macOS、Windowsx86-64CMake 构建的测试覆盖仅在部分平台上经过测试最低目标是 macOS 与 Linux最新的 Ubuntu LTS 或更新版本。顶层 CMakeLists.txt 还补充了 Windows 前提Folly 要求 64 位目标架构且 MSVC 至少为 Visual Studio 2017MSVC_VERSION 1900。5.3getdeps.py一键式依赖管理与构建getdeps.py是 Meta 多个开源工具共用的构建脚本位于 build/fbcode_builder/getdeps.py。从源码看它本身只是一个入口 shim第 8-12 行注释说明真正逻辑在getdeps/cli.py用户可以直接运行。它的工作流程是先下载并构建所有必要依赖再调用 CMake 等工具构建 folly 本身构建时会考虑本地系统已安装依赖的版本确保使用相关版本组合。使用前提Python 3.6 在PATH中支持 Linux、macOS、Windows。folly 的 CMake 构建设置存放在其 getdeps manifestbuild/fbcode_builder/manifests/folly中如需调整可以在本地编辑。5.4 安装系统依赖在 Linux 或装有 Homebrew 的 macOS 上可先安装系统依赖以节省编译时间# 克隆仓库 git clone https://gitcode.com/GitHub_Trending/fol/folly # 安装依赖 cd folly sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive如果只想先查看将要安装的软件包清单而不真正安装./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive在其他平台、或 Linux 上缺少系统依赖时getdeps.py会在构建阶段自行下载并编译依赖。README 点名的关键依赖包括以C14 支持编译的 Boost 版本googletest构建与运行 folly 测试所必需。5.5 构建命令与产物# Clone the repo git clone https://gitcode.com/GitHub_Trending/fol/folly cd folly # Build, using system dependencies if available python3 ./build/fbcode_builder/getdeps.py --allow-system-packages build构建输出位于其 scratch 区域中installed/folly/lib/libfolly.a静态库本体相关控制参数--scratch-path指定构建所用 scratch 目录的位置默认安装位置可通过日志或python3 ./build/fbcode_builder/getdeps.py show-inst-dir查询--install-dir、--install-prefix更细粒度地控制安装目录由于 folly 提交间无兼容性保证官方建议将库安装到临时位置并在你自己的项目中通过CMAKE_PREFIX_PATH指向该临时安装目录让 CMake 能find_package(folly)找到它构建目录中会生成一个便于反复迭代 CMake 的run_cmake.py脚本scratch 构建目录可通过日志或python3 ./build/fbcode_builder/getdeps.py show-build-dir查询。5.6 运行测试默认情况下getdeps.py会构建 folly 的测试运行方式cd folly python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test5.7build.sh/build.bat包装脚本Linux 和 macOS 上可使用build.shWindows 上使用build.bat二者都是对getdeps.py的包装。5.8 直接使用 CMake 构建如果不想让 getdeps 代劳可以直接用 CMake。注意默认情况下测试并不属于 CMakeall目标需要显式开启cmake .. -DBUILD_TESTSON make若要在 getdeps 构建基础上反复迭代 CMake同样可借助 scratch 构建目录中的run_cmake.py脚本。测试运行也支持 ctest(cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) ctest)依赖位于非默认位置时可通过CMAKE_INCLUDE_PATH与CMAKE_LIBRARY_PATH让 CMake 额外查找头文件与库。例如同时搜索/alt/include/path1、/alt/include/path2下的头文件以及/alt/lib/path1、/alt/lib/path2下的库cmake \ -DCMAKE_INCLUDE_PATH/alt/include/path1:/alt/include/path2 \ -DCMAKE_LIBRARY_PATH/alt/lib/path1:/alt/lib/path2 ...5.9 Ubuntu LTS、CentOS Stream、Fedora推荐统一采用上面的getdeps.py方案Folly 的 CI 主要在 Ubuntu LTS 上测试偶尔覆盖其他发行版。若某发行版的系统软件包集合不匹配可以在依赖 manifest如build/fbcode_builder/manifests/boost中针对发行版版本指定覆盖项通常可在多数较新的 Ubuntu/Debian 或 Fedora/RedHat 衍生发行版上构建成功。README 同时记录了一个已知问题截至 2021 年 12 月GCC 11.x 系统上lang_badge_test存在构建失败如果不需要 badge 功能可以通过在 CMakeLists.txt 中注释掉它来规避注意 fbthrift 确实需要该功能。5.10 WindowsVcpkg注意 folly 的 Windows 构建会禁用大量测试可通过 CMake 配置步骤的日志、或搜索 CMakeLists.txt 中的WINDOWS_DISABLED标记查看。getdeps.py在 Windows 上可以构建并通过 CI 测试。若偏好 Vcpkg# 安装发布版本 vcpkg install folly:x64-windows # 或基于 main 分支构建 vcpkg install folly:x64-windows --head5.11 macOSgetdeps.py在 macOS 上可构建并通过 CI 测试也可以使用 macOS 包管理器Homebrew# 安装发布版本 brew install folly # 或基于 main 分支构建在顶层创建 _build 目录 ./folly/build/bootstrap-osx-homebrew.shMacPorts先安装所需软件包sudo port install \ boost \ cmake \ gflags \ git \ google-glog \ libevent \ libtool \ lz4 \ lzma \ openssl \ snappy \ xz \ zlib再下载并安装 follygit clone https://gitcode.com/GitHub_Trending/fol/folly.git cd folly mkdir _build cd _build cmake .. make sudo make install六、从 CMake 源码看构建系统实现细节除了 README 中的操作说明顶层 CMakeLists.txt 还揭示了若干值得注意的工程细节C 标准默认设置CMAKE_CXX_STANDARD 20CMakeLists.txt与 README 所称“C20 组件库”一致GCC 下还会检测并启用-fcoroutines以支持 C 协程CMakeLists.txt。静态/共享库选项BUILD_SHARED_LIBS默认OFF且被标记为高级选项CMakeLists.txt呼应“无 ABI 保证、推荐静态库”的官方建议PYTHON_EXTENSIONSON时会强制开启共享库CMakeLists.txt。测试选项家族BUILD_TESTS、BUILD_BENCHMARKS、BUILD_BROKEN_TESTS、BUILD_HANGING_TESTS、BUILD_SLOW_TESTS五个开关CMakeLists.txt分别控制普通测试、基准、已知损坏、会挂起、调试模式下过慢的测试默认全部关闭。下游集成方式安装时会生成folly-config.cmakeCMakeLists.txt下游项目可用find_package(folly CONFIG)并链接Folly::folly同时生成 pkg-config 文件libfolly.pcCMakeLists.txt供非 CMake 构建系统使用。模板分别位于 CMake/folly-config.cmake.in 与 CMake/libfolly.pc.in。库的粒度源码先按子目录编译为 OBJECT 库再聚合生成细粒度.a与单一libfolly.aCMakeLists.txt。七、继续深入文档、示例与构建元数据组件文档所有专项文档集中在 folly/docs/建议阅读顺序为 Overview.md → 按需查阅 Benchmark.md、ThreadLocal.md、Hazptr.md、Rcu.md 等可运行示例folly/docs/examples/ 提供可直接阅读的示例源码测试范例每个组件的单元测试即最佳用法示范例如 folly/test/MPMCQueueTest.cpp、folly/futures/test/FutureTest.cpp构建元数据Bazel/Buck 用户可参考 folly/BUCK 与 folly/defs.bzlCMake 用户直接使用顶层 CMakeLists.txt 即可。总而言之Folly 是一套“以性能为纲、与标准库互补、服务于 Facebook 大规模生产环境”的 C20 组件库。理解其扁平目录、folly命名空间与FOLLY_宏约定再配合getdeps.py或 CMake 的完整构建链路你就可以在 Linux、macOS 与 Windows 上把它编译为静态库并集成进自己的项目按需选用其中的字符串、容器、并发、异步与 IO 组件。【免费下载链接】follyAn open-source C library developed and used at Facebook.项目地址: https://gitcode.com/GitHub_Trending/fol/folly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进