folly
?Folly (abreviadamente abreviada como Facebook Open Source Library) é uma biblioteca de componentes C++17 projetada com praticidade e eficiência em mente. Folly contém uma variedade de componentes básicos da biblioteca usados extensivamente no Facebook . Em particular, muitas vezes é uma dependência de outros esforços C++ de código aberto do Facebook e do local onde esses projetos podem compartilhar código.
Ele complementa (em vez de competir) ofertas como Boost e, claro, std
. Na verdade, iniciamos a definição do nosso próprio componente apenas quando algo de que precisamos não está disponível ou não atende ao perfil de desempenho necessário. Nós nos esforçamos para remover as coisas da loucura se ou quando std
ou o Boost as tornarem obsoletas.
As preocupações com o desempenho permeiam grande parte do Folly, às vezes levando a designs que são mais idiossincráticos do que seriam de outra forma (veja, por exemplo, PackedSyncPtr.h
, SmallLocks.h
). O bom desempenho em larga escala é um tema unificador em toda a Folly.
Folly é uma coleção de componentes relativamente independentes, alguns tão simples quanto alguns símbolos. Não há restrição para dependências internas, o que significa que um determinado módulo insensato pode usar qualquer outro componente insensato.
Todos os símbolos são definidos no namespace de nível superior folly
, exceto, é claro, macros. Os nomes das macros são ALL_UPPERCASE e devem ser prefixados com FOLLY_
. folly
do namespace define outros namespaces internos, como internal
ou detail
. O código do usuário não deve depender de símbolos nesses namespaces.
Folly também tem um diretório experimental
. Esta designação indica principalmente que acreditamos que a API pode mudar bastante com o tempo. Esse código, normalmente, ainda é muito usado e bem testado.
No nível superior, Folly usa o esquema clássico de "gagueira" folly/folly
usado por Boost e outros. O primeiro diretório serve como raiz de instalação da biblioteca (com possível versionamento à la folly-1.0/
), e o segundo é para distinguir a biblioteca ao incluir arquivos, por exemplo, #include <folly/FBString.h>
.
A estrutura de diretórios é plana (imitando a estrutura do namespace), ou seja, não temos uma hierarquia de diretórios elaborada (é possível que isso mude em versões futuras). O subdiretório experimental
contém arquivos que são usados dentro do Folly e possivelmente no Facebook, mas não são considerados estáveis o suficiente para uso do cliente. Seu código não deve usar arquivos em folly/experimental
para que não possa quebrar quando você atualizar o Folly.
O subdiretório folly/folly/test
inclui os unittests para todos os componentes, geralmente denominados ComponentXyzTest.cpp
para cada ComponentXyz.*
. O diretório folly/folly/docs
contém documentação.
Devido à estrutura bastante plana do folly, a melhor maneira de ver o que há nele é observar os cabeçalhos no diretório folly/
de nível superior. Você também pode verificar a pasta docs
para documentação, começando com a visão geral.
Folly é publicado no GitHub em https://github.com/facebook/folly.
Como o Folly não fornece nenhuma garantia de compatibilidade de ABI de commit para commit, geralmente recomendamos construir o Folly como uma biblioteca estática.
loucura suporta gcc (5.1+), clang ou MSVC. Deve ser executado em Linux (x86-32, x86-64 e ARM), iOS, macOS e Windows (x86-64). A compilação do CMake é testada apenas em algumas dessas plataformas; no mínimo, pretendemos oferecer suporte a macOS e Linux (na versão mais recente do Ubuntu LTS ou mais recente).
getdeps.py
Este script é usado por muitas ferramentas OSS do Meta. Ele fará o download e construirá todas as dependências necessárias primeiro e, em seguida, invocará o cmake etc para construir a loucura. Isso ajudará a garantir que você construa com versões relevantes de todas as bibliotecas dependentes, levando em consideração quais versões estão instaladas localmente no seu sistema.
Está escrito em python, então você precisará do python3.6 ou posterior em seu PATH. Funciona em Linux, macOS e Windows.
As configurações para a compilação cmake do folly são mantidas em seu manifesto getdeps build/fbcode_builder/manifests/folly
, que você pode editar localmente, se desejar.
Se estiver no Linux ou MacOS (com o homebrew instalado), você pode instalar dependências do sistema para economizar na construção:
# Clone the repo
git clone https://github.com/facebook/folly
# Install dependencies
cd folly
sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive
Se você quiser ver os pacotes antes de instalá-los:
./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive
Em outras plataformas ou no Linux e sem dependências do sistema, getdeps.py
irá baixá-los e compilá-los principalmente para você durante a etapa de construção.
Algumas das dependências que getdeps.py
usa e instala são:
Este script baixará e construirá todas as dependências necessárias primeiro e, em seguida, invocará cmake etc para construir a loucura. Isso ajudará a garantir que você construa com versões relevantes de todas as bibliotecas dependentes, levando em consideração quais versões estão instaladas localmente no seu sistema.
getdeps.py
atualmente requer que python 3.6+ esteja em seu caminho.
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
Ele coloca a saída em sua área de rascunho:
installed/folly/lib/libfolly.a
: Biblioteca Você também pode especificar um argumento --scratch-path
para controlar a localização do diretório inicial usado para a construção. Você pode encontrar o local de instalação inicial padrão nos logs ou com python3 ./build/fbcode_builder/getdeps.py show-inst-dir
.
Existem também argumentos --install-dir
e --install-prefix
para fornecer um controle mais refinado dos diretórios de instalação. No entanto, dado que o Folly não oferece garantias de compatibilidade entre commits, geralmente recomendamos construir e instalar as bibliotecas em um local temporário e, em seguida, apontar a compilação do seu projeto para esse local temporário, em vez de instalar o Folly nos diretórios tradicionais de instalação do sistema. por exemplo, se você estiver compilando com CMake você pode usar a variável CMAKE_PREFIX_PATH
para permitir que o CMake encontre loucuras neste diretório de instalação temporário ao compilar seu projeto.
Se você quiser invocar cmake
novamente para iterar, há uma saída útil do script run_cmake.py
no diretório de construção inicial. Você pode encontrar o diretório de construção inicial nos logs ou com python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Por padrão, getdeps.py
criará os testes para loucura. Para executá-los:
cd folly
python3 ./build/fbcode_builder/getdeps.py --allow-system-packages test
build.bat
build.sh
build.sh
pode ser usado em Linux e MacOS; no Windows, use o script build.bat
. É um wrapper em torno de getdeps.py
.
Se você não quiser permitir que getdeps invoque o cmake para você, por padrão, a construção dos testes será desabilitada como parte do destino CMake all
. Para construir os testes, especifique -DBUILD_TESTS=ON
para CMake no momento da configuração.
NB, se você quiser invocar cmake
novamente para iterar em uma compilação getdeps.py
, há uma saída de script run_cmake.py
útil no diretório de compilação do caminho inicial. Você pode encontrar o diretório de construção inicial nos logs ou com python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Executar testes com ctests também funciona se você fizer cd para o diretório de compilação, por exemplo (cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
Se você tiver boost, gtest ou outras dependências instaladas em um local não padrão, poderá usar as variáveis CMAKE_INCLUDE_PATH
e CMAKE_LIBRARY_PATH
para fazer com que o CMAKE também procure arquivos de cabeçalho e bibliotecas em locais não padrão. Por exemplo, para pesquisar também os diretórios /alt/include/path1
e /alt/include/path2
para arquivos de cabeçalho e os diretórios /alt/lib/path1
e /alt/lib/path2
para bibliotecas, você pode invocar cmake
da seguinte forma:
cmake
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
Use a abordagem getdeps.py
acima. Testamos em CI no Ubuntu LTS e ocasionalmente em outras distros.
Se você achar que o conjunto de pacotes do sistema não é adequado para a distribuição escolhida, você pode especificar substituições específicas da versão da distribuição nos manifestos de dependência (por exemplo, https://github.com/facebook/folly/blob/main/build/fbcode_builder/ manifesta/impulso). Você provavelmente poderia fazê-lo funcionar nas distribuições mais recentes derivadas do Ubuntu/Debian ou Fedora/Redhat.
No momento em que este artigo foi escrito (dezembro de 2021), havia uma interrupção na compilação dos sistemas baseados no GCC 11.x em lang_badge_test. Se você não precisa da funcionalidade do emblema, você pode contornar isso comentando em CMakeLists.txt (infelizmente o fbthrift precisa dela)
Observe que muitos testes estão desabilitados para compilações malucas do Windows, você pode vê-los no log da etapa de configuração do cmake ou procurando WINDOWS_DISABLED em CMakeLists.txt
Dito isso, as compilações getdeps.py
funcionam no Windows e são testadas em CI.
Se preferir, você pode tentar o Vcpkg. folly está disponível em Vcpkg e as versões podem ser criadas via vcpkg install folly:x64-windows
.
Você também pode usar vcpkg install folly:x64-windows --head
para compilar em main
.
As compilações getdeps.py
funcionam no macOS e são testadas em CI, no entanto, se preferir, você pode tentar um dos gerenciadores de pacotes do macOS
folly está disponível como uma fórmula e as versões podem ser criadas via brew install folly
.
Você também pode usar folly/build/bootstrap-osx-homebrew.sh
para construir em main
:
./folly/build/bootstrap-osx-homebrew.sh
Isso criará um diretório de construção _build
no nível superior.
Instale os pacotes necessários do MacPorts:
sudo port install
boost
cmake
gflags
git
google-glog
libevent
libtool
lz4
lzma
openssl
snappy
xz
zlib
Baixe e instale a conversão dupla:
git clone https://github.com/google/double-conversion.git
cd double-conversion
cmake -DBUILD_SHARED_LIBS=ON .
make
sudo make install
Baixe e instale o Folly com os parâmetros listados abaixo:
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install