spectrum-folly 2019.01.21.00

spectrum-folly 2019.01.21.00

Spectrum 维护。



spectrum-folly 2019.01.21.00

  • Facebook

Folly: Facebook 开源库

Build Status

什么是 folly

Folly(根据 Facebook Open Source Library 精简而来)是一个设计注重实用性和效率的 C++14 组件库。《Folly 包含了大量 Facebook 广泛使用的核心库组件》。特别是在 Facebook 的其他开源 C++ 成就中,它通常是一个依赖项,并且那些项目可以共享代码。

它与(而不是与)像 Boost 和当然 std 这样的产品互补。事实上,我们只有在需要的东西既不可用,或者不满足所需的性能指标时,才会着手定义自己的组件。我们致力于在 std 或 Boost 废弃这些东西时从 Folly 中删除它们。

对性能的关注贯穿了 Folly 的很多方面,有时会导致设计具有与众不同的特性(例如,请参阅 PackedSyncPtr.hSmallLocks.h)。在大型规模上保持良好的性能是 Folly 中的一个统一主题。

逻辑设计

Folly 是一系列相对独立的组件的集合,其中一些很简单,只有几个符号。内部依赖没有限制,这意味着给定的 folly 模块可以使用任何其他的 folly 组件。

所有符号都在顶级命名空间 folly 中定义,当然除外宏。宏的名称都是全大写,并且应该以 FOLLY_ 开头。命名空间 folly 定义了其他的内部命名空间,例如 internaldetail。用户代码不应依赖于这些命名空间中的符号。

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_PATHCMAKE_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