folly - Facebook 开发和使用的开源 C++ 库。

Created at: 2012-06-02 04:49:04
Language: C++
License: Apache-2.0

愚蠢:Facebook开源库

支持乌克兰 - 帮助向乌克兰提供人道主义援助。

什么?
folly

徽标愚蠢

Folly(在Facebook开源库之后松散地缩写)是一个包含C++14个组件的库,设计时考虑到了实用性和效率。Folly包含Facebook广泛使用的各种核心库组件。特别是,它通常是Facebook其他开源C++工作的依赖,这些项目可以共享代码的地方。

它补充(而不是竞争)产品,例如 Boost 当然还有 .事实上,只有当我们需要的东西不可用或不符合所需的性能配置文件时,我们才会开始定义我们自己的组件。我们努力从愚蠢中移除事物,如果或何时或 Boost 过时它们。

std
std

性能问题渗透到Folly的大部分内容中,有时会导致设计比其他设计更特殊(例如,请参阅,)。大规模良好的性能是所有Folly的统一主题。

PackedSyncPtr.h
SmallLocks.h

在介绍视频中查看

像我5岁一样解释:愚蠢

逻辑设计

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

所有的符号都定义在顶级命名空间中,当然宏除外。宏名称ALL_UPPERCASE,应以 为前缀。命名空间定义其他内部命名空间,例如 或 。用户代码不应依赖于这些命名空间中的符号。

folly
FOLLY_
folly
internal
detail

Folly也有一个目录。这个名称主要意味着我们认为 API 可能会随着时间的推移而发生重大变化。通常,此代码仍在大量使用,并且经过了良好的测试。

experimental

物理设计

在顶层,Folly使用Boost和其他人使用的经典“口吃”方案。第一个目录用作库的安装根目录(可能带有版本控制 la ),第二个目录是在包含文件时区分库,例如。

folly/folly
folly-1.0/
#include <folly/FBString.h>

目录结构是扁平的(模仿命名空间结构),即我们没有详细的目录层次结构(这可能会在未来的版本中发生变化)。子目录包含的文件在愚蠢中使用,可能在Facebook上使用,但被认为不够稳定,不适合客户端使用。你的代码不应使用文件,以免在更新 Folly 时中断。

experimental
folly/experimental

子目录包括所有组件的单元测试,通常以每个 .该目录包含文档。

folly/folly/test
ComponentXyzTest.cpp
ComponentXyz.*
folly/folly/docs

里面有什么?

由于 folly 的结构相当扁平,查看其中内容的最佳方法是查看顶级 folly/ 目录中的标头。你还可以从概述开始检查 docs 文件夹中的文档。

Folly 发布在 GitHub 上,网址为 https://github.com/facebook/folly

构建说明

由于 folly 不提供从提交到提交的任何 ABI 兼容性保证,因此我们通常建议将 folly 构建为静态库。

Folly 支持 gcc (5.1+)、clang 或 MSVC。它应该在Linux(x86-32,x86-64和ARM),iOS,macOS和Windows(x86-64)上运行。CMake 构建仅在其中一些平台上进行测试;至少,我们的目标是支持macOS和Linux(在最新的Ubuntu LTS版本或更高版本上)。

getdeps.py

这个脚本被许多元维基的 OSS 工具使用。它将首先下载并构建所有必要的依赖项,然后调用 cmake 等来构建愚蠢。这将有助于确保使用所有相关库的相关版本进行构建,同时考虑系统上本地安装的版本。

它是用python编写的,所以你的PATH需要python3.6或更高版本。它适用于Linux,macOS和Windows。

folly的cmake构建的设置保存在其getdeps清单中,如果需要,你可以在本地编辑。

build/fbcode_builder/manifests/folly

依赖

如果在 Linux 或 MacOS(安装了自制软件)上,你可以安装系统依赖项以节省构建它们:

# Clone the repo
git clone https://github.com/facebook/folly
# Install dependencies
cd folly
sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive

如果你想在安装软件包之前查看它们:

./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive

在其他平台上,或者在 Linux 上并且没有系统依赖项,大多数情况下会在构建步骤中为你下载和构建它们。

getdeps.py

使用和安装的一些依赖项包括:

getdeps.py

  • 在 C++14 支持下编译的 boost 版本。
  • googletest是构建和运行folly测试所必需的

该脚本将首先下载并构建所有必要的依赖项,然后调用 cmake 等来构建 folly。这将有助于确保使用所有相关库的相关版本进行构建,同时考虑系统上本地安装的版本。

getdeps.py
目前需要 python 3.6+ 才能走上你的道路。

