folly
?Folly(Facebook Open Source Library 的缩写)是一个 C++17 组件库,其设计考虑了实用性和效率。 Folly 包含 Facebook 广泛使用的各种核心库组件。特别是,它通常是 Facebook 的其他开源 C++ 项目的依赖项,也是这些项目可以共享代码的地方。
它是 Boost 等产品的补充(而不是竞争),当然还有std
。事实上,只有当我们需要的东西不可用或不满足所需的性能配置文件时,我们才会开始定义自己的组件。如果std
或 Boost 废弃了某些东西,我们会尽力将它们从愚蠢中删除。
性能问题渗透到 Folly 的大部分内容中,有时会导致设计比原本的设计更加特殊(参见例如PackedSyncPtr.h
、 SmallLocks.h
)。大规模的良好表现是所有 Folly 的统一主题。
Folly 是相对独立的组件的集合,有些组件简单到只有几个符号。对内部依赖性没有限制,这意味着给定的愚蠢模块可以使用任何其他愚蠢组件。
所有符号都在顶级命名空间folly
中定义,当然宏除外。宏名称为 ALL_UPPERCASE 并且应以FOLLY_
为前缀。命名空间folly
定义了其他内部命名空间,例如internal
或detail
。用户代码不应依赖于这些命名空间中的符号。
Folly 还有一个experimental
目录。这一指定主要意味着我们认为 API 可能会随着时间的推移而发生巨大变化。通常,该代码仍然被大量使用并且经过了良好的测试。
在顶层,Folly 使用 Boost 和其他人使用的经典“口吃”方案folly/folly
。第一个目录用作库的安装根目录(可能具有folly-1.0/
版本控制),第二个目录用于在包含文件时区分库,例如#include <folly/FBString.h>
。
目录结构是扁平的(模仿命名空间结构),即我们没有复杂的目录层次结构(这可能会在未来的版本中改变)。子目录experimental
包含在folly内部以及可能在Facebook中使用的文件,但对于客户端使用来说不够稳定。您的代码不应在folly/experimental
中使用文件,以免在更新愚蠢时可能会损坏。
folly/folly/test
子目录包含所有组件的单元测试,通常为每个ComponentXyz.*
命名为ComponentXyzTest.cpp
。 folly/folly/docs
目录包含文档。
由于 folly 的结构相当扁平,因此查看其中内容的最佳方法是查看顶级folly/
目录中的标头。您还可以从概述开始检查docs
文件夹中的文档。
Folly 发布在 GitHub 上:https://github.com/facebook/folly。
由于 folly 不提供从提交到提交的任何 ABI 兼容性保证,因此我们通常建议将 folly 构建为静态库。
folly 支持 gcc (5.1+)、clang 或 MSVC。它应该在 Linux(x86-32、x86-64 和 ARM)、iOS、macOS 和 Windows(x86-64)上运行。 CMake 构建仅在其中一些平台上进行了测试;至少,我们的目标是支持 macOS 和 Linux(在最新的 Ubuntu LTS 版本或更高版本上)。
getdeps.py
Meta 的许多 OSS 工具都使用此脚本。它将首先下载并构建所有必需的依赖项,然后调用 cmake 等来构建愚蠢的。这将有助于确保您使用所有依赖库的相关版本进行构建,同时考虑到系统上本地安装的版本。
它是用 python 编写的,因此您的 PATH 中需要 python3.6 或更高版本。它适用于 Linux、macOS 和 Windows。
folly 的 cmake 构建的设置保存在其 getdeps 清单build/fbcode_builder/manifests/folly
中,如果需要,您可以在本地编辑。
如果在 Linux 或 MacOS(安装了自制软件)上,您可以安装系统依赖项以保存构建它们:
# Clone the repo
git clone https://github.com/facebook/folly
# Install dependencies
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
将在构建步骤中为您下载和构建它们。
getdeps.py
使用和安装的一些依赖项是:
该脚本将首先下载并构建所有必需的依赖项,然后调用 cmake 等来构建愚蠢的。这将有助于确保您使用所有依赖库的相关版本进行构建,同时考虑到系统上本地安装的版本。
getdeps.py
当前需要 python 3.6+ 位于您的路径上。
getdeps.py
将调用 cmake 等。
# Clone the repo
git clone https://github.com/facebook/folly
cd folly
# Build, using system dependencies if available
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages build
它将输出放入暂存区:
installed/folly/lib/libfolly.a
:库您还可以指定--scratch-path
参数来控制用于构建的临时目录的位置。您可以从日志或使用python3 ./build/fbcode_builder/getdeps.py show-inst-dir
找到默认的临时安装位置。
还有--install-dir
和--install-prefix
参数来提供对安装目录的更细粒度的控制。但是,鉴于 folly 不提供提交之间的兼容性保证,我们通常建议构建库并将其安装到临时位置,然后将项目的构建指向此临时位置,而不是将 folly 安装在传统的系统安装目录中。例如,如果您使用 CMake 进行构建,则可以使用CMAKE_PREFIX_PATH
变量来允许 CMake 在构建项目时在此临时安装目录中找到愚蠢的内容。
如果您想再次调用cmake
进行迭代,则在临时构建目录中有一个有用的run_cmake.py
脚本输出。您可以从日志中或使用python3 ./build/fbcode_builder/getdeps.py show-build-dir
找到临时构建目录。
默认情况下getdeps.py
会构建愚蠢的测试。运行它们:
cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test
build.sh
/ build.bat
包装器build.sh
可以在 Linux 和 MacOS 上使用,在 Windows 上则使用build.bat
脚本。它是getdeps.py
的包装。
如果您不想让 getdeps 为您调用 cmake,那么默认情况下,构建测试将作为 CMake all
目标的一部分被禁用。要构建测试,请在配置时为 CMake 指定-DBUILD_TESTS=ON
。
注意,如果您想再次调用cmake
以迭代getdeps.py
构建,则暂存路径构建目录中有一个有用的run_cmake.py
脚本输出。您可以从日志中或使用python3 ./build/fbcode_builder/getdeps.py show-build-dir
找到临时构建目录。
如果您 cd 到构建目录,使用 ctests 运行测试也可以工作,例如(cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
如果您在非默认位置安装了 boost、gtest 或其他依赖项,则可以使用CMAKE_INCLUDE_PATH
和CMAKE_LIBRARY_PATH
变量使 CMAKE 也在非标准位置查找头文件和库。例如,要在目录/alt/include/path1
和/alt/include/path2
中搜索头文件,在目录/alt/lib/path1
和/alt/lib/path2
中搜索库,您可以按如下方式调用cmake
:
cmake
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
使用上面的getdeps.py
方法。我们在 Ubuntu LTS 上进行 CI 测试,偶尔也会在其他发行版上进行测试。
如果您发现系统包集不太适合您选择的发行版,您可以在依赖项清单中指定特定于发行版版本的覆盖(例如 https://github.com/facebook/folly/blob/main/build/fbcode_builder/体现/提升)。您或许可以让它在最新的 Ubuntu/Debian 或 Fedora/Redhat 派生发行版上运行。
截至撰写本文时(2021 年 12 月),lang_badge_test 中基于 GCC 11.x 的系统存在构建中断。如果您不需要徽章功能,您可以通过从 CMakeLists.txt 中注释掉它来解决(不幸的是 fbthrift 确实需要它)
请注意,对于愚蠢的 Windows 构建,许多测试被禁用,您可以在 cmake 配置步骤的日志中看到它们,或者通过在CMakeLists.txt
中查找 WINDOWS_DISABLED
也就是说, getdeps.py
在 Windows 上构建工作并在 CI 中进行测试。
如果您愿意,可以尝试 Vcpkg。 folly 在 Vcpkg 中可用,并且可以通过vcpkg install folly:x64-windows
构建版本。
您还可以使用vcpkg install folly:x64-windows --head
来针对main
进行构建。
getdeps.py
在 macOS 上构建并在 CI 中进行测试,但是如果您愿意,可以尝试其中一种 macOS 包管理器
folly 可作为公式使用,并且可以通过brew install folly
构建版本。
您还可以使用folly/build/bootstrap-osx-homebrew.sh
来针对main
进行构建:
./folly/build/bootstrap-osx-homebrew.sh
这将在顶层创建一个构建目录_build
。
从 MacPorts 安装所需的软件包:
sudo port install
boost
cmake
gflags
git
google-glog
libevent
libtool
lz4
lzma
openssl
snappy
xz
zlib
下载并安装双转换:
git clone https://github.com/google/double-conversion.git
cd double-conversion
cmake -DBUILD_SHARED_LIBS=ON .
make
sudo make install
下载并安装 folly,参数如下:
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install