folly
?Folly(Facebook 开源库的缩写)是一个 C++17 组件库,设计时注重实用性和效率。
Folly 包含 Facebook 广泛使用的各种核心库组件。特别是,它通常是 Facebook 其他开源 C++ 项目的依赖项,也是这些项目共享代码的地方。
它与 Boost 和 std
等产品相辅相成(而不是相互竞争)。事实上,只有当我们需要的组件不可用或无法满足所需的性能要求时,我们才会着手定义自己的组件。如果 std
或 Boost 淘汰了某些组件,我们会努力将其从 Folly 中删除。
性能问题贯穿了 Folly 的大部分内容,有时会导致设计比原本更独特(例如,参见 PackedSyncPtr.h
和 SmallLocks.h
)。大规模下的良好性能是 Folly 的统一主题。
Folly 是由一些相对独立的组件组成的集合,其中一些组件甚至可能只有几个符号。Folly 对内部依赖关系没有任何限制,这意味着一个特定的 Folly 模块可以使用任何其他Folly 组件。
所有符号均在顶级命名空间folly
中定义,当然宏除外。宏名称全部大写,并应以“FOLLY_
”作为前缀。命名空间“folly
”定义了其他内部命名空间,例如“internal
”或“detail
”。用户代码不应依赖于这些命名空间中的符号。
Folly 的顶层目录采用了 Boost 和其他库使用的经典“stuttering”方案folly/folly
。第一个目录用作库的安装根目录(可能带有类似folly-1.0/
的版本控制),第二个目录用于在包含文件时区分库,例如 #include <folly/FBString.h>
。
目录结构是扁平的(模仿命名空间结构),也就是说,我们没有复杂的目录层次结构(未来版本可能会改变)。子目录 experimental
包含在 folly 内部使用的文件,也可能在 Facebook 中使用,但被认为不够稳定,无法供客户端使用。您的代码不应使用folly/experimental
中的文件,以免在更新 Folly 时崩溃。
folly/folly/test
子目录包含所有组件的单元测试,通常每个 ComponentXyz.*
的单元测试名为 ComponentXyzTest.cpp
。folly/folly/docs
目录包含相关文档。
由于 folly 的结构相当扁平,查看其内容的最佳方式是查看 顶层 folly/
目录 中的头文件。您也可以查看 docs
文件夹 中的文档,首先查看overview。
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 等命令来构建 folly。这将有助于确保您使用所有依赖库的相关版本进行构建,并考虑到您系统上本地安装的版本。
它是用 Python 编写的,因此您需要在 PATH 中安装 python3.6 或更高版本。它适用于 Linux、macOS 和 Windows。
folly 的 cmake 构建设置保存在其 getdeps 清单 build/fbcode_builder/manifests/folly
中,您可以根据需要在本地进行编辑。
如果您使用的是 Linux 或 MacOS(已安装 Homebrew),您可以安装系统依赖项以节省构建时间:
# 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 等命令来构建 folly。这将帮助您确保使用所有依赖库的相关版本进行构建,并考虑到您系统上本地安装的版本。
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
: Library您还可以指定 --scratch-path
参数来控制用于构建的临时目录的位置。您可以从日志中或使用 python3 ./build/fbcode_builder/getdeps.py show-inst-dir
找到默认的临时安装位置。
此外,还有 --install-dir
和 --install-prefix
参数,可以对安装目录进行更精细的控制。但是,鉴于folly 不提供提交之间的兼容性保证,我们通常建议将库构建和安装到一个临时位置,然后将项目的构建指向这个临时位置,而不是将 folly 安装在传统的系统安装目录中。例如,如果您使用 CMake 构建,则可以使用 CMAKE_PREFIX_PATH
变量,让 CMake 在构建项目时在此临时安装目录中找到 folly。
如果您想再次调用“cmake”进行迭代,临时构建目录中有一个有用的“run_cmake.py”脚本输出。您可以从日志中或使用“python3 ./build/fbcode_builder/getdeps.py show-build-dir”找到临时构建目录。
默认情况下,getdeps.py
将为 folly 构建测试。要运行它们,请执行以下操作:
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
构建,scratch-path 构建目录中有一个很有用的 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 上进行持续集成测试,偶尔也会在其他发行版上进行测试。
如果您发现系统软件包集与您选择的发行版不太匹配,您可以在依赖项清单中指定特定于发行版的覆盖(例如 https://github.com/facebook/folly/blob/main/build/fbcode_builder/manifests/boost )。您或许可以在最新的 Ubuntu/Debian 或 Fedora/Redhat 衍生发行版上运行它。
在撰写本文时(2021 年 12 月),lang_badge_test 中基于 GCC 11.x 的系统存在构建中断。如果您不需要徽章功能,可以通过在 CMakeLists.txt 中将其注释掉来解决这个问题(可惜 fbthrift 需要它)。
请注意,许多测试在 folly Windows 构建中被禁用,您可以在 cmake configure 步骤的日志中查看,或者在 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 可以作为 Formula 使用,可以通过 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