folly
?Folly(Facebook Open Source Library 的縮寫)是一個 C++17 元件庫,其設計考慮了實用性和效率。 Folly 包含 Facebook 廣泛使用的各種核心庫元件。特別是,它通常依賴 Facebook 的其他開源 C++ 項目,並且是這些項目可以共享程式碼的地方。
它是 Boost 等產品的補充(而不是競爭),當然還有std
。事實上,只有當我們需要的東西不可用或不滿足所需的效能設定檔時,我們才會開始定義自己的元件。如果std
或 Boost 廢棄了某些東西,我們會盡力將它們從愚蠢中刪除。
效能問題滲透到 Folly 的大部分內容中,有時會導致設計比原本的設計更加特殊(參見例如PackedSyncPtr.h
、 SmallLocks.h
)。大規模的良好表現是所有 Folly 的統一主題。
Folly 是相對獨立的組件的集合,有些組件簡單到只有幾個符號。對內部依賴性沒有限制,這意味著給定的愚蠢模組可以使用任何其他愚蠢組件。
所有符號都在頂級命名空間folly
中定義,當然宏除外。巨集名稱為 ALL_UPPERCASE 且應以FOLLY_
為前綴。命名空間folly
定義了其他內部命名空間,例如internal
或detail
。使用者程式碼不應依賴這些命名空間中的符號。
Folly 還有一個experimental
目錄。這項指定主要意味著我們認為 API 可能會隨著時間的推移而發生巨大變化。通常,該程式碼仍然被大量使用並且經過了良好的測試。
在頂層,Folly 使用 Boost 和其他人使用的經典「口吃」方案folly/folly
。第一個目錄用作庫的安裝根目錄(可能有版本控制 la folly-1.0/
),第二個目錄用於在包含文件時區分庫,例如#include <folly/FBString.h>
。
目錄結構是扁平的(模仿命名空間結構),即我們沒有複雜的目錄層次結構(這可能會在未來的版本中改變)。子目錄experimental
包含在folly內部以及可能在Facebook中使用的文件,但對於客戶端使用來說不夠穩定。您的程式碼不應在folly/experimental
中使用文件,以免在更新愚蠢時可能會損壞。
folly/folly/test
子目錄包含所有元件的單元測試,通常會為每個ComponentXyz.*
命名為ComponentXyzTest.cpp
。 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
Meta 的許多 OSS 工具都使用此腳本。它將首先下載並建立所有必需的依賴項,然後呼叫 cmake 等來建立愚蠢的。這將有助於確保您使用所有依賴庫的相關版本進行構建,同時考慮到系統上本地安裝的版本。
它是用 python 編寫的,因此您的 PATH 中需要 python3.6 或更高版本。它適用於 Linux、macOS 和 Windows。
folly 的 cmake 建置的設定保存在其 getdeps 清單build/fbcode_builder/manifests/folly
中,如果需要,您可以在本地編輯。
如果在 Linux 或 MacOS(安裝了自製軟體)上,您可以安裝系統依賴項以保存建置它們:
# 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.sh
/ build.bat
包裝器build.sh
可以在 Linux 和 MacOS 上使用,在 Windows 上則使用build.bat
腳本。它是getdeps.py
的包裝。
如果您不想讓 getdeps 為您呼叫 cmake,那麼預設情況下,建置測試將作為 CMake all
目標的一部分被停用。若要建置測試,請在配置時為 CMake 指定-DBUILD_TESTS=ON
。
注意,如果您想再次調用cmake
以迭代getdeps.py
構建,則暫存路徑構建目錄中有一個有用的run_cmake.py
腳本輸出。您可以從日誌中或使用python3 ./build/fbcode_builder/getdeps.py show-build-dir
找到臨時建置目錄。
如果您 cd 到建置目錄,使用 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
方法。我們在 Ubuntu LTS 上進行 CI 測試,偶爾也會在其他發行版上進行測試。
如果您發現系統包集不太適合您選擇的發行版,您可以在依賴項清單中指定特定於發行版版本的覆蓋範圍(例如https://github.com/facebook/folly/blob/main/build/ fbcode_builder/體現/提升)。您或許可以讓它在最新的 Ubuntu/Debian 或 Fedora/Redhat 派生發行版上運作。
截至撰寫本文時(2021 年 12 月),lang_badge_test 中基於 GCC 11.x 的系統存在建置中斷。如果您不需要徽章功能,您可以透過從 CMakeLists.txt 中註解掉它來解決(不幸的是 fbthrift 確實需要它)
請注意,對於愚蠢的 Windows 構建,許多測試被禁用,您可以在 cmake 配置步驟的日誌中看到它們,或者透過在CMakeLists.txt
中找到 WINDOWS_DISABLED
也就是說, 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