การตั้งค่าโครงการ C ++ ใหม่มักจะต้องมีการเตรียมการและรหัสหม้อไอน้ำจำนวนมากยิ่งขึ้นสำหรับโครงการ C ++ ที่ทันสมัยพร้อมการทดสอบการทำงานและการรวมอย่างต่อเนื่อง เทมเพลตนี้เป็นผลมาจากการเรียนรู้จากโครงการก่อนหน้าหลายโครงการและควรช่วยลดงานที่จำเป็นในการตั้งค่าโครงการ C ++ ที่ทันสมัย
Greeter หมายถึงชื่อของโครงการในขณะที่ greeter ใช้ในชื่อไฟล์include/greeter เพื่อใช้ชื่อตัวพิมพ์เล็กของโครงการของคุณและอัปเดต #include s ที่เกี่ยวข้องทั้งหมดCODECOV_TOKENในที่สุดคุณสามารถลบไฟล์ที่ไม่ได้ใช้เช่นไดเรกทอรีแบบสแตนด์อโลนหรือเวิร์กโฟลว์ GitHub ที่ไม่เกี่ยวข้องสำหรับโครงการของคุณ อย่าลังเลที่จะเปลี่ยนใบอนุญาตด้วยหนึ่งที่เหมาะสมสำหรับโครงการของคุณ
ในการแยกไลบรารีและรหัสโครงการย่อยอย่างหมดจด CMakeList.txt ด้านนอกจะกำหนดห้องสมุดเท่านั้นในขณะที่การทดสอบและโครงการย่อยอื่น ๆ มีอยู่ในตัวเองในไดเรกทอรีของตนเอง ในระหว่างการพัฒนามักจะสะดวกในการสร้างโครงการย่อยทั้งหมดในครั้งเดียว
ใช้คำสั่งต่อไปนี้เพื่อสร้างและเรียกใช้เป้าหมายที่ปฏิบัติการได้
cmake -S standalone -B build/standalone
cmake --build build/standalone
./build/standalone/Greeter --helpใช้คำสั่งต่อไปนี้จากไดเรกทอรีรากของโครงการเพื่อเรียกใช้ชุดทดสอบ
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/GreeterTests ในการรวบรวมข้อมูลการครอบคลุมรหัสให้เรียกใช้ cmake ด้วยตัวเลือก -DENABLE_TEST_COVERAGE=1 ตัวเลือก
ใช้คำสั่งต่อไปนี้จากไดเรกทอรีรูทของโครงการเพื่อตรวจสอบและแก้ไขรูปแบบต้นฉบับ C ++ และ CMake สิ่งนี้ต้องใช้ รูปแบบ clang , cmake-format และ pyyaml ที่จะติดตั้งในระบบปัจจุบัน
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-formatดู format.cmake สำหรับรายละเอียด การพึ่งพาเหล่านี้สามารถติดตั้งได้อย่างง่ายดายโดยใช้ PIP
pip install clang-format==14.0.6 cmake_format==0.6.11 pyyamlเอกสารจะถูกสร้างและเผยแพร่โดยอัตโนมัติเมื่อใดก็ตามที่มีการสร้างรุ่น GitHub หากต้องการสร้างเอกสารด้วยตนเองให้โทรหาคำสั่งต่อไปนี้
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.htmlในการสร้างเอกสารในพื้นที่คุณจะต้องติดตั้ง doxygen, jinja2 และ pygments ที่ติดตั้งในระบบของคุณ
โครงการยังรวมถึงไดเรกทอรี all ที่อนุญาตให้สร้างเป้าหมายทั้งหมดในเวลาเดียวกัน สิ่งนี้มีประโยชน์ในระหว่างการพัฒนาเนื่องจากจะเปิดเผยโครงการย่อยทั้งหมดไปยัง IDE ของคุณและหลีกเลี่ยงการสร้างที่ซ้ำซ้อนของห้องสมุด
cmake -S all -B build
cmake --build build
# run tests
./build/test/GreeterTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Greeter --help
# build docs
cmake --build build --target GenerateDocsโครงการย่อยการทดสอบและแบบสแตนด์อโลนรวมถึงไฟล์ tools.cmake ซึ่งใช้ในการนำเข้าเครื่องมือเพิ่มเติมตามความต้องการผ่านอาร์กิวเมนต์การกำหนดค่า CMake รองรับต่อไปนี้
sanitizers สามารถเปิดใช้งานได้โดยการกำหนดค่า cmake ด้วย -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'>
เครื่องวิเคราะห์แบบคงที่สามารถเปิดใช้งานได้โดยการตั้งค่า -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> หรือการรวมกันของผู้ที่อยู่ในเครื่องหมายคำพูดคั่นด้วยเครื่องหมายอัฒภาค โดยค่าเริ่มต้นเครื่องวิเคราะห์จะค้นหาไฟล์การกำหนดค่าโดยอัตโนมัติเช่น .clang-format ข้อโต้แย้งเพิ่มเติมสามารถส่งผ่านไปยังเครื่องวิเคราะห์ได้โดยการตั้งค่าตัวแปร CLANG_TIDY_ARGS , IWYU_ARGS หรือ CPPCHECK_ARGS ตัวแปร
CCACHE สามารถเปิดใช้งานได้โดยการกำหนดค่าด้วย -DUSE_CCACHE=<ON | OFF> .
ฉันสามารถใช้สิ่งนี้สำหรับห้องสมุดส่วนหัวเท่านั้นได้หรือไม่?
ใช่อย่างไรก็ตามคุณจะต้องเปลี่ยนประเภทไลบรารีเป็นไลบรารี INTERFACE ตามที่บันทึกไว้ใน cmakelists.txt ดูที่นี่สำหรับตัวอย่างส่วนหัวอย่างเดียวตามเทมเพลต
ฉันไม่ต้องการเป้าหมาย / เอกสารแบบสแตนด์อโลน ฉันจะกำจัดมันได้อย่างไร?
เพียงลบไดเรกทอรีแบบสแตนด์อโลน / เอกสารและไฟล์เวิร์กโฟลว์ GitHub
ฉันสามารถสร้างแบบสแตนด์อโลนและการทดสอบในเวลาเดียวกันได้หรือไม่? / ฉันจะบอก IDE ของฉันเกี่ยวกับโครงการย่อยทั้งหมดได้อย่างไร?
เพื่อรักษาโมดูลาร์เทมเพลตโครงการย่อยทั้งหมดที่ได้จากไลบรารีได้ถูกแยกออกเป็นโมดูล CMake ของตัวเอง วิธีการนี้ทำให้โครงการของบุคคลที่สามเป็นเรื่องเล็กน้อยเพื่อใช้รหัสห้องสมุดโครงการอีกครั้ง เพื่อให้ IDES ดูขอบเขตทั้งหมดของโครงการเทมเพลตรวมถึงไดเรกทอรี all ที่จะสร้างบิลด์เดียวสำหรับโครงการย่อยทั้งหมด ใช้สิ่งนี้เป็นไดเรกทอรีหลักสำหรับการสนับสนุน IDE ที่ดีที่สุด
ฉันเห็นว่าคุณกำลังใช้
GLOBเพื่อเพิ่มไฟล์ต้นฉบับใน cmakelists.txt นั่นไม่ใช่ความชั่วร้ายเหรอ?
GLOB ถือว่าไม่ดีเนื่องจากการเปลี่ยนแปลงโครงสร้างไฟล์ต้นฉบับอาจไม่ถูกจับโดยผู้สร้างของ CMake โดยอัตโนมัติและคุณจะต้องเรียกใช้ CMake ด้วยตนเองในการเปลี่ยนแปลง โดยส่วนตัวแล้วฉันชอบโซลูชัน GLOB เพื่อความเรียบง่าย แต่อย่าลังเลที่จะเปลี่ยนเป็นรายการแหล่งที่มาอย่างชัดเจน
ฉันต้องการสร้างเป้าหมายเพิ่มเติมที่ขึ้นอยู่กับห้องสมุดของฉัน ฉันควรปรับเปลี่ยน cmakelists หลักเพื่อรวมไว้หรือไม่?
หลีกเลี่ยงการรวมโครงการที่ได้รับจากห้องสมุด cmakelists (แม้ว่าจะเป็นภาพที่พบได้ทั่วไปในโลก C ++) เนื่องจากสิ่งนี้จะช่วยให้ต้นไม้พึ่งพาได้อย่างมีประสิทธิภาพและทำให้ระบบสร้างยากที่จะให้เหตุผล ให้สร้างไดเรกทอรีหรือโครงการใหม่ด้วย cmakelists ที่เพิ่มห้องสมุดเป็นการพึ่งพา (เช่นเช่นไดเรกทอรีแบบสแตนด์อโลน) ขึ้นอยู่กับประเภทมันอาจทำให้รู้สึกย้ายส่วนประกอบเหล่านี้ไปยังที่เก็บแยกต่างหากและอ้างอิงการกระทำเฉพาะหรือเวอร์ชันของไลบรารี สิ่งนี้มีข้อได้เปรียบที่แต่ละห้องสมุดและส่วนประกอบสามารถปรับปรุงและอัปเดตได้อย่างอิสระ
คุณแนะนำให้เพิ่มการพึ่งพาภายนอกโดยใช้ cpm.cmake สิ่งนี้จะบังคับให้ผู้ใช้ห้องสมุดของฉันใช้ CPM.CMAKE ด้วยหรือไม่?
CPM.CMAKE ควรมองไม่เห็นผู้ใช้ห้องสมุดเนื่องจากเป็นสคริปต์ CMAKE ที่มีอยู่ในตัวเอง หากมีปัญหาเกิดขึ้นผู้ใช้สามารถยกเลิกได้โดยการกำหนด CMake หรือตัวแปร env CPM_USE_LOCAL_PACKAGES ซึ่งจะแทนที่การโทรทั้งหมดไปยัง CPMAddPackage ด้วยการโทร find_package สิ่งนี้ควรช่วยให้ผู้ใช้สามารถใช้โครงการกับตัวจัดการการพึ่งพา C ++ ภายนอกที่ชื่นชอบเช่น VCPKG หรือ Conan
ฉันสามารถกำหนดค่าและสร้างโครงการออฟไลน์ของฉันได้หรือไม่?
ไม่จำเป็นต้องมีการเชื่อมต่ออินเทอร์เน็ตสำหรับการสร้างโครงการอย่างไรก็ตามเมื่อใช้การพึ่งพาที่ขาดหายไป CPM จะถูกดาวน์โหลดตามเวลากำหนดค่า เพื่อหลีกเลี่ยงการดาวน์โหลดซ้ำซ้อนขอแนะนำให้ตั้งค่าไดเรกทอรีแคช CPM.CMake เช่น: export CPM_SOURCE_CACHE=$HOME/.cache/CPM สิ่งนี้จะเปิดใช้งานโคลนตื้นและอนุญาตให้มีการพึ่งพาการกำหนดค่าออฟไลน์มีอยู่แล้วในแคช
ฉันสามารถใช้ CPACK เพื่อสร้างตัวติดตั้งแพ็คเกจสำหรับโครงการของฉันได้หรือไม่?
เนื่องจากมีตัวเลือกและการกำหนดค่าที่เป็นไปได้มากมายจึงยังไม่ได้อยู่ในขอบเขตของเทมเพลตนี้ ดูเอกสาร CPACK สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าตัวติดตั้ง CPACK
นี่มากเกินไปฉันแค่อยากเล่นกับรหัส C ++ และทดสอบไลบรารีบางอย่าง
บางที Minicppstarter เป็นสิ่งที่คุณต้องการ!