Folly: Facebook 开源库
folly
?
什么是 Folly (以 Facebook 开源库略为缩写)是一个以实用性和效率为设计理念的 C++11 组件库。它在 Facebook 被广泛使用 Folly 包括了一组核心库组件,这些组件在 Facebook 中被广泛使用。特别是,它通常是 Facebook 的其他开源 C++ 工作的依赖项,也是这些项目共享代码的地方。
它与(而不是与)像 Boost 和当然 std
这样的产品相辅相成。事实上,我们只有在我们需要的某样东西既不可用,又不符合所需性能时,才会着手定义我们自己的组件。我们努力在 std
或 Boost 过时后从 Folly 中删除这些功能。
性能问题贯穿于 Folly 的许多地方,有时导致设计比其他方式更为复杂(例如,参见 PackedSyncPtr.h
,SmallLocks.h
)。在大型规模下获得良好的性能是 Folly 所有方面的一个统一主题。
逻辑设计
Folly 是一个相对独立的组件集合,其中一些组件非常简单,仅包含几个符号。在内部依赖方面没有限制,这意味着给定的 Folly 模块可以使用任何其他 Folly 组件。
所有符号都是在顶级命名空间 folly
中定义的,当然也包括宏。宏名称全为大写,应该以 FOLLY_
为前缀。命名空间 folly
定义了其他内部命名空间,如 internal
或 detail
。用户代码不应依赖于这些命名空间中的符号。
Folly 还有一个名为 experimental
的目录。这个命名主要表明我们认为 API 在未来可能会发生重大变化。通常,这段代码仍在被大量使用并且经过了良好的测试。
物理设计
Folly 在顶级目录中使用经典的 "stuttering" 方案 folly/folly
,类似于 Boost 和其他库。第一个目录用作库的安装根目录(可能包含版本号,例如 folly-1.0/
),第二个目录用于在包含文件时区分库,例如 #include <folly/FBString.h>
。
目录结构是扁平的(模仿命名空间结构),即没有复杂的目录层次结构(在未来版本中可能会有所改变)。子目录 experimental
包含 Folly 内部使用,可能在 Facebook 也使用,但尚未认为足够稳定供客户端使用的文件。你不应该在代码中使用 folly/experimental
目录中的文件,以免在更新 Folly 时出现中断。
folly/folly/test
子目录包含所有组件的 unittests,通常每个 ComponentXyz.*
命名为 ComponentXyzTest.cpp
。folly/folly/docs
目录包含文档。
包含什么?
由于 Folly 的结构相对扁平,查看其内容的最佳方法是查看顶级目录 folly/
中的头文件。你还可以查看 docs
文件夹 中的文档,从 概览 开始。
Folly 在 Github 发布,网址为 https://github.com/facebook/folly
构建说明
依赖关系
folly 需要 gcc 4.8+ 和一个支持 C++11 的编译的 Boost 版本。
请从 https://googletest.googlecode.com/files/gtest-1.7.0.zip 下载 googletest,并将其解压缩到 folly/test 子目录中。
Ubuntu 12.04
该版本较旧,需要很多更新。但是,由于Travis CI在12.04上运行,已提供folly/build/deps_ubuntu_12.04.sh
脚本,该脚本会更新所有所需软件包。
Ubuntu 13.10
以下软件包是必需的(您可以复制并粘贴下面的apt-get命令)
sudo apt-get install \
g++ \
automake \
autoconf \
autoconf-archive \
libtool \
libboost-all-dev \
libevent-dev \
libdouble-conversion-dev \
libgoogle-glog-dev \
libgflags-dev \
liblz4-dev \
liblzma-dev \
libsnappy-dev \
make \
zlib1g-dev \
binutils-dev \
libjemalloc-dev \
libssl-dev
如果需要测试的高级调试功能
sudo apt-get install \
libunwind8-dev \
libelf-dev \
libdwarf-dev
Ubuntu 14.04 LTS
上述为Ubuntu 13.10所列出的软件包也是必需的,以及
sudo apt-get install \
libiberty-dev
上述软件包对于Ubuntu 13.10和Ubuntu 14.04而言是足够的。
在folly目录下运行
autoreconf -ivf
./configure
make
make check
sudo make install
OS X (Homebrew)
folly作为Formula可用,可以通过brew install folly
进行构建。
您还可以使用folly/build/bootstrap-osx-homebrew.sh
构建针对master
的版本。
cd folly
./build/bootstrap-osx-homebrew.sh
make
make check
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
其他Linux发行版
-
double-conversion (https://github.com/google/double-conversion)
下载并构建double-conversion。您可能需要告诉configure如何找到它。
[double-conversion/]
ln -s src double-conversion
[folly/]
./configure LDFLAGS=-L$DOUBLE_CONVERSION_HOME/ CPPFLAGS=-I$DOUBLE_CONVERSION_HOME/
[folly/]
LD_LIBRARY_PATH=$DOUBLE_CONVERSION_HOME/ make
-
特定平台的额外依赖项
Fedora 21 64位
- gcc
- gcc-c++
- autoconf
- autoconf-archive
- 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