Folly:Facebook开源库
folly
?
什么是
Folly(名称源于Facebook开源库,略做变形)是一个设计考虑实用性及效率的C++14组件库。 Folly包含了在Facebook中被广泛使用的各种核心库组件。特别是,它通常是Facebook其他开源C++项目的依赖库,也是那些项目可以共享代码的地方。
它与Boost和当然的std
库等提供的解决方案相辅相成(而非竞争)。事实上,只有在所需功能不可用或不符合所需的性能指标时,我们才会着手定义自己的组件。我们努力从Folly中删除那些被std
或Boost废弃的组件。
性能考量贯穿于Folly的各个方面,有时导致设计比其他设计更独特(例如PackedSyncPtr.h
、SmallLocks.h
)。在大型规模上的高性能是Folly中一个共同的主题。
逻辑设计
Folly是由相对独立的组件组成的集合,其中一些组件非常简单,只包含几个符号。内部依赖没有限制,这意味着一个给定的Folly模块可以使用任何其他Folly组件。
所有符号都在顶级命名空间 folly
中定义,当然不包括宏。宏的名称全部为大写字母,并且应该用前缀 FOLLY_
开头。命名空间 folly
定义其他内部命名空间,如 internal
或 detail
。用户代码不应依赖于这些命名空间中的符号。
Folly 也有一个 experimental
目录。这个标识主要意味着我们感觉 API 可能随着时间的推移而大幅变化。通常情况下,这段代码仍在 heavy use,并通过了良好的测试。
物理设计
在顶级 Folly 使用经典的 "verbigeration" 模式 folly/folly
,类似于 Boost 和其他。第一个目录作为库的安装根目录(可能具有类似 folly-1.0/
的版本号),第二个目录在包含文件时区分库,例如 #include <folly/FBString.h>
。
目录结构是平的(模仿命名空间结构),即我们没有一个详尽的目录层次结构(在未来版本中可能发生变化)。子目录 experimental
包含 Folly 内部和可能在 Facebook 内部使用,但尚未被认为足够稳定以供客户端使用的文件。你的代码不应使用 folly/experimental
中的文件,以免在更新 Folly 时破坏。
folly/folly/test
子目录包括所有组件的 unittest,通常每个 ComponentXyz.*
命名一个 ComponentXyzTest.cpp
。folly/folly/docs
目录包含文档。
包含什么?
由于 folly 的相当平坦的结构,查看它包含什么的最好方法是从 顶级 folly/
目录 中查看头文件。您还可以检查 docs
文件夹 进行文档,从 概述 开始。
Folly 在 GitHub 上发布,网址为 https://github.com/facebook/folly
构建说明
因为 folly 在每个提交之间不提供任何 ABI 兼容性保证,我们通常推荐将 folly 建立为静态库。
build.sh
构建 folly 最简单的方法是使用存储库顶层中的 build.sh
脚本。Linux 和 MacOS 系统可以使用 build.sh
,在 Windows 系统上使用 build.bat
脚本。
此脚本将首先下载和构建所有必要的依赖项,然后构建 folly。这有助于确保您使用所有依赖库的最新版本进行构建,而不管系统上安装了哪些版本。
默认情况下,此脚本将在一个清理目录中构建和安装 folly 及其依赖项。您也可以指定一个 --scratch-path
参数来控制用于构建的清理目录的位置。还有 --install-dir
和 --install-prefix
参数可以提供对安装目录的更多细粒度控制。然而,由于 folly 提供没有提交间的兼容性保证,我们通常建议将库构建和安装到临时位置,然后在构建项目时将其指向此临时位置,而不是在传统的系统安装目录中安装 folly。例如,如果您正在使用 CMake 构建,可以使用 CMAKE_PREFIX_PATH
变量允许 CMake 在构建项目时在此临时安装目录中查找 folly。
依赖项
folly 支持 gcc (5.1+)、clang 或 MSVC。它应在 Linux(x86-32、x86-64 和 ARM)、iOS、macOS 以及 Windows(x86-64)上运行。CMake 构建仅在部分这些平台上进行了测试;目标是最少要支持 macOS 和 Linux(在最新的 Ubuntu LTS 版本或更新版本上)。
folly 需要 C++14 支持编译的 boost 版本。
构建和运行 folly 的测试需要 googletest。您可以从此处下载它:[https://github.com/google/googletest/archive/release-1.8.0.tar.gz](https://github.com/google/googletest/archive/release-1.8.0.tar.gz)。以下命令可以用来下载并安装它:
wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz && \
tar zxf release-1.8.0.tar.gz && \
rm -f release-1.8.0.tar.gz && \
cd googletest-release-1.8.0 && \
cmake . && \
make && \
make install
在非默认位置查找依赖项
如果您的 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 ...
构建测试
默认情况下,构建测试作为CMake all
目标的一部分是禁用的。要构建测试,请在配置时指定 -DBUILD_TESTS=ON
给CMake。
Ubuntu 16.04 LTS
以下包是必须的(下面可以自由复制粘贴apt-get命令)
sudo apt-get install \
g++ \
cmake \
libboost-all-dev \
libevent-dev \
libdouble-conversion-dev \
libgoogle-glog-dev \
libgflags-dev \
libiberty-dev \
liblz4-dev \
liblzma-dev \
libsnappy-dev \
make \
zlib1g-dev \
binutils-dev \
libjemalloc-dev \
libssl-dev \
pkg-config \
libunwind-dev
Folly依赖于fmt,需要从源代码安装。以下命令将下载、编译和安装fmt。
git clone https://github.com/fmtlib/fmt.git && cd fmt
mkdir _build && cd _build
cmake ..
make -j$(nproc)
sudo make install
如果需要高级调试功能,请使用
sudo apt-get install \
libunwind8-dev \
libelf-dev \
libdwarf-dev
在folly目录中(例如,检出的根目录或归档解包根目录),运行
mkdir _build && cd _build
cmake ..
make -j $(nproc)
make install # with either sudo or DESTDIR as necessary
OS X (Homebrew)
folly可以通过Formula获取,可以通过 brew install folly
构建版本。
您还可以使用 folly/build/bootstrap-osx-homebrew.sh
来构建 master
。
./folly/build/bootstrap-osx-homebrew.sh
这将创建顶层目录中的 _build
构建目录。
OS X (MacPorts)
从MacPorts安装所需的包
sudo port install \
boost \
cmake \
gflags \
git \
google-glog \
libevent \
libtool \
lz4 \
lzma \
openssl \
snappy \
xz \
zlib
下载并安装double-conversion
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
Windows (Vcpkg)
folly可在Vcpkg中找到,并通过 vcpkg install folly:x64-windows
构建版本。
您还可以使用 vcpkg install folly:x64-windows --head
来构建 master
。
其他Linux发行版
-
double-conversion (https://github.com/google/double-conversion)
下载并构建double-conversion。你可能需要告诉cmake在哪里找到它。
[double-conversion/]
ln -s src double-conversion
[folly/]
mkdir build && cd build
[folly/build/]cmake "-DCMAKE_INCLUDE_PATH=$DOUBLE_CONVERSION_HOME/include" "-DCMAKE_LIBRARY_PATH=$DOUBLE_CONVERSION_HOME/lib" ..
[folly/build/]
make
-
额外的平台特定依赖项
Fedora >= 21 64位(最后测试在Fedora 28 64位上)
- gcc
- gcc-c++
- cmake
- automake
- boost-devel
- libtool
- lz4-devel
- lzma-devel
- snappy-devel
- zlib-devel
- glog-devel
- gflags-devel
- scons
- double-conversion-devel
- openssl-devel
- libevent-devel
- fmt-devel
- libsodium-devel
可选
- libdwarf-devel
- elfutils-libelf-devel
- libunwind-devel