folly
?Folly (acronyme vaguement d'après Facebook Open Source Library) est une bibliothèque de composants C++17 conçue dans un souci de praticité et d'efficacité. Folly contient une variété de composants de bibliothèque de base largement utilisés sur Facebook . En particulier, il s'agit souvent d'une dépendance des autres efforts C++ open source de Facebook et du lieu où ces projets peuvent partager du code.
Il complète (plutôt que de rivaliser) des offres telles que Boost et bien sûr std
. En fait, nous nous engageons à définir notre propre composant uniquement lorsque quelque chose dont nous avons besoin n'est pas disponible ou ne répond pas au profil de performances requis. Nous nous efforçons de supprimer les choses de la folie si ou quand std
ou Boost les rendent obsolètes.
Les problèmes de performances imprègnent une grande partie de Folly, conduisant parfois à des conceptions plus idiosyncratiques qu'elles ne le seraient autrement (voir par exemple PackedSyncPtr.h
, SmallLocks.h
). Une bonne performance à grande échelle est un thème fédérateur dans tout Folly.
La folie est un ensemble de composants relativement indépendants, certains aussi simples que quelques symboles. Il n'y a aucune restriction sur les dépendances internes, ce qui signifie qu'un module de folie donné peut utiliser n'importe quel autre composant de folie.
Tous les symboles sont définis dans l'espace de noms de niveau supérieur folly
, à l'exception bien sûr des macros. Les noms de macro sont ALL_UPPERCASE et doivent être préfixés par FOLLY_
. folly
des espaces de noms définit d'autres espaces de noms internes tels que internal
ou detail
. Le code utilisateur ne doit pas dépendre des symboles présents dans ces espaces de noms.
Folly possède également un répertoire experimental
. Cette désignation implique principalement que nous pensons que l'API peut changer considérablement au fil du temps. Ce code, en général, est encore très utilisé et est bien testé.
Au niveau supérieur, Folly utilise le schéma classique de « bégaiement » folly/folly
utilisé par Boost et d'autres. Le premier répertoire sert de racine d'installation de la bibliothèque (avec un versioning possible à la folly-1.0/
), et le second sert à distinguer la bibliothèque lors de l'inclusion de fichiers, par exemple #include <folly/FBString.h>
.
La structure des répertoires est plate (imitant la structure de l'espace de noms), c'est-à-dire que nous n'avons pas de hiérarchie de répertoires élaborée (il est possible que cela change dans les versions futures). Le sous-répertoire experimental
contient des fichiers qui sont utilisés dans Folly et éventuellement sur Facebook, mais qui ne sont pas considérés comme suffisamment stables pour une utilisation client. Votre code ne doit pas utiliser de fichiers dans folly/experimental
de peur qu'il ne se brise lors de la mise à jour de Folly.
Le sous-répertoire folly/folly/test
comprend les tests unitaires pour tous les composants, généralement nommés ComponentXyzTest.cpp
pour chaque ComponentXyz.*
. Le répertoire folly/folly/docs
contient de la documentation.
En raison de la structure assez plate de Folly, la meilleure façon de voir ce qu'il contient est de regarder les en-têtes du répertoire folly/
de niveau supérieur. Vous pouvez également consulter le dossier docs
pour la documentation, en commençant par la présentation.
Folly est publié sur GitHub à l'adresse https://github.com/facebook/folly.
Étant donné que Folly ne fournit aucune garantie de compatibilité ABI d'une validation à l'autre, nous recommandons généralement de construire Folly en tant que bibliothèque statique.
folie prend en charge gcc (5.1+), clang ou MSVC. Il doit fonctionner sous Linux (x86-32, x86-64 et ARM), iOS, macOS et Windows (x86-64). La version CMake n'est testée que sur certaines de ces plates-formes ; au minimum, nous visons à prendre en charge macOS et Linux (sur la dernière version d'Ubuntu LTS ou plus récente.)
getdeps.py
Ce script est utilisé par de nombreux outils OSS de Meta. Il téléchargera et construira d'abord toutes les dépendances nécessaires, puis invoquera cmake, etc. pour créer de la folie. Cela permettra de garantir que vous construisez avec les versions pertinentes de toutes les bibliothèques dépendantes, en tenant compte des versions installées localement sur votre système.
Il est écrit en python, vous aurez donc besoin de python3.6 ou version ultérieure sur votre PATH. Il fonctionne sous Linux, macOS et Windows.
Les paramètres de la construction cmake de Folly sont conservés dans son manifeste getdeps build/fbcode_builder/manifests/folly
, que vous pouvez modifier localement si vous le souhaitez.
Si vous êtes sous Linux ou MacOS (avec homebrew installé), vous pouvez installer des dépendances système pour éviter de les construire :
# Clone the repo
git clone https://github.com/facebook/folly
# Install dependencies
cd folly
sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive
Si vous souhaitez voir les packages avant de les installer :
./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive
Sur d'autres plates-formes ou sous Linux et sans dépendances système, getdeps.py
les téléchargera et les créera principalement pour vous pendant l'étape de construction.
Certaines des dépendances getdeps.py
utilise et installe sont :
Ce script téléchargera et construira d'abord toutes les dépendances nécessaires, puis invoquera cmake, etc. pour créer de la folie. Cela permettra de garantir que vous construisez avec les versions pertinentes de toutes les bibliothèques dépendantes, en tenant compte des versions installées localement sur votre système.
getdeps.py
nécessite actuellement que python 3.6+ soit sur votre chemin.
getdeps.py
invoquera cmake etc.
# 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
Il place la sortie dans sa zone de travail :
installed/folly/lib/libfolly.a
: Bibliothèque Vous pouvez également spécifier un argument --scratch-path
pour contrôler l'emplacement du répertoire de travail utilisé pour la construction. Vous pouvez trouver l'emplacement d'installation par défaut dans les journaux ou avec python3 ./build/fbcode_builder/getdeps.py show-inst-dir
.
Il existe également des arguments --install-dir
et --install-prefix
pour fournir un contrôle plus précis des répertoires d'installation. Cependant, étant donné que Folly n'offre aucune garantie de compatibilité entre les commits, nous recommandons généralement de créer et d'installer les bibliothèques dans un emplacement temporaire, puis de pointer la construction de votre projet vers cet emplacement temporaire, plutôt que d'installer Folly dans les répertoires d'installation traditionnels du système. par exemple, si vous construisez avec CMake, vous pouvez utiliser la variable CMAKE_PREFIX_PATH
pour permettre à CMake de trouver de la folie dans ce répertoire d'installation temporaire lors de la construction de votre projet.
Si vous souhaitez invoquer à nouveau cmake
pour effectuer une itération, il existe une sortie de script run_cmake.py
utile dans le répertoire de construction scratch. Vous pouvez trouver le répertoire de construction scratch à partir des journaux ou avec python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Par défaut, getdeps.py
construira les tests de folie. Pour les exécuter :
cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test
build.sh
/ build.bat
build.sh
peut être utilisé sous Linux et MacOS, sous Windows, utilisez plutôt le script build.bat
. C'est un wrapper autour de getdeps.py
.
Si vous ne souhaitez pas laisser getdeps appeler cmake pour vous, par défaut, la construction des tests est désactivée dans le cadre de la cible CMake all
. Pour créer les tests, spécifiez -DBUILD_TESTS=ON
à CMake au moment de la configuration.
NB si vous souhaitez invoquer à nouveau cmake
pour itérer sur une build getdeps.py
, il existe une sortie de script run_cmake.py
utile dans le répertoire de build scratch-path. Vous pouvez trouver le répertoire de construction scratch à partir des journaux ou avec python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
L'exécution de tests avec ctests fonctionne également si vous accédez au répertoire de construction, par exemple (cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
Si vous avez boost, gtest ou d'autres dépendances installées dans un emplacement autre que celui par défaut, vous pouvez utiliser les variables CMAKE_INCLUDE_PATH
et CMAKE_LIBRARY_PATH
pour que CMAKE recherche également les fichiers d'en-tête et les bibliothèques dans des emplacements non standard. Par exemple, pour rechercher également les répertoires /alt/include/path1
et /alt/include/path2
pour les fichiers d'en-tête et les répertoires /alt/lib/path1
et /alt/lib/path2
pour les bibliothèques, vous pouvez appeler cmake
comme suit :
cmake
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
Utilisez l'approche getdeps.py
ci-dessus. Nous testons en CI sur Ubuntu LTS, et occasionnellement sur d'autres distributions.
Si vous trouvez que l'ensemble des packages système n'est pas tout à fait adapté à la distribution choisie, vous pouvez spécifier des remplacements spécifiques à la version de la distribution dans les manifestes de dépendance (par exemple https://github.com/facebook/folly/blob/main/build/fbcode_builder/ manifestes/boost ). Vous pourriez probablement le faire fonctionner sur les distributions dérivées les plus récentes d'Ubuntu/Debian ou Fedora/Redhat.
Au moment de la rédaction (décembre 2021), il y a une interruption de build sur les systèmes basés sur GCC 11.x dans lang_badge_test. Si vous n'avez pas besoin de la fonctionnalité de badge, vous pouvez contourner le problème en le commentant à partir de CMakeLists.txt (malheureusement, fbthrift en a besoin)
Notez que de nombreux tests sont désactivés pour les versions folles de Windows, vous pouvez les voir dans le journal à partir de l'étape de configuration cmake, ou en recherchant WINDOWS_DISABLED dans CMakeLists.txt
Cela dit, les builds getdeps.py
fonctionnent sous Windows et sont testés dans CI.
Si vous préférez, vous pouvez essayer Vcpkg. folly est disponible dans Vcpkg et les versions peuvent être construites via vcpkg install folly:x64-windows
.
Vous pouvez également utiliser vcpkg install folly:x64-windows --head
pour construire avec main
.
getdeps.py
fonctionne sur macOS et est testé dans CI, mais si vous préférez, vous pouvez essayer l'un des gestionnaires de packages macOS
folly est disponible sous forme de formule et les versions peuvent être construites via brew install folly
.
Vous pouvez également utiliser folly/build/bootstrap-osx-homebrew.sh
pour construire avec main
:
./folly/build/bootstrap-osx-homebrew.sh
Cela créera un répertoire de build _build
au niveau supérieur.
Installez les packages requis depuis MacPorts :
sudo port install
boost
cmake
gflags
git
google-glog
libevent
libtool
lz4
lzma
openssl
snappy
xz
zlib
Téléchargez et installez la double conversion :
git clone https://github.com/google/double-conversion.git
cd double-conversion
cmake -DBUILD_SHARED_LIBS=ON .
make
sudo make install
Téléchargez et installez Folly avec les paramètres répertoriés ci-dessous :
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install