folly
คืออะไร?Folly (ย่ออย่างหลวม ๆ หลังจาก Facebook Open Source Library) เป็นไลบรารีของส่วนประกอบ C ++ 17 ที่ออกแบบมาโดยคำนึงถึงการใช้งานจริงและมีประสิทธิภาพ Folly มีส่วนประกอบไลบรารีหลักที่หลากหลายซึ่งใช้กันอย่างแพร่หลายใน Facebook โดยเฉพาะอย่างยิ่ง มักขึ้นอยู่กับความพยายามของโอเพ่นซอร์ส C++ อื่นๆ ของ Facebook และสถานที่ที่โปรเจ็กต์เหล่านั้นสามารถแชร์โค้ดได้
มันเสริม (ตรงข้ามกับการแข่งขัน) ข้อเสนอเช่น Boost และแน่นอน std
ในความเป็นจริง เราเริ่มดำเนินการในการกำหนดส่วนประกอบของเราเองเฉพาะเมื่อสิ่งที่เราต้องการไม่พร้อมใช้งาน หรือไม่ตรงตามโปรไฟล์ประสิทธิภาพที่ต้องการ เราพยายามที่จะลบสิ่งต่าง ๆ ออกจากความโง่เขลาหากหรือเมื่อ std
หรือ Boost ล้าสมัย
ข้อกังวลด้านประสิทธิภาพแทรกซึมอยู่ใน Folly เป็นส่วนใหญ่ ซึ่งบางครั้งก็นำไปสู่การออกแบบที่แปลกประหลาดมากกว่าที่คิด (ดูเช่น PackedSyncPtr.h
, SmallLocks.h
) การแสดงที่ดีในวงกว้างคือประเด็นหลักที่รวมเป็นหนึ่งเดียวในความโง่เขลาทั้งหมด
Folly คือชุดของส่วนประกอบที่ค่อนข้างเป็นอิสระ บางส่วนเรียบง่ายเพียงไม่กี่สัญลักษณ์ ไม่มีข้อจำกัดในการขึ้นต่อกันภายใน ซึ่งหมายความว่าโมดูลความเขลาที่กำหนดอาจใช้องค์ประกอบความโง่เขลาอื่นๆ
สัญลักษณ์ทั้งหมดถูกกำหนดไว้ในเน folly
สเปซระดับบนสุด ยกเว้นมาโครของหลักสูตร ชื่อมาโครคือ ALL_UPPERCASE และควรขึ้นต้นด้วย FOLLY_
เนมสเปซ folly
กำหนดเนมสเปซภายในอื่น ๆ เช่น internal
หรือ detail
รหัสผู้ใช้ไม่ควรขึ้นอยู่กับสัญลักษณ์ในเนมสเปซเหล่านั้น
Folly มีไดเร็กทอรี experimental
เช่นกัน การกำหนดนี้โดยพื้นฐานแล้วเรารู้สึกว่า API อาจมีการเปลี่ยนแปลงอย่างมากเมื่อเวลาผ่านไป โดยทั่วไปโค้ดนี้ยังคงมีการใช้งานหนักและได้รับการทดสอบอย่างดี
ที่ระดับบนสุด Folly ใช้รูปแบบ "การพูดติดอ่าง" แบบคลาสสิกอย่าง folly/folly
ที่ใช้โดย Boost และคนอื่นๆ ไดเร็กทอรีแรกทำหน้าที่เป็นรูทการติดตั้งของไลบรารี (โดยมีเวอร์ชันที่เป็นไปได้ a la folly-1.0/
) และไดเร็กทอรีที่สองคือการแยกความแตกต่างของไลบรารีเมื่อรวมไฟล์ เช่น #include <folly/FBString.h>
โครงสร้างไดเร็กทอรีเป็นแบบเรียบ (เลียนแบบโครงสร้างเนมสเปซ) กล่าวคือ เราไม่มีลำดับชั้นไดเร็กทอรีที่ซับซ้อน (เป็นไปได้ว่าจะมีการเปลี่ยนแปลงในเวอร์ชันต่อๆ ไป) ไดเร็กทอรี experimental
ประกอบด้วยไฟล์ที่ใช้ในความโง่เขลาและอาจใช้บน Facebook แต่ไม่ถือว่ามีเสถียรภาพเพียงพอสำหรับการใช้งานของลูกค้า รหัสของคุณไม่ควรใช้ไฟล์อย่าง folly/experimental
เกรงว่ามันจะเสียหายเมื่อคุณอัปเดต Folly
ไดเร็กทอรี folly/folly/test
รวม unittests สำหรับส่วนประกอบทั้งหมด โดยปกติจะตั้งชื่อว่า ComponentXyzTest.cpp
สำหรับแต่ละ ComponentXyz.*
ไดเร็กทอรี folly/folly/docs
มีเอกสารประกอบ
เนื่องจากโครงสร้างที่ค่อนข้างเรียบของ Folly วิธีที่ดีที่สุดในการดูว่ามีอะไรอยู่ในนั้นคือการดูที่ส่วนหัวในไดเร็กทอรี folly/
ระดับบนสุด คุณยังสามารถตรวจสอบโฟลเดอร์ docs
เพื่อดูเอกสารประกอบ โดยเริ่มจากภาพรวม
Folly ได้รับการเผยแพร่บน GitHub ที่ https://github.com/facebook/folly
เนื่องจากความโง่เขลาไม่ได้ให้การรับประกันความเข้ากันได้ของ ABI ใดๆ จากการคอมมิตต่อคอมมิต โดยทั่วไปเราแนะนำให้สร้างความโง่เขลาเป็นไลบรารีแบบคงที่
ความโง่เขลารองรับ gcc (5.1+), เสียงดังกราวหรือ MSVC ควรทำงานบน Linux (x86-32, x86-64 และ ARM), iOS, macOS และ Windows (x86-64) CMake build ได้รับการทดสอบบนบางแพลตฟอร์มเหล่านี้เท่านั้น อย่างน้อยที่สุด เรามุ่งหวังที่จะรองรับ macOS และ Linux (บน Ubuntu LTS รุ่นล่าสุดหรือใหม่กว่า)
getdeps.py
สคริปต์นี้ถูกใช้โดยเครื่องมือ OSS ของ Meta จำนวนมาก มันจะดาวน์โหลดและสร้างการขึ้นต่อกันที่จำเป็นทั้งหมดก่อน จากนั้นจะเรียกใช้ cmake ฯลฯ เพื่อสร้างความโง่เขลา สิ่งนี้จะช่วยให้แน่ใจว่าคุณสร้างไลบรารีที่ขึ้นต่อกันทั้งหมดด้วยเวอร์ชันที่เกี่ยวข้อง โดยคำนึงถึงเวอร์ชันที่ติดตั้งภายในระบบของคุณ
มันเขียนด้วย python ดังนั้นคุณจะต้องใช้ python3.6 หรือใหม่กว่าใน PATH ของคุณ มันทำงานบน Linux, macOS และ Windows
การตั้งค่าสำหรับ cmake build ของ folly จะถูกเก็บไว้ใน getdeps manifest 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
อาร์กิวเมนต์เพื่อให้การควบคุมไดเร็กทอรีการติดตั้งมีรายละเอียดมากขึ้น อย่างไรก็ตาม เนื่องจากความโง่เขลาไม่ได้รับประกันความเข้ากันได้ระหว่างการคอมมิต โดยทั่วไปเราแนะนำให้สร้างและติดตั้งไลบรารีไปยังตำแหน่งชั่วคราว จากนั้นชี้การสร้างโปรเจ็กต์ของคุณไปที่ตำแหน่งชั่วคราวนี้ แทนที่จะติดตั้งสิ่งโง่เขลาในไดเร็กทอรีการติดตั้งระบบแบบเดิม เช่น หากคุณกำลังสร้างด้วย CMake คุณสามารถใช้ตัวแปร CMAKE_PREFIX_PATH
เพื่ออนุญาตให้ CMake ค้นหาความโง่เขลาในไดเร็กทอรีการติดตั้งชั่วคราวนี้เมื่อสร้างโปรเจ็กต์ของคุณ
หากคุณต้องการเรียกใช้ cmake
อีกครั้งเพื่อวนซ้ำ จะมีเอาต์พุตสคริปต์ run_cmake.py
ที่เป็นประโยชน์ในไดเร็กทอรี Scratch Build คุณสามารถค้นหาไดเร็กทอรี scratch build ได้จากบันทึกหรือด้วย 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
แทน มันเป็น wrapper รอบ getdeps.py
หากคุณไม่ต้องการให้ getdeps เรียกใช้ cmake สำหรับคุณ ตามค่าเริ่มต้น การสร้างการทดสอบจะถูกปิดใช้งานโดยเป็นส่วนหนึ่งของ CMake all
เป้าหมาย หากต้องการสร้างการทดสอบ ให้ระบุ -DBUILD_TESTS=ON
ให้กับ CMake ณ เวลากำหนดค่า
หมายเหตุ หากคุณต้องการเรียกใช้ cmake
อีกครั้งเพื่อวนซ้ำบน getdeps.py
build จะมีเอาต์พุตสคริปต์ run_cmake.py
ที่เป็นประโยชน์ในไดเร็กทอรี build scratch-path คุณสามารถค้นหาไดเร็กทอรี scratch build ได้จากบันทึกหรือด้วย python3 ./build/fbcode_builder/getdeps.py show-build-dir
การรันการทดสอบด้วย ctests ยังใช้งานได้หากคุณ cd ไปที่ build dir เช่น (cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir) && ctest)
หากคุณได้ติดตั้งบูสต์ 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 และใน distros อื่นๆ เป็นครั้งคราว
หากคุณพบว่าชุดแพ็คเกจระบบค่อนข้างไม่ถูกต้องสำหรับ distro ที่คุณเลือก คุณสามารถระบุการแทนที่เฉพาะเวอร์ชัน distro ในรายการการขึ้นต่อกัน (เช่น https://github.com/facebook/folly/blob/main/build/fbcode_builder/ แสดงออก/ส่งเสริม ) คุณอาจทำให้มันใช้งานได้กับการกระจายที่ได้รับจาก Ubuntu/Debian หรือ Fedora/Redhat ล่าสุด
ในขณะที่เขียน (ธันวาคม 2021) มีการแบ่งบิลด์บนระบบที่ใช้ GCC 11.x ใน lang_badge_test หากคุณไม่ต้องการฟังก์ชันป้ายสถานะ คุณสามารถแก้ไขได้โดยแสดงความคิดเห็นจาก CMakeLists.txt (น่าเสียดายที่ fbtthrift จำเป็นต้องใช้)
โปรดทราบว่าการทดสอบจำนวนมากถูกปิดใช้งานสำหรับบิลด์ Windows ที่โง่เขลา คุณสามารถดูได้ในบันทึกจากขั้นตอนการกำหนดค่า cmake หรือโดยการค้นหา WINDOWS_DISABLED ใน CMakeLists.txt
อย่างที่กล่าวไปแล้ว getdeps.py
สร้างงานบน Windows และได้รับการทดสอบใน CI
หากคุณต้องการคุณสามารถลองใช้ Vcpkg ความเขลามีอยู่ใน Vcpkg และการเปิดตัวอาจถูกสร้างขึ้นผ่าน vcpkg install folly:x64-windows
คุณอาจใช้ vcpkg install folly:x64-windows --head
เพื่อสร้างต่อ main
.
getdeps.py
บิลด์ทำงานบน macOS และผ่านการทดสอบใน CI อย่างไรก็ตาม หากคุณต้องการ คุณสามารถลองใช้ตัวจัดการแพ็คเกจ macOS ตัวใดตัวหนึ่งได้
ความเขลามีให้ใช้งานในรูปแบบสูตรและอาจสร้างรีลีสผ่าน brew install folly
คุณอาจใช้ folly/build/bootstrap-osx-homebrew.sh
เพื่อสร้างต่อ main
:
./folly/build/bootstrap-osx-homebrew.sh
สิ่งนี้จะสร้างไดเร็กทอรี build _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
ดาวน์โหลดและติดตั้งความเขลาด้วยพารามิเตอร์ที่แสดงด้านล่าง:
git clone https://github.com/facebook/folly.git
cd folly
mkdir _build
cd _build
cmake ..
make
sudo make install