folly
?Folly (abgekürzt nach Facebook Open Source Library) ist eine Bibliothek von C++17-Komponenten, die im Hinblick auf Praktikabilität und Effizienz entwickelt wurde. Folly enthält eine Vielzahl zentraler Bibliothekskomponenten, die bei Facebook häufig verwendet werden . Insbesondere ist es oft eine Abhängigkeit von Facebooks anderen Open-Source-C++-Anstrengungen und einem Ort, an dem diese Projekte Code teilen können.
Es ergänzt (anstatt mit ihnen zu konkurrieren) Angebote wie Boost und natürlich std
. Tatsächlich beginnen wir mit der Definition unserer eigenen Komponente nur dann, wenn etwas, das wir benötigen, entweder nicht verfügbar ist oder nicht dem erforderlichen Leistungsprofil entspricht. Wir bemühen uns, Dinge aus dem Wahnsinn zu entfernen, wenn std
oder Boost sie überflüssig machen.
Leistungsbedenken durchdringen einen Großteil von Folly und führen manchmal zu Designs, die eigenwilliger sind, als sie es sonst wären (siehe z. B. PackedSyncPtr.h
, SmallLocks.h
). Gute Leistung im großen Maßstab ist ein verbindendes Thema bei Folly.
Folly ist eine Sammlung relativ unabhängiger Komponenten, von denen einige nur ein paar Symbole umfassen. Es gibt keine Einschränkung hinsichtlich interner Abhängigkeiten, was bedeutet, dass ein bestimmtes Folly-Modul beliebige andere Folly-Komponenten verwenden kann.
Alle Symbole sind im Top-Level-Namespace folly
definiert, außer natürlich Makros. Makronamen bestehen aus ALL_GROßBUCHSTABEN und sollten mit dem Präfix FOLLY_
versehen werden. Namespace folly
definiert andere interne Namespaces wie internal
oder detail
. Benutzercode sollte nicht von Symbolen in diesen Namespaces abhängen.
Folly hat auch ein experimental
Verzeichnis. Diese Bezeichnung bedeutet in erster Linie, dass wir der Meinung sind, dass sich die API im Laufe der Zeit stark ändern kann. Dieser Code wird normalerweise immer noch häufig verwendet und ist gut getestet.
Auf der obersten Ebene verwendet Folly das klassische „Stotter“-Schema folly/folly
das von Boost und anderen verwendet wird. Das erste Verzeichnis dient als Installationsstammverzeichnis der Bibliothek (mit möglicher Versionierung a la folly-1.0/
), und das zweite dient zur Unterscheidung der Bibliothek beim Einbinden von Dateien, z. B. #include <folly/FBString.h>
.
Die Verzeichnisstruktur ist flach (imitiert die Namespace-Struktur), dh wir haben keine ausgefeilte Verzeichnishierarchie (es ist möglich, dass sich dies in zukünftigen Versionen ändert). Das Unterverzeichnis experimental
enthält Dateien, die innerhalb von Folly und möglicherweise bei Facebook verwendet werden, aber als nicht stabil genug für die Verwendung durch Clients gelten. Ihr Code sollte keine Dateien in folly/experimental
verwenden, damit er nicht beschädigt wird, wenn Sie Folly aktualisieren.
Das Unterverzeichnis folly/folly/test
enthält die Unittests für alle Komponenten, normalerweise mit dem Namen ComponentXyzTest.cpp
für jede ComponentXyz.*
. Das Verzeichnis folly/folly/docs
enthält Dokumentation.
Aufgrund der relativ flachen Struktur von folly ist es am besten, einen Blick auf die Header im folly/
-Verzeichnis der obersten Ebene zu werfen, um zu sehen, was darin enthalten ist. Sie können auch im Ordner docs
nach Dokumentation suchen, beginnend mit der Übersicht.
Folly wird auf GitHub unter https://github.com/facebook/folly veröffentlicht.
Da folly keine ABI-Kompatibilitätsgarantien von Commit zu Commit bietet, empfehlen wir generell, folly als statische Bibliothek zu erstellen.
Folly unterstützt gcc (5.1+), clang oder MSVC. Es sollte unter Linux (x86-32, x86-64 und ARM), iOS, macOS und Windows (x86-64) laufen. Der CMake-Build wird nur auf einigen dieser Plattformen getestet; Unser Ziel ist es, mindestens macOS und Linux zu unterstützen (auf der neuesten Ubuntu LTS-Version oder neuer).
getdeps.py
Dieses Skript wird von vielen OSS-Tools von Meta verwendet. Es lädt zunächst alle erforderlichen Abhängigkeiten herunter und erstellt sie und ruft dann cmake usw. auf, um Folly zu erstellen. Dadurch wird sichergestellt, dass Sie mit relevanten Versionen aller abhängigen Bibliotheken erstellen und dabei berücksichtigen, welche Versionen lokal auf Ihrem System installiert sind.
Es ist in Python geschrieben, daher benötigen Sie Python 3.6 oder höher in Ihrem PATH. Es funktioniert unter Linux, macOS und Windows.
Die Einstellungen für den cmake-Build von folly sind im getdeps-Manifest build/fbcode_builder/manifests/folly
enthalten, das Sie bei Bedarf lokal bearbeiten können.
Unter Linux oder MacOS (mit installiertem Homebrew) können Sie Systemabhängigkeiten installieren, um deren Erstellung zu sparen:
# Clone the repo
git clone https://github.com/facebook/folly
# Install dependencies
cd folly
sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive
Wenn Sie die Pakete vor der Installation sehen möchten:
./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive
Auf anderen Plattformen oder unter Linux und ohne Systemabhängigkeiten wird getdeps.py
sie während des Build-Schritts größtenteils herunterladen und für Sie erstellen.
Einige der Abhängigkeiten, getdeps.py
verwendet und installiert, sind:
Dieses Skript lädt zunächst alle erforderlichen Abhängigkeiten herunter und erstellt sie. Anschließend ruft es cmake usw. auf, um Folly zu erstellen. Dadurch wird sichergestellt, dass Sie mit relevanten Versionen aller abhängigen Bibliotheken erstellen und dabei berücksichtigen, welche Versionen lokal auf Ihrem System installiert sind.
getdeps.py
erfordert derzeit Python 3.6+, um auf Ihrem Pfad zu sein.
getdeps.py
ruft cmake usw. auf.
# 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
Die Ausgabe erfolgt in seinem Scratch-Bereich:
installed/folly/lib/libfolly.a
: Bibliothek Sie können auch das Argument --scratch-path
angeben, um den Speicherort des für den Build verwendeten Scratch-Verzeichnisses zu steuern. Sie können den Standardspeicherort für die Scratch-Installation aus Protokollen oder mit python3 ./build/fbcode_builder/getdeps.py show-inst-dir
ermitteln.
Es gibt auch die Argumente --install-dir
und --install-prefix
um eine detailliertere Kontrolle der Installationsverzeichnisse zu ermöglichen. Da Folly jedoch keine Kompatibilitätsgarantien zwischen Commits bietet, empfehlen wir im Allgemeinen, die Bibliotheken an einem temporären Speicherort zu erstellen und zu installieren und dann den Build Ihres Projekts auf diesen temporären Speicherort zu verweisen, anstatt Folly in den herkömmlichen Systeminstallationsverzeichnissen zu installieren. Wenn Sie beispielsweise mit CMake erstellen, können Sie die Variable CMAKE_PREFIX_PATH
verwenden, um CMake zu ermöglichen, beim Erstellen Ihres Projekts Folly in diesem temporären Installationsverzeichnis zu finden.
Wenn Sie cmake
zum Iterieren erneut aufrufen möchten, gibt es im Scratch-Build-Verzeichnis eine hilfreiche Skriptausgabe run_cmake.py
. Sie finden das Scratch-Build-Verzeichnis in den Protokollen oder mit python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Standardmäßig erstellt getdeps.py
die Tests für Folly. Um sie auszuführen:
cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test
build.sh
/ build.bat
Wrapper build.sh
kann unter Linux und MacOS verwendet werden, unter Windows verwenden Sie stattdessen das Skript build.bat
. Es ist ein Wrapper um getdeps.py
.
Wenn Sie nicht möchten, dass getdeps cmake für Sie aufruft, ist die Erstellung der Tests als Teil des CMake- all
-Ziels standardmäßig deaktiviert. Um die Tests zu erstellen, geben Sie CMake zum Konfigurationszeitpunkt -DBUILD_TESTS=ON
an.
Hinweis: Wenn Sie cmake
erneut aufrufen möchten, um einen getdeps.py
-Build zu iterieren, gibt es im Scratch-Path-Build-Verzeichnis eine hilfreiche Skriptausgabe run_cmake.py
. Sie finden das Scratch-Build-Verzeichnis in den Protokollen oder mit python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Das Ausführen von Tests mit ctests funktioniert auch, wenn Sie zum Build-Verzeichnis wechseln, z. B. (cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
Wenn Sie Boost, Gtest oder andere Abhängigkeiten an einem nicht standardmäßigen Speicherort installiert haben, können Sie die Variablen CMAKE_INCLUDE_PATH
und CMAKE_LIBRARY_PATH
verwenden, damit CMAKE auch nach Header-Dateien und Bibliotheken an nicht standardmäßigen Speicherorten sucht. Um beispielsweise auch die Verzeichnisse /alt/include/path1
und /alt/include/path2
nach Header-Dateien und die Verzeichnisse /alt/lib/path1
und /alt/lib/path2
nach Bibliotheken zu durchsuchen, können Sie cmake
wie folgt aufrufen:
cmake
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
Verwenden Sie den oben genannten getdeps.py
-Ansatz. Wir testen in CI auf Ubuntu LTS und gelegentlich auch auf anderen Distributionen.
Wenn Sie feststellen, dass der Satz von Systempaketen nicht ganz für Ihre ausgewählte Distribution geeignet ist, können Sie in den Abhängigkeitsmanifesten distro-versionsspezifische Überschreibungen angeben (z. B. https://github.com/facebook/folly/blob/main/build/fbcode_builder/ manifestiert/boost ). Sie könnten es wahrscheinlich auf den neuesten von Ubuntu/Debian oder Fedora/Redhat abgeleiteten Distributionen zum Laufen bringen.
Zum Zeitpunkt des Verfassens dieses Artikels (Dezember 2021) gibt es in lang_badge_test eine Build-Pause auf GCC 11.x-basierten Systemen. Wenn Sie die Badge-Funktionalität nicht benötigen, können Sie dies umgehen, indem Sie sie in CMakeLists.txt auskommentieren (fbthrift benötigt sie leider).
Beachten Sie, dass viele Tests für Folly-Windows-Builds deaktiviert sind. Sie können sie im Protokoll des cmake-Konfigurationsschritts sehen oder indem Sie in CMakeLists.txt
nach WINDOWS_DISABLED suchen
Allerdings funktionieren getdeps.py
Builds unter Windows und werden in CI getestet.
Wenn Sie möchten, können Sie Vcpkg ausprobieren. folly ist in Vcpkg verfügbar und Releases können über vcpkg install folly:x64-windows
erstellt werden.
Sie können auch vcpkg install folly:x64-windows --head
verwenden, um gegen main
zu erstellen.
getdeps.py
Builds funktionieren unter macOS und werden in CI getestet. Wenn Sie es jedoch vorziehen, können Sie einen der macOS-Paketmanager ausprobieren
Folly ist als Formel verfügbar und Releases können über brew install folly
erstellt werden.
Sie können auch folly/build/bootstrap-osx-homebrew.sh
verwenden, um gegen main
zu bauen:
./folly/build/bootstrap-osx-homebrew.sh
Dadurch wird auf der obersten Ebene ein Build-Verzeichnis _build
erstellt.
Installieren Sie die erforderlichen Pakete von MacPorts:
sudo port install
boost
cmake
gflags
git
google-glog
libevent
libtool
lz4
lzma
openssl
snappy
xz
zlib
Laden Sie die Doppelkonvertierung herunter und installieren Sie sie:
git clone https://github.com/google/double-conversion.git
cd double-conversion
cmake -DBUILD_SHARED_LIBS=ON .
make
sudo make install
Laden Sie Folly herunter und installieren Sie es mit den unten aufgeführten Parametern:
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install