Flipper-Folly 2.6.10

Flipper-Folly 2.6.10

Lorenzo Blasa维护。



 
依赖
Flipper-Boost-iOSX>= 0
Flipper-Glog>= 0
Flipper-DoubleConversion>= 0
OpenSSL-Universal= 1.1.1100
libevent~> 2.1.12
Flipper-Fmt= 7.1.7
 

  • Facebook

Folly:Facebook开源库

什么是folly

Logo Folly

Folly(名称源于Facebook开源库,略做变形)是一个设计考虑实用性及效率的C++14组件库。 Folly包含了在Facebook中被广泛使用的各种核心库组件。特别是,它通常是Facebook其他开源C++项目的依赖库,也是那些项目可以共享代码的地方。

它与Boost和当然的std库等提供的解决方案相辅相成(而非竞争)。事实上,只有在所需功能不可用或不符合所需的性能指标时,我们才会着手定义自己的组件。我们努力从Folly中删除那些被std或Boost废弃的组件。

性能考量贯穿于Folly的各个方面,有时导致设计比其他设计更独特(例如PackedSyncPtr.hSmallLocks.h)。在大型规模上的高性能是Folly中一个共同的主题。

逻辑设计

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

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

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