Folly: Facebook 开源库
folly
?
什么是 Folly(根据 Facebook Open Source Library 精简而来)是一个设计注重实用性和效率的 C++14 组件库。《Folly 包含了大量 Facebook 广泛使用的核心库组件》。特别是在 Facebook 的其他开源 C++ 成就中,它通常是一个依赖项,并且那些项目可以共享代码。
它与(而不是与)像 Boost 和当然 std
这样的产品互补。事实上,我们只有在需要的东西既不可用,或者不满足所需的性能指标时,才会着手定义自己的组件。我们致力于在 std
或 Boost 废弃这些东西时从 Folly 中删除它们。
对性能的关注贯穿了 Folly 的很多方面,有时会导致设计具有与众不同的特性(例如,请参阅 PackedSyncPtr.h
,SmallLocks.h
)。在大型规模上保持良好的性能是 Folly 中的一个统一主题。
逻辑设计
Folly 是一系列相对独立的组件的集合,其中一些很简单,只有几个符号。内部依赖没有限制,这意味着给定的 folly 模块可以使用任何其他的 folly 组件。
所有符号都在顶级命名空间 folly
中定义,当然除外宏。宏的名称都是全大写,并且应该以 FOLLY_
开头。命名空间 folly
定义了其他的内部命名空间,例如 internal
或 detail
。用户代码不应依赖于这些命名空间中的符号。
Folly 还有一个 实验性
目录。这个名称主要意味着我们认为 API 可能会随着时间的推移而大幅变化。通常,这段代码仍在广泛使用,并且经过了充分测试。
物理设计
Folly 在顶层使用经典的 "拖沓" 计划 folly/folly
,这与 Boost 和其他许多库相同。第一个目录充当库的安装根目录(可能有类似 folly-1.0/
版本),第二个用于在包含文件时区分库,例如:#include <folly/FBString.h>
。
目录结构是平的(模仿命名空间结构),也就是说,我们没有复杂的目录层次结构(将来版本可能发生变化)。子目录 experimental
包含了 folly 内部和可能在 Facebook 内部使用,但尚未认为足以供客户端使用的文件。您的代码不应使用 folly/experimental
中的文件,以免在更新 Folly 时崩溃。
folly/folly/test
子目录包括所有组件的单元测试,通常每个 ComponentXyz.*
使用 ComponentXyzTest.cpp
来命名。folly/folly/docs
目录包含文档。
包含什么?
由于 folly 的结构相对扁平,查看顶层 folly/
目录中的头文件是最好的方式来了解其内容。您还可以查看 文档
文件夹,从 概述
开始。
Folly 在 GitHub 上发布,地址为 https://github.com/facebook/folly
构建说明
依赖关系
Folly 需要 gcc 5.1+ 以及支持 C++14 的 boost 版本。
构建和运行 folly 的测试需要 googletest。您可以从 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 也查找非标准位置的 header 文件和库。例如,如果要同时在目录 /alt/include/path1
和 /alt/include/path2
中查找 header 文件,以及目录 /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 ...
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
如果需要高级调试功能,使用
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
。
cd folly
./build/bootstrap-osx-homebrew.sh
OS X (MacPorts)
从 MacPorts 安装所需包
sudo port install \
autoconf \
automake \
boost \
gflags \
git \
google-glog \
libevent \
libtool \
lz4 \
lzma \
scons \
snappy \
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/folly
autoreconf -ivf
./configure CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib"
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
可选
- libdwarf-dev
- libelf-dev
- libunwind8-dev