folly
?Folly (acrónimo aproximado de Facebook Open Source Library) es una biblioteca de componentes C++17 diseñados teniendo en cuenta la practicidad y la eficiencia. Folly contiene una variedad de componentes de biblioteca centrales que se utilizan ampliamente en Facebook . En particular, a menudo es una dependencia de otros esfuerzos de C++ de código abierto de Facebook y un lugar donde esos proyectos pueden compartir código.
Complementa (en lugar de competir) ofertas como Boost y, por supuesto, std
. De hecho, nos embarcamos en la definición de nuestro propio componente sólo cuando algo que necesitamos no está disponible o no cumple con el perfil de rendimiento necesario. Nos esforzamos por eliminar las cosas de la locura si std
o Boost las dejan obsoletas.
Las preocupaciones sobre el rendimiento impregnan gran parte de Folly, lo que a veces conduce a diseños que son más idiosincrásicos de lo que serían de otro modo (ver, por ejemplo, PackedSyncPtr.h
, SmallLocks.h
). El buen desempeño a gran escala es un tema unificador en todo Folly.
Folly es una colección de componentes relativamente independientes, algunos tan simples como unos pocos símbolos. No hay restricciones en las dependencias internas, lo que significa que un módulo Folly determinado puede utilizar cualquier otro componente Folly.
Todos los símbolos se definen en el espacio de nombres de nivel superior folly
, excepto, por supuesto, las macros. Los nombres de las macros son ALL_UPPERCASE y deben tener el prefijo FOLLY_
. folly
del espacio de nombres define otros espacios de nombres internos, como internal
o detail
. El código de usuario no debe depender de los símbolos en esos espacios de nombres.
Folly también tiene un directorio experimental
. Esta designación connota principalmente que creemos que la API puede cambiar mucho con el tiempo. Este código, por lo general, todavía se utiliza mucho y está bien probado.
En el nivel superior, Folly utiliza el clásico esquema de "tartamudeo" folly/folly
utilizado por Boost y otros. El primer directorio sirve como raíz de instalación de la biblioteca (con posible versionado al estilo folly-1.0/
), y el segundo es para distinguir la biblioteca al incluir archivos, por ejemplo, #include <folly/FBString.h>
.
La estructura del directorio es plana (imitando la estructura del espacio de nombres), es decir, no tenemos una jerarquía de directorios elaborada (es posible que esto cambie en futuras versiones). El subdirectorio experimental
contiene archivos que se utilizan dentro de Folly y posiblemente en Facebook, pero que no se consideran lo suficientemente estables para el uso del cliente. Su código no debe usar archivos en folly/experimental
para que no se rompa cuando actualice Folly.
El subdirectorio folly/folly/test
incluye las pruebas unitarias para todos los componentes, normalmente denominadas ComponentXyzTest.cpp
para cada ComponentXyz.*
. El directorio folly/folly/docs
contiene documentación.
Debido a la estructura bastante plana de folly, la mejor manera de ver lo que contiene es mirar los encabezados en el directorio folly/
de nivel superior. También puede consultar la carpeta docs
para obtener documentación, comenzando con la descripción general.
Folly se publica en GitHub en https://github.com/facebook/folly.
Debido a que folly no proporciona ninguna garantía de compatibilidad ABI de un compromiso a otro, generalmente recomendamos crear folly como una biblioteca estática.
Folly admite gcc (5.1+), clang o MSVC. Debería ejecutarse en Linux (x86-32, x86-64 y ARM), iOS, macOS y Windows (x86-64). La compilación de CMake sólo se prueba en algunas de estas plataformas; Como mínimo, nuestro objetivo es admitir macOS y Linux (en la última versión de Ubuntu LTS o posterior).
getdeps.py
Este script es utilizado por muchas de las herramientas OSS de Meta. Primero descargará y creará todas las dependencias necesarias y luego invocará cmake, etc. para crear Folly. Esto ayudará a garantizar que compila con versiones relevantes de todas las bibliotecas dependientes, teniendo en cuenta qué versiones están instaladas localmente en su sistema.
Está escrito en Python, por lo que necesitarás Python3.6 o posterior en tu RUTA. Funciona en Linux, macOS y Windows.
La configuración para la compilación cmake de folly se guarda en su manifiesto getdeps build/fbcode_builder/manifests/folly
, que puede editar localmente si lo desea.
Si está en Linux o MacOS (con homebrew instalado), puede instalar dependencias del sistema para ahorrar en su compilación:
# 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 desea ver los paquetes antes de instalarlos:
./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive
En otras plataformas o en Linux y sin dependencias del sistema, getdeps.py
los descargará y compilará principalmente durante el paso de compilación.
Algunas de las dependencias que utiliza e instala getdeps.py
son:
Este script descargará y creará primero todas las dependencias necesarias y luego invocará cmake, etc. para crear Folly. Esto ayudará a garantizar que compila con versiones relevantes de todas las bibliotecas dependientes, teniendo en cuenta qué versiones están instaladas localmente en su sistema.
getdeps.py
actualmente requiere que Python 3.6+ esté en su camino.
getdeps.py
invocará 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
Pone la salida en su área temporal:
installed/folly/lib/libfolly.a
: Biblioteca También puede especificar un argumento --scratch-path
para controlar la ubicación del directorio temporal utilizado para la compilación. Puede encontrar la ubicación de instalación temporal predeterminada en los registros o con python3 ./build/fbcode_builder/getdeps.py show-inst-dir
.
También hay argumentos --install-dir
y --install-prefix
para proporcionar un control más detallado de los directorios de instalación. Sin embargo, dado que Folly no ofrece garantías de compatibilidad entre confirmaciones, generalmente recomendamos compilar e instalar las bibliotecas en una ubicación temporal y luego apuntar la compilación de su proyecto a esta ubicación temporal, en lugar de instalar Folly en los directorios de instalación del sistema tradicional. por ejemplo, si está compilando con CMake, puede usar la variable CMAKE_PREFIX_PATH
para permitir que CMake encuentre locura en este directorio de instalación temporal al compilar su proyecto.
Si desea invocar cmake
nuevamente para iterar, hay una salida de script útil run_cmake.py
en el directorio de compilación inicial. Puede encontrar el directorio de compilación temporal en los registros o con python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
De forma predeterminada, getdeps.py
creará las pruebas de locura. Para ejecutarlos:
cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test
build.sh
/ build.bat
build.sh
se puede utilizar en Linux y MacOS; en Windows, utilice el script build.bat
. Es un contenedor alrededor de getdeps.py
.
Si no desea permitir que getdeps invoque cmake por usted, de forma predeterminada, la creación de pruebas está deshabilitada como parte del objetivo de CMake all
. Para crear las pruebas, especifique -DBUILD_TESTS=ON
en CMake en el momento de la configuración.
NB: si desea invocar cmake
nuevamente para iterar en una compilación getdeps.py
, hay una salida útil del script run_cmake.py
en el directorio de compilación de la ruta temporal. Puede encontrar el directorio de compilación temporal en los registros o con python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
La ejecución de pruebas con ctests también funciona si accede al directorio de compilación, por ejemplo (cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
Si tiene boost, gtest u otras dependencias instaladas en una ubicación no predeterminada, puede usar las variables CMAKE_INCLUDE_PATH
y CMAKE_LIBRARY_PATH
para que CMAKE busque archivos de encabezado y bibliotecas en ubicaciones no estándar. Por ejemplo, para buscar también en los directorios /alt/include/path1
y /alt/include/path2
archivos de encabezado y en los directorios /alt/lib/path1
y /alt/lib/path2
bibliotecas, puede invocar cmake
de la siguiente manera:
cmake
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
Utilice el método getdeps.py
anterior. Probamos en CI en Ubuntu LTS y ocasionalmente en otras distribuciones.
Si encuentra que el conjunto de paquetes del sistema no es del todo adecuado para la distribución elegida, puede especificar anulaciones específicas de la versión de la distribución en los manifiestos de dependencia (por ejemplo, https://github.com/facebook/folly/blob/main/build/fbcode_builder/ manifiestos/impulso). Probablemente podría hacerlo funcionar en las distribuciones derivadas de Ubuntu/Debian o Fedora/Redhat más recientes.
Al momento de escribir este artículo (diciembre de 2021), hay una interrupción en la compilación en los sistemas basados en GCC 11.x en lang_badge_test. Si no necesita la funcionalidad de insignia, puede solucionarlo comentándola desde CMakeLists.txt (desafortunadamente, fbthrift la necesita)
Tenga en cuenta que muchas pruebas están deshabilitadas para compilaciones tontas de Windows; puede verlas en el registro desde el paso de configuración de cmake o buscando WINDOWS_DISABLED en CMakeLists.txt
Dicho esto, las compilaciones getdeps.py
funcionan en Windows y se prueban en CI.
Si lo prefieres, puedes probar Vcpkg. folly está disponible en Vcpkg y las versiones se pueden crear mediante vcpkg install folly:x64-windows
.
También puede usar vcpkg install folly:x64-windows --head
para compilar contra main
.
Las compilaciones getdeps.py
funcionan en macOS y se prueban en CI; sin embargo, si lo prefiere, puede probar uno de los administradores de paquetes de macOS.
folly está disponible como fórmula y los lanzamientos se pueden crear mediante brew install folly
.
También puedes usar folly/build/bootstrap-osx-homebrew.sh
para compilar contra main
:
./folly/build/bootstrap-osx-homebrew.sh
Esto creará un directorio de compilación _build
en el nivel superior.
Instale los paquetes necesarios desde MacPorts:
sudo port install
boost
cmake
gflags
git
google-glog
libevent
libtool
lz4
lzma
openssl
snappy
xz
zlib
Descargue e instale la doble conversión:
git clone https://github.com/google/double-conversion.git
cd double-conversion
cmake -DBUILD_SHARED_LIBS=ON .
make
sudo make install
Descargue e instale folly con los parámetros que se enumeran a continuación:
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install