folly
とは何でしょうか?Folly (Facebook Open Source Library の略称) は、実用性と効率性を念頭に置いて設計された C++17 コンポーネントのライブラリです。 Folly には、Facebook で広く使用されているさまざまなコア ライブラリ コンポーネントが含まれています。特に、これは Facebook の他のオープンソース C++ の取り組みと依存関係にあり、それらのプロジェクトがコードを共有できる場所であることがよくあります。
これは、 Boost や、もちろんstd
などの製品を (競合するのではなく) 補完します。実際、必要なものが入手できない場合、または必要なパフォーマンス プロファイルを満たさない場合にのみ、独自のコンポーネントの定義に着手します。私たちは、 std
や Boost によって時代遅れになった場合には、その愚かさから物事を取り除くよう努めます。
パフォーマンスに関する懸念は Folly の多くに浸透しており、場合によっては他の場合よりも特異な設計につながることもあります (たとえば、 PackedSyncPtr.h
、 SmallLocks.h
を参照)。大規模なパフォーマンスで優れたパフォーマンスを発揮することが、Folly 全体の統一テーマです。
Folly は比較的独立したコンポーネントのコレクションであり、いくつかのコンポーネントはいくつかのシンボルのように単純です。内部依存関係には制限がありません。つまり、特定の Folly モジュールが他の Folly コンポーネントを使用できることを意味します。
マクロを除くすべてのシンボルは、トップレベルの名前空間folly
で定義されます。マクロ名は ALL_UPPERCASE であり、接頭辞としてFOLLY_
を付ける必要があります。名前空間folly
internal
やdetail
などの他の内部名前空間を定義します。ユーザー コードは、これらの名前空間のシンボルに依存しないでください。
Folly にはexperimental
ディレクトリもあります。この指定は主に、API が時間の経過とともに大きく変更される可能性があると感じていることを暗示しています。通常、このコードは現在でも頻繁に使用されており、十分にテストされています。
トップレベルでは、Folly は Boost などが使用する古典的な「吃音」スキームfolly/folly
使用します。最初のディレクトリはライブラリのインストール ルートとして機能し ( folly-1.0/
ようなバージョン管理が可能)、2 番目のディレクトリは、 #include <folly/FBString.h>
などのファイルをインクルードするときにライブラリを区別するためのものです。
ディレクトリ構造はフラットです (名前空間構造を模倣しています)。つまり、複雑なディレクトリ階層はありません (これは将来のバージョンで変更される可能性があります)。 experimental
サブディレクトリには、folly 内およびおそらく Facebook で使用されるファイルが含まれていますが、クライアントでの使用には十分安定していないと考えられます。 Folly を更新するときにコードが壊れる可能性があるため、コードはfolly/experimental
ファイルを使用しないでください。
folly/folly/test
サブディレクトリには、すべてのコンポーネントの Unittests が含まれており、通常はComponentXyz.*
ごとにComponentXyzTest.cpp
という名前が付けられます。 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
このスクリプトは、Meta の OSS ツールの多くで使用されます。最初に必要な依存関係をすべてダウンロードしてビルドし、次に cmake などを呼び出してビルドします。これは、システムにローカルにインストールされているバージョンを考慮して、すべての依存ライブラリの関連バージョンを使用してビルドすることを保証するのに役立ちます。
Python で書かれているため、PATH に python3.6 以降が必要です。 Linux、macOS、Windows で動作します。
folly の cmake ビルドの設定は、 getdeps マニフェスト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
が使用およびインストールする依存関係の一部は次のとおりです。
このスクリプトは、最初に必要な依存関係をすべてダウンロードしてビルドし、次に cmake などを呼び出してビルドします。これは、システムにローカルにインストールされているバージョンを考慮して、すべての依存ライブラリの関連バージョンを使用してビルドすることを保証するのに役立ちます。
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 がこの一時インストール ディレクトリで愚かさを検出できるようにすることができます。
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
のラッパーです。
getdeps に cmake を呼び出させたくない場合は、デフォルトで、CMake all
ターゲットの一部としてテストのビルドが無効になります。テストをビルドするには、構成時に CMake に-DBUILD_TESTS=ON
を指定します。
注意: cmake
再度呼び出してgetdeps.py
ビルドを反復する場合は、スクラッチ パス ビルド ディレクトリに便利なrun_cmake.py
スクリプト出力があります。スクラッチ ビルド ディレクトリは、ログから、またはpython3 ./build/fbcode_builder/getdeps.py show-build-dir
を使用して見つけることができます。
ctests を使用したテストの実行は、ビルド ディレクトリに cd した場合にも機能します。たとえば(cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
boost、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 ...
上記の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 ビルドでは多くのテストが無効になっていることに注意してください。これらのテストは、cmake configure ステップのログで確認するか、 CMakeLists.txt
で WINDOWS_DISABLED を探すことで確認できます。
つまり、 getdeps.py
ビルドは Windows 上で動作し、CI でテストされます。
必要に応じて、Vcpkg を試してみてください。 folly は 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
が作成されます。
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