folly - Facebook で開発および使用されているオープンソースの C++ ライブラリ。

(An open-source C++ library developed and used at Facebook.)

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

Folly: Facebook オープンソース ライブラリ

ウクライナを支援 - ウクライナへの人道支援の提供を支援します。

とは
folly
?

ロゴ・フォリー

Folly (Facebook Open Source Library にちなんで略称) は、実用性と効率性を念頭に置いて設計された C++14 コンポーネントのライブラリです。Folly には、Facebook で広く使用されているさまざまなコア ライブラリ コンポーネントが含まれています。特に、Facebook の他のオープン ソース C++ の取り組みや、それらのプロジェクトがコードを共有できる場所に依存していることがよくあります。

Boost やもちろん

std
. 実際、必要なものが利用できないか、必要なパフォーマンスプロファイルを満たしていない場合にのみ、独自のコンポーネントの定義に着手します。
std
ブーストがそれらを時代遅れにする場合、またはいつそれらを愚かなものから取り除くよう努めます。

パフォーマンスに関する懸念は Folly の多くに浸透しており、そうでない場合よりも特異な設計につながる場合があります (たとえば

PackedSyncPtr.h
、を参照
SmallLocks.h
)。大規模での優れたパフォーマンスは、すべての Folly の統一テーマです。

紹介動画でチェック

私が 5 のように説明する: 愚かさ

論理設計

Folly は、比較的独立したコンポーネントのコレクションであり、一部はいくつかのシンボルと同じくらい単純です。内部の依存関係に制限はありません。つまり、特定の愚かなモジュールが他の愚かなコンポーネントを使用する可能性があります。

folly
もちろんマクロを除いて、すべてのシンボルは最上位の名前空間で定義されています。マクロ名は ALL_UPPERCASE で、接頭辞として
FOLLY_
. 名前空間は、や
folly
などの他の内部名前空間を定義します。ユーザー コードは、これらの名前空間のシンボルに依存してはなりません。
internal
detail

Folly にも

experimental
ディレクトリがあります。この指定は主に、API が時間の経過とともに大幅に変更される可能性があると考えていることを暗示しています。通常、このコードはまだ頻繁に使用されており、十分にテストされています。

物理設計

