ALFolly 2016.09.26.00

ALFolly 2016.09.26.00

baiwhte维护。



 
依赖项
boost-for-react-native>= 0
ALDoubleConversion>= 0
ALGlog>= 0
 

ALFolly 2016.09.26.00

  • Facebook

Folly: Facebook 开源库

什么是 folly

Folly (以 Facebook 开源库略为缩写)是一个以实用性和效率为设计理念的 C++11 组件库。它在 Facebook 被广泛使用 Folly 包括了一组核心库组件,这些组件在 Facebook 中被广泛使用。特别是,它通常是 Facebook 的其他开源 C++ 工作的依赖项,也是这些项目共享代码的地方。

它与(而不是与)像 Boost 和当然 std 这样的产品相辅相成。事实上,我们只有在我们需要的某样东西既不可用,又不符合所需性能时,才会着手定义我们自己的组件。我们努力在 std 或 Boost 过时后从 Folly 中删除这些功能。

性能问题贯穿于 Folly 的许多地方,有时导致设计比其他方式更为复杂(例如,参见 PackedSyncPtr.hSmallLocks.h)。在大型规模下获得良好的性能是 Folly 所有方面的一个统一主题。

逻辑设计

Folly 是一个相对独立的组件集合,其中一些组件非常简单,仅包含几个符号。在内部依赖方面没有限制,这意味着给定的 Folly 模块可以使用任何其他 Folly 组件。

所有符号都是在顶级命名空间 folly 中定义的,当然也包括宏。宏名称全为大写,应该以 FOLLY_ 为前缀。命名空间 folly 定义了其他内部命名空间,如 internaldetail。用户代码不应依赖于这些命名空间中的符号。

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.cppfolly/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