folly
?Folly (сокращенно от Facebook Open Source Library) — это библиотека компонентов C++17, разработанная с учетом практичности и эффективности. Folly содержит множество основных компонентов библиотеки, широко используемых в Facebook . В частности, это часто зависит от других усилий Facebook по разработке C++ с открытым исходным кодом и места, где эти проекты могут совместно использовать код.
Он дополняет (а не конкурирует) с такими предложениями, как Boost и, конечно же, std
. Фактически, мы приступаем к определению собственного компонента только тогда, когда что-то, что нам нужно, либо недоступно, либо не соответствует необходимому профилю производительности. Мы стараемся убрать вещи из глупости, если или когда std
или Boost устареют.
Проблемы с производительностью пронизывают большую часть Folly, иногда приводя к более своеобразным проектам, чем они были бы в противном случае (см., например, PackedSyncPtr.h
, SmallLocks.h
). Хорошая производительность в больших масштабах — объединяющая тема всей «Безумия».
Глупость — это совокупность относительно независимых компонентов, некоторые из которых столь же просты, как несколько символов. Нет никаких ограничений на внутренние зависимости, а это означает, что данный модуль глупости может использовать любые другие компоненты глупости.
Все символы определены в пространстве имен верхнего уровня folly
, за исключением, конечно, макросов. Имена макросов имеют формат ALL_UPPERCASE и должны начинаться с префикса FOLLY_
. folly
пространства имен определяет другие внутренние пространства имен, такие как internal
или detail
. Пользовательский код не должен зависеть от символов в этих пространствах имен.
У Folly также есть experimental
каталог. Это обозначение прежде всего означает, что, по нашему мнению, API может со временем сильно измениться. Этот код, как правило, все еще активно используется и хорошо протестирован.
На верхнем уровне Folly использует классическую схему «заикания» folly/folly
используемую Boost и другими. Первый каталог служит корнем установки библиотеки (с возможным управлением версиями типа folly-1.0/
), а второй предназначен для различения библиотеки при включении файлов, например #include <folly/FBString.h>
.
Структура каталогов плоская (имитирует структуру пространства имен), т.е. у нас нет сложной иерархии каталогов (возможно, это изменится в будущих версиях). experimental
подкаталог содержит файлы, которые используются внутри folly и, возможно, в Facebook, но не считаются достаточно стабильными для использования клиентом. Ваш код не должен использовать файлы в folly/experimental
, чтобы он не сломался при обновлении Folly.
Подкаталог folly/folly/test
содержит модульные тесты для всех компонентов, обычно называемые ComponentXyzTest.cpp
для каждого ComponentXyz.*
. Каталог 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
Этот сценарий используется многими инструментами OSS Meta. Сначала он загрузит и соберет все необходимые зависимости, а затем вызовет cmake и т. д. для создания глупости. Это поможет гарантировать, что вы используете соответствующие версии всех зависимых библиотек, принимая во внимание, какие версии установлены локально в вашей системе.
Он написан на Python, поэтому вам понадобится Python3.6 или более поздняя версия для вашего PATH. Он работает на Linux, macOS и Windows.
Настройки для сборки cmake folly хранятся в манифесте 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.bat
build.sh
build.sh
можно использовать в Linux и MacOS, в Windows вместо этого используйте скрипт build.bat
. Это оболочка getdeps.py
.
Если вы не хотите, чтобы getdeps вызывал cmake за вас, то по умолчанию построение тестов отключено как часть цели CMake all
. Чтобы построить тесты, укажите -DBUILD_TESTS=ON
для CMake во время настройки.
Примечание. Если вы хотите снова вызвать cmake
для итерации сборки getdeps.py
, в каталоге сборки с нуля есть полезный вывод сценария run_cmake.py
. Вы можете найти каталог временной сборки из журналов или с помощью python3 ./build/fbcode_builder/getdeps.py show-build-dir
.
Запуск тестов с помощью ctests также работает, если вы перейдете в каталог сборки, например (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
. Мы тестируем в CI на Ubuntu LTS и иногда на других дистрибутивах.
Если вы обнаружите, что набор системных пакетов не совсем подходит для выбранного вами дистрибутива, вы можете указать переопределения для конкретной версии дистрибутива в манифестах зависимостей (например, https://github.com/facebook/folly/blob/main/build/fbcode_builder/ манифестирует/ускоряет). Вероятно, вы могли бы заставить его работать в последних дистрибутивах, производных от Ubuntu/Debian или Fedora/Redhat.
На момент написания (декабрь 2021 г.) в lang_badge_test существует разрыв сборки систем на базе GCC 11.x. Если вам не нужна функциональность значка, вы можете обойти это, закомментировав ее в CMakeLists.txt (к сожалению, fbthrift это нужно)
Обратите внимание, что многие тесты отключены по глупости в сборках Windows. Их можно увидеть в журнале на этапе настройки cmake или поискать WINDOWS_DISABLED в CMakeLists.txt
Тем не менее, сборки 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