getdeps.py
将调用 cmake 等

# Clone the repo
git clone https://github.com/facebook/folly
cd folly
# Build, using system dependencies if available
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages build

它将输出放在其暂存区域中:

  • installed/folly/lib/libfolly.a
    :图书馆

你还可以指定一个参数来控制用于构建的暂存目录的位置。你可以从日志或

--scratch-path
python3 ./build/fbcode_builder/getdeps.py show-inst-dir

还有一些参数可以提供对安装目录的更精细的控制。但是,鉴于 folly 在提交之间不提供兼容性保证,我们通常建议将库构建并安装到临时位置,然后将项目的构建指向此临时位置,而不是在传统的系统安装目录中安装 fallly。例如,如果你使用 CMake 构建,则可以使用该变量允许 CMake 在构建项目时在此临时安装目录中查找愚蠢的内容。

--install-dir
--install-prefix
CMAKE_PREFIX_PATH

如果要再次调用以进行迭代,则临时构建目录中有一个有用的脚本输出。你可以从日志中找到暂存构建目录或

cmake
run_cmake.py
python3 ./build/fbcode_builder/getdeps.py show-build-dir

运行测试

默认情况下,将构建愚蠢的测试。要运行它们:

getdeps.py

cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test

build.sh
/
build.bat
包装纸

build.sh
可以在Linux和MacOS上使用,在Windows上使用脚本代替。它是一个包装器
build.bat
getdeps.py

直接使用 cmake 构建

如果你不想让 getdeps 为你调用 cmake,那么默认情况下,构建测试作为 CMake 目标的一部分是禁用的。若要生成测试,请在配置时指定为 CMake。

all
-DBUILD_TESTS=ON

注意,如果要再次调用以迭代构建,则在暂存路径构建目录中有一个有用的脚本输出。你可以从日志中找到暂存构建目录或

cmake
getdeps.py
run_cmake.py
python3 ./build/fbcode_builder/getdeps.py show-build-dir

如果你cd到构建目录,使用ctests运行测试也可以工作,例如(cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir)&& ctest)'

 

在非默认位置查找依赖项

如果在非默认位置安装了 boost、gtest 或其他依赖项,则可以使用 and 变量使 CMAKE 外观也在非标准位置查找头文件和库。例如,若要同时搜索目录、头文件、目录和库,可以按如下方式调用:

CMAKE_INCLUDE_PATH
CMAKE_LIBRARY_PATH
/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 ...

Ubuntu LTS, CentOS Stream, Fedora

使用上述方法。我们在 Ubuntu LTS 上的 CI 中进行测试,偶尔在其他发行版上进行测试。

getdeps.py

如果你发现系统软件包集不太适合你选择的发行版,则可以在依赖项清单中指定特定于发行版版本的覆盖(例如 https://github.com/facebook/folly/blob/main/build/fbcode_builder/manifests/boost )。你可以让它在最新的Ubuntu / Debian或Fedora / Redhat派生发行版上运行。

在撰写本文时(2021 年 12 月),lang_badge_test中基于 GCC 11.x 的系统有一个构建中断。如果你不需要徽章功能,你可以通过从CMakeLists中注释掉它来解决.txt(不幸的是,fbthrift确实需要它)

视窗 (Vcpkg)

请注意,许多测试对于愚蠢的 Windows 版本是禁用的,你可以从 cmake 配置步骤的日志中看到它们,或者通过在 cmake 配置步骤中查找WINDOWS_DISABLED

CMakeLists.txt

也就是说,构建在Windows上工作并在CI中进行测试。

getdeps.py

如果你愿意,可以尝试 Vcpkg.folity 在 Vcpkg 中可用,并且可以通过 构建版本。

vcpkg install folly:x64-windows

你也可以使用 来针对 进行构建。

vcpkg install folly:x64-windows --head
main

苹果操作系统

getdeps.py
构建在macOS上工作并在CI中进行测试,但是如果你愿意,可以尝试使用macOS软件包管理器之一

自制

folly 可作为公式提供,版本可通过 构建。

brew install folly

你也可以使用 构建:

folly/build/bootstrap-osx-homebrew.sh
main

  ./folly/build/bootstrap-osx-homebrew.sh

这将在顶层创建一个构建目录。

_build

苹果端口

从 MacPort 安装所需的软件包:

  sudo port install \
    boost \
    cmake \
    gflags \
    git \
    google-glog \
    libevent \
    libtool \
    lz4 \
    lzma \
    openssl \
    snappy \
    xz \
    zlib

下载并安装双重转换:

  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