試:詳解 configurePresets 的 debug 對(duì)象(output / tryCompile / find))
構(gòu)建工具開發(fā)工具CLI【免費(fèi)下載鏈接】CMakeMirror of CMake upstream repository項(xiàng)目地址https://gitcode.com/gh_mirrors/cm/CMake點(diǎn)擊查看免費(fèi)下載本指南以 CMake 倉(cāng)庫(kù)中的 debug-properties.rst 為核心系統(tǒng)講解CMakePresets.json中configurePresets[].debug對(duì)象的三個(gè)布爾字段——output、tryCompile、find——各自的語(yǔ)義、與命令行選項(xiàng)的等價(jià)關(guān)系、繼承規(guī)則以及底層解析與執(zhí)行機(jī)制。讀完本文你將能在不修改 CMakeLists.txt 的前提下僅通過(guò)預(yù)設(shè)文件一鍵開啟 CMake 運(yùn)行時(shí)診斷、保留 try_compile 臨時(shí)文件、以及追蹤 find 系列命令的搜索過(guò)程并與cmake --debug-output、--debug-trycompile、--debug-find等命令行用法自如互換。一、debug 對(duì)象在 configurePresets 中的位置在 CMake 的預(yù)設(shè)Presets體系中configurePresets數(shù)組中的每個(gè)元素都可以攜帶一個(gè)可選的debug對(duì)象用于集中指定調(diào)試選項(xiàng)。在 configurePresets-properties.rst 中該字段被定義為debug—— An optional object specifying debug options. The object may contain the following fields.從倉(cāng)庫(kù)中的 schema.yaml 看debug的類型約束為object其unevaluatedProperties為false即只允許出現(xiàn)下文約定的三個(gè)字段出現(xiàn)任何未知鍵都會(huì)被 JSON Schema 校驗(yàn)器拒絕outputbooleantryCompilebooleanfindboolean值得注意的版本線索在 schema.yaml 中與同級(jí)的trace標(biāo)注since: 7不同debug對(duì)象沒(méi)有since標(biāo)注。從源碼結(jié)構(gòu)看這意味著它是 configure preset 自 schema v1 起便存在的早期字段幾乎所有支持 Presets 的 CMake 版本都能識(shí)別它。與之形成對(duì)比的是trace、condition、toolchainFile等字段分別有明確的版本引入標(biāo)記。二、三個(gè)字段逐一拆解語(yǔ)義、命令行等價(jià)與源碼實(shí)現(xiàn)debug對(duì)象中的每一個(gè)字段都是可選的布爾值設(shè)置true與在命令行中傳遞對(duì)應(yīng)的開關(guān)等價(jià)。下面分別展開。2.1 debug.output —— 等價(jià)于 --debug-output語(yǔ)義可選的布爾值。設(shè)置為true等價(jià)于在命令行傳入--debug-output。--debug-output在 cmake.1.rst 中的完整定義是Put cmake in a debug mode. Print extra information during the cmake run like stack traces withmessage(SEND_ERROR)calls.也就是說(shuō)開啟后 CMake 在運(yùn)行期間會(huì)輸出額外的診斷信息包括message(SEND_ERROR)調(diào)用時(shí)的堆棧軌跡stack trace用于追蹤錯(cuò)誤產(chǎn)生的調(diào)用鏈。源碼證據(jù)在 cmake.cxx 中命令行參數(shù)--debug-output被解析后調(diào)用state-SetDebugOutputOn(true)而在應(yīng)用預(yù)設(shè)時(shí)cmake.cxx 中expandedPreset-DebugOutput true會(huì)調(diào)用同一個(gè)SetDebugOutputOn(true)。兩條路徑殊途同歸驗(yàn)證了預(yù)設(shè)字段 命令行選項(xiàng)的等價(jià)關(guān)系。該標(biāo)志在運(yùn)行期如何發(fā)揮作用從 cmMakefile.cxx 與 cmMakefile.cxx 看GetDebugOutput()被用于決定是否打印額外的調(diào)試消息例如文件加載、配置相關(guān)日志在 cmFileCommand.cxx 中cm-GetDebugOutput() || cm-GetTrace()的組合還控制著file()命令相關(guān)操作的額外輸出。此外CMakeSetupDialog.cxx 與 QCMake.cxx 表明 CMake GUI 也提供對(duì)應(yīng)的開關(guān)最終同樣落到cmake實(shí)例的SetDebugOutputOn。2.2 debug.tryCompile —— 等價(jià)于 --debug-trycompile語(yǔ)義可選的布爾值。設(shè)置為true等價(jià)于在命令行傳入--debug-trycompile。--debug-trycompile在 cmake.1.rst 中的完整定義如下Do not delete the files and directories created fortry_compile/try_runcalls. This is useful in debugging failed checks. Note that some uses oftry_compilemay use the same build tree, which will limit the usefulness of this option if a project executes more than onetry_compile. For example, such uses may change results as artifacts from a previous try-compile may cause a different test to either pass or fail incorrectly. This option is best used only when debugging. (With respect to the preceding, thetry_runcommand is effectively atry_compile. Any combination of the two is subject to the potential issues described.)versionadded:: 3.25— When this option is enabled, every try-compile check prints a log message reporting the directory in which the check is performed.源碼證據(jù)命令行解析位于 cmake.cxx調(diào)用DebugTryCompileOn()預(yù)設(shè)應(yīng)用位于 cmake.cxxexpandedPreset-DebugTryCompile true時(shí)同樣調(diào)用DebugTryCompileOn()。實(shí)際消費(fèi)該標(biāo)志的是 try-compile 的核心實(shí)現(xiàn) cmCoreTryCompile.cxx當(dāng)GetDebugTryCompile()為真時(shí)為try_compile/try_run創(chuàng)建的目錄與文件不會(huì)被清理方便開發(fā)者進(jìn)入該目錄檢查編譯器實(shí)際執(zhí)行的命令與產(chǎn)物。實(shí)戰(zhàn)價(jià)值當(dāng)check_*系列如CheckCSourceCompiles、CheckSymbolExists或項(xiàng)目?jī)?nèi)顯式try_compile失敗且難以定位原因時(shí)開啟debug.tryCompile即可凍結(jié)現(xiàn)場(chǎng)。同時(shí)注意官方文檔的告誡該選項(xiàng)僅建議在調(diào)試時(shí)使用因?yàn)槎啻?try-compile 可能共享同一構(gòu)建樹遺留產(chǎn)物可能污染后續(xù)檢查結(jié)果導(dǎo)致假陽(yáng)性或假陰性。2.3 debug.find —— 等價(jià)于 --debug-find語(yǔ)義可選的布爾值。設(shè)置為true等價(jià)于在命令行傳入--debug-find。--debug-find在 cmake.1.rst 中的完整定義如下Put cmake find commands in a debug mode. Print extra find call information during the cmake run to standard error. Output is designed for human consumption and not for parsing. See also theCMAKE_FIND_DEBUG_MODEvariable for debugging a more local part of the project.版本信息--debug-find在 CMake 3.17 加入文檔標(biāo)注versionadded:: 3.17。源碼證據(jù)命令行解析位于 cmake.cxx調(diào)用SetDebugFindOutput(true)預(yù)設(shè)應(yīng)用位于 cmake.cxx。在 find 命令的公共實(shí)現(xiàn) cmFindCommon.cxx 中GetDebugFindPkgMode() || ...之類的條件驅(qū)動(dòng) find 調(diào)試輸出的開關(guān)cmMakefile.cxx 中還有一個(gè)DebugFindPkgRAII輔助類在進(jìn)入find_package(pkg)調(diào)用時(shí)根據(jù)包的名稱臨時(shí)切換調(diào)試模式退出時(shí)恢復(fù)舊值從而實(shí)現(xiàn)只調(diào)試指定包的局部化能力。實(shí)戰(zhàn)價(jià)值當(dāng)find_package、find_library、find_path、find_program、find_file等找不到目標(biāo)、或找到了錯(cuò)誤版本時(shí)開啟debug.find會(huì)把每個(gè) find 調(diào)用的搜索路徑、命中/未命中的判定過(guò)程輸出到標(biāo)準(zhǔn)錯(cuò)誤stderr輸出面向人類閱讀而非機(jī)器解析。若只想調(diào)試項(xiàng)目中的局部區(qū)域官方還提供了CMAKE_FIND_DEBUG_MODE變量作為更細(xì)粒度的替代。三、三個(gè)調(diào)試字段的繼承與合并規(guī)則debug對(duì)象遵循 configure preset 的通用inherits繼承機(jī)制。在 cmCMakePresetsGraph.cxx 中展開預(yù)設(shè)時(shí)對(duì)這三個(gè)字段分別執(zhí)行了InheritOptionalValue(preset.DebugOutput, parent.DebugOutput)等調(diào)用——注意它們是逐字段獨(dú)立繼承的若子預(yù)設(shè)未顯式設(shè)置某字段則繼承父預(yù)設(shè)inherits鏈上對(duì)應(yīng)字段的值若子預(yù)設(shè)顯式設(shè)置則以子預(yù)設(shè)為準(zhǔn)多個(gè)父預(yù)設(shè)提供沖突值時(shí)inherits數(shù)組靠前的預(yù)設(shè)優(yōu)先該規(guī)則在 configurePresets-properties.rst 中有明確定義。這意味著你可以把公共的調(diào)試開關(guān)放在一個(gè)hidden: true的基預(yù)設(shè)中再讓具體配置預(yù)設(shè)繼承它無(wú)需在每個(gè)預(yù)設(shè)里重復(fù)書寫。字段解析層面的對(duì)應(yīng)證據(jù)在 cmCMakePresetsGraphReadJSONConfigurePresets.cxxPresetDebugHelper通過(guò)Bind(output_s, ...)、Bind(tryCompile_s, ...)、Bind(find_s, ...)將 JSON 鍵綁定到ConfigurePreset::DebugOutput、DebugTryCompile、DebugFind三個(gè)可選布爾成員類型定義見 cmCMakePresetsGraph.h并且三個(gè)鍵均允許缺省最后一個(gè)false參數(shù)表示非必需鍵。隨后該 Helper 被整體綁定到debug鍵下cmCMakePresetsGraphReadJSONConfigurePresets.cxx。四、完整可運(yùn)行的配置示例下面的示例在 example.json 的骨架之上加入debug對(duì)象展示三種常見形態(tài)。將以下內(nèi)容寫入項(xiàng)目根目錄的CMakePresets.json后執(zhí)行cmake --preset debug-on即可同時(shí)獲得三路診斷輸出。{ version: 10, configurePresets: [ { name: base, hidden: true, generator: Ninja, binaryDir: ${sourceDir}/build/${presetName}, debug: { output: true, tryCompile: true, find: true } }, { name: debug-on, inherits: base, displayName: 全量調(diào)試配置, description: 開啟 output/tryCompile/find 全部調(diào)試開關(guān) }, { name: find-only, inherits: base, displayName: 僅追蹤 find 命令, description: 關(guān)閉前兩項(xiàng)僅保留 find 調(diào)試, debug: { output: false, tryCompile: false } } ] }要點(diǎn)說(shuō)明debug-on完全繼承base的三個(gè)開關(guān)等價(jià)于執(zhí)行cmake --debug-output --debug-trycompile --debug-find --preset debug-on未顯式指定的generator、binaryDir同樣繼承自base。find-only在繼承基礎(chǔ)上顯式將output、tryCompile置為false進(jìn)行覆蓋最終僅保留find: true。由于三個(gè)字段均為可選即使完全不寫debug對(duì)象預(yù)設(shè)也完全合法——調(diào)試開關(guān)默認(rèn)關(guān)閉與命令行不傳對(duì)應(yīng)參數(shù)的行為一致。五、調(diào)試策略與注意事項(xiàng)5.1 何時(shí)使用 debug.output當(dāng)message(SEND_ERROR)觸發(fā)、或需要理解 CMake 配置階段的內(nèi)部運(yùn)行軌跡時(shí)開啟。它與--trace對(duì)應(yīng)trace預(yù)設(shè)對(duì)象見 schema.yaml的區(qū)別在于debug.output輸出的是運(yùn)行診斷與堆棧信息而trace輸出的是所有命令調(diào)用的調(diào)用軌跡。二者可以組合使用各自側(cè)重不同。5.2 何時(shí)使用 debug.tryCompile針對(duì)try_compile/try_run檢查失敗時(shí)開啟。開啟后每次檢查還會(huì)額外打印一條日志報(bào)告檢查發(fā)生在哪個(gè)目錄該行為在 cmake.1.rst 中標(biāo)注為 3.25 引入。調(diào)試完成后務(wù)必關(guān)閉因?yàn)檫z留的構(gòu)建產(chǎn)物可能干擾后續(xù)檢查的判定結(jié)果。5.3 何時(shí)使用 debug.find 及其局限針對(duì)find_*系列命令找不到或找錯(cuò)目標(biāo)時(shí)開啟。若想進(jìn)一步縮小范圍CMake 還提供--debug-find-pkgpkg[,...]與--debug-find-varvar[,...]兩個(gè)限定版命令行選項(xiàng)見 cmake.1.rst均于 3.23 加入分別限定到指定包名或指定結(jié)果變量名——不過(guò)它們目前沒(méi)有對(duì)應(yīng)的 preset 字段只能通過(guò)命令行或CMAKE_FIND_DEBUG_MODE變量使用。預(yù)設(shè)層的debug.find是全局開關(guān)輸出寫到標(biāo)準(zhǔn)錯(cuò)誤注意不要將其輸出接入需要機(jī)器解析的管道。六、總結(jié)預(yù)設(shè)與命令行的一一對(duì)應(yīng)debug 字段類型默認(rèn)值等價(jià)命令行選項(xiàng)引入版本命令行源碼落點(diǎn)outputbooleanfalse--debug-output早期即存在cmake.cxxtryCompilebooleanfalse--debug-trycompile日志消息 3.25 增強(qiáng)cmCoreTryCompile.cxxfindbooleanfalse--debug-find3.17cmake.cxxdebug對(duì)象是 configure preset 中把調(diào)試意圖寫進(jìn)配置文件的標(biāo)準(zhǔn)化入口。通過(guò)繼承機(jī)制團(tuán)隊(duì)可以把整套調(diào)試開關(guān)沉淀在共享基預(yù)設(shè)中按需覆蓋配合 schema.json 提供的 JSON SchemaIDE 中還能獲得字段級(jí)的校驗(yàn)與自動(dòng)補(bǔ)全。理解debug三個(gè)字段與命令行選項(xiàng)的等價(jià)關(guān)系、以及它們最終如何驅(qū)動(dòng)cmCoreTryCompile、cmFindCommon等底層實(shí)現(xiàn)是高效排查 CMake 配置階段問(wèn)題的關(guān)鍵一步。贊分享構(gòu)建工具開發(fā)工具CLI【免費(fèi)下載鏈接】CMakeMirror of CMake upstream repository項(xiàng)目地址https://gitcode.com/gh_mirrors/cm/CMake點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Ladybird 瀏覽器的 VS Code 開發(fā)環(huán)境配置CMake Presets、clangd 索引、任務(wù)與調(diào)試指南Ladybird 瀏覽器的 VS Code 開發(fā)環(huán)境配置CMake Presets、clangd 索引、任務(wù)與調(diào)試指南 本文基于 Ladybird 倉(cāng)庫(kù)官方文前端WebAssemblyFIND配置參數(shù)詳解從基礎(chǔ)設(shè)置到高級(jí)調(diào)優(yōu)FIND配置參數(shù)詳解從基礎(chǔ)設(shè)置到高級(jí)調(diào)優(yōu) FINDFramework for Internal Navigation and Discovery是一個(gè)高精后端機(jī)器學(xué)習(xí)物聯(lián)網(wǎng)Frigate 對(duì)象檢測(cè)調(diào)試完全指南歷史標(biāo)注回放、Debug Replay 與手動(dòng) Dummy Camera 配置Frigate 對(duì)象檢測(cè)調(diào)試完全指南歷史標(biāo)注回放、Debug Replay 與手動(dòng) Dummy Camera 配置 本指南聚焦 Frigate NVR 中最實(shí)人工智能計(jì)算機(jī)視覺(jué)音視頻上一篇Slang光線追蹤加速結(jié)構(gòu)BVH構(gòu)建與遍歷優(yōu)化下一篇Voilà安全防護(hù)機(jī)制保護(hù)Jupyter應(yīng)用的5個(gè)關(guān)鍵策略創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考