folly/folly
トップレベルでは、Folly はBoost などで使用されている古典的な「stuttering」スキームを 使用します。最初のディレクトリはライブラリのインストール ルートとして機能し (バージョニングの可能性
folly-1.0/
あり)、2 番目のディレクトリはファイルを含めるときにライブラリを区別するためのものです (例:
#include <folly/FBString.h>
.

ディレクトリ構造はフラットです (ネームスペース構造を模倣しています)。つまり、複雑なディレクトリ階層はありません (これは将来のバージョンで変更される可能性があります)。サブディレクトリ

experimental
には、folly 内で使用され、おそらく Facebook で使用されるファイルが含まれていますが、クライアントで使用するには十分に安定しているとは見なされません。
folly/experimental
Folly を更新したときに壊れないように、コードでファイルを使用しないでください。

folly/folly/test
サブディレクトリには、すべてのコンポーネントの単体テストが含まれており、通常はそれぞれの名前が付けられて
ComponentXyzTest.cpp
います
ComponentXyz.*
folly/folly/docs
ディレクトリにはドキュメントが含まれています。

何が入ってるの?

folly のかなりフラットな構造のため、その内容を確認する最善の方法は、最上位の

folly/
directoryのヘッダーを確認することです。また、概要から始めて、
docs
フォルダー
のドキュメントを 確認することもできます。

Folly は、 https://github.com/facebook/follyの GitHub で公開されています。

ビルドノート

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

このスクリプトは、Meta の OSS ツールの多くで使用されています。最初に必要なすべての依存関係をダウンロードしてビルドし、次に cmake などを呼び出して folly をビルドします。これにより、システムにローカルにインストールされているバージョンを考慮して、すべての依存ライブラリの適切なバージョンでビルドすることができます。

Python で書かれているので、PATH に python3.6 以降が必要です。Linux、macOS、および Windows で動作します。

folly の cmake ビルドの設定は getdeps manifest

build/fbcode_builder/manifests/folly
に保持されており、必要に応じてローカルで編集できます。

依存関係

Linux または MacOS (homebrew がインストールされている) の場合は、システムの依存関係をインストールしてビルドを節約できます。

# 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 サポートでコンパイルされたブーストのバージョン。
  • folly のテストをビルドして実行するには googletest が必要です

建てる

このスクリプトは、最初に必要なすべての依存関係をダウンロードしてビルドし、次に 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

また、インストール ディレクトリをよりきめ細かく制御するための引数も

--install-dir
あります。
--install-prefix
ただし、folly ではコミット間の互換性が保証されないため、従来のシステム インストール ディレクトリに folly をインストールするのではなく、ライブラリをビルドして一時的な場所にインストールし、プロジェクトのビルドをこの一時的な場所に指定することをお勧めします。たとえば、CMake でビルドしている
CMAKE_PREFIX_PATH
場合、プロジェクトをビルドするときに CMake がこの一時的なインストール ディレクトリで folly を検出できるように、変数を使用できます。

繰り返し実行するために再度呼び出したい場合

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

all
ターゲットの一部としてテストのビルドが無効になっています。テストをビルドするには、
-DBUILD_TESTS=ON
configure 時に CMake に指定します。

cmake
注意: ビルドを繰り返すために再度呼び出したい場合
getdeps.py
は、scratch-path ビルド ディレクトリに役立つ
run_cmake.py
スクリプト出力があります。スクラッチ ビルド ディレクトリは、ログから、または
python3 ./build/fbcode_builder/getdeps.py show-build-dir

ctests を使用したテストの実行は、cd でビルド ディレクトリに移動した場合にも機能します

 

デフォルト以外の場所で依存関係を見つける

ブースト、gtest、またはその他の依存関係が既定以外の場所にインストールされている場合は、変数

CMAKE_INCLUDE_PATH
CMAKE_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 ...

Ubuntu LTS、CentOS ストリーム、Fedora

getdeps.py
上記のアプローチを使用します。Ubuntu LTS の CI でテストし、場合によっては他のディストリビューションでもテストします。

選択したディストリビューションに対してシステム パッケージのセットが適切でない場合は、依存関係マニフェストでディストリビューション バージョン固有のオーバーライドを指定できます (例: https://github.com/facebook/folly/blob/main/build/fbcode_builder/マニフェスト/ブースト)。おそらく、最新の Ubuntu/Debian または Fedora/Redhat 派生ディストリビューションで動作させることができます。

執筆時点 (2021 年 12 月) では、lang_badge_test で GCC 11.x ベースのシステムにビルドの中断があります。バッジ機能が必要ない場合は、CMakeLists.txt からコメントアウトすることで回避できます (残念ながら、fbthrift には必要です)。

Windows (Vcpkg)

愚かな Windows ビルドでは多くのテストが無効になっていることに注意してください。それらは cmake configure ステップのログで確認できます。

CMakeLists.txt

つまり、

getdeps.py
ビルドは Windows で動作し、CI でテストされています。

必要に応じて、Vcpkg を試すことができます。folly はVcpkgで利用でき、リリースは 経由でビルドできます

vcpkg install folly:x64-windows

vcpkg install folly:x64-windows --head
に対してビルドするために使用することもできます
main

マックOS

getdeps.py
ビルドは macOS で動作し、CI でテストされていますが、必要に応じて、macOS パッケージ マネージャーのいずれかを試すことができます

自作

folly はフォーミュラとして利用でき、リリースは 経由でビルドできます

brew install folly

folly/build/bootstrap-osx-homebrew.sh
に対してビルドするために使用することもできます
main
:

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

_build
これにより、最上位にビルド ディレクトリが作成されます。

Mac ポート

MacPorts から必要なパッケージをインストールします。

  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