建立一個新的C ++項目通常需要大量的準備和样板代碼,對於具有測試,可執行文件和連續集成的現代C ++項目而言,更是如此。該模板是從許多以前的項目中學習的結果,應有助於減少設置現代C ++項目所需的工作。
Greeter是指項目的名稱,而greeter則以文件名使用。include/greeter目錄以使用項目的小寫名稱,並相應地更新所有相關的#include s。CODECOV_TOKEN下的項目的github秘密最終,您可以刪除任何未使用的文件,例如獨立目錄或無關的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要收集代碼覆蓋信息,請使用-DENABLE_TEST_COVERAGE=1選項運行cmake。
使用項目根目錄中的以下命令來檢查並修復C ++和CMAKE源樣式。這就需要在當前系統上安裝clang-Format , 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有關詳細信息,請參見格式。這些依賴項可以使用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測試和獨立子標記包括工具。CMAKE文件,用於通過CMake配置參數導入點播其他工具。目前支持以下內容。
可以通過使用-DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'>來啟用消毒器。 -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> 。
可以通過設置-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck>可以啟用靜態分析儀。 -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> ,或者在引號中的組合,被分子隔開。默認情況下,分析儀將自動找到配置文件,例如.clang-format 。可以通過設置CLANG_TIDY_ARGS , IWYU_ARGS或CPPCHECK_ARGS變量來傳遞其他參數。
可以通過配置-DUSE_CCACHE=<ON | OFF>可以啟用CCACHE -DUSE_CCACHE=<ON | OFF> 。
我可以將其用於僅限標題庫嗎?
是的,但是您需要將庫類型更改為cmakelists.txt中記錄的INTERFACE庫。請參閱此處,以獲取基於模板的示例僅限標頭庫。
我不需要獨立的目標 /文檔。我怎麼能擺脫它?
只需刪除獨立 /文檔目錄,並根據GitHub工作流文件即可。
我可以同時構建獨立的測試嗎? /我如何告訴我的IDE所有子標題?
為了保持模板模塊化,從庫中派生的所有子標記都已分離為自己的CMAKE模塊。這種方法使第三方項目重複使用項目庫代碼變得很微不足道。為了允許IDE查看項目的完整範圍,該模板包含將為所有子項目創建一個單個構建的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選擇退出,該cpm_use_local_package將使用find_package調用來覆蓋所有呼叫CPMAddPackage 。這還應該使用戶能夠將項目與他們喜歡的外部C ++依賴管理器(例如VCPKG或CONAN)一起使用。
我可以離線配置和構建項目嗎?
構建項目不需要Internet連接,但是在使用CPM時,將在配置時下載丟失的依賴項。為了避免多餘的下載,強烈建議設置CPM。CMAKECACHERETORY,例如: export CPM_SOURCE_CACHE=$HOME/.cache/CPM 。這將啟用淺層克隆,並允許在緩存中提供離線配置依賴關係。
我可以使用CPACK為項目創建軟件包安裝程序嗎?
由於有很多可能的選項和配置,因此在此模板的範圍中尚未(尚未)。有關設置CPACK安裝程序的更多信息,請參見CPACK文檔。
這太多了,我只想使用C ++代碼並測試一些庫。
也許微型彭斯特特適合您!