【聲明】本博客所有內容均為個人業余時間創作,所述技術案例均來自公開開源項目(如Github,Apache基金會),不涉及任何企業機密或未公開技術,如有侵權請聯系刪除
背景
接之前 blog
【OS】【Nuttx】【構建】cmake 配置問題定位:gmake 調用
【OS】【Nuttx】【構建】cmake 配置問題定位:CMakeFiles/menuconfig.dir
【OS】【Nuttx】【構建】cmake 配置問題定位:menuconfig.dir/build.make
之前 blog 已經分析了 gmake 和 gmake[1],gmake[2] 的調用關系,以及 CMakeFiles,menuconfig.dir,定位了問題大部分元素,最后指向了 build.make 中具體執行命令的 70 行(找不到對應文件和目錄),下面來分析解決方案
build.make
下面來看出問題的地方
構建 CMakeFiles/menuconfig 目標時,第 70 行出錯了,沒找到相關的文件或目錄
出問題的這句話很長,而且這個 menuconfig 目標執行的是命令,直接拷貝出來在 bash 終端執行,方便查看
這里看起來很長,化繁為簡其實很清晰,這是
cmake -E env [--env=NAME=VALUE] [command]
命令行模式的用法,表示設置環境變量并運行 command 命令,很明顯,這里的命令是 menuconfig,而在 bash 終端輸入 which menuconfig 來查找這個命令的位置,可以看到是沒有這個命令的,所以執行出錯
首先要明確目的,這里是要用 cmake 進行工程配置,要實現與 make menuconfig 一樣的效果,這里就涉及到 menuconfig 這個概念,在 make 構建和 cmake 構建中,它都是一個目標,查看 make 里對它的目標描述:
可以看到其實和 cmake 上面那個命令很像,都是設置環境變量 KCONFIG_ENV,然后執行命令 KCONFIG_MENUCONFIG,那么 make menuconfig 執行的命令 KCONFIG_MENUCONFIG,可以發現和 cmake 執行的并不相同,cmake 執行的是 menuconfig,而 make 執行的是 kconfig-mconf Kconfig
這里就涉及到兩個概念:menuconfig 和 kconfig-mconf Kconfig
- menuconfig:表示這是一個基于文本的用戶界面,用來瀏覽和編輯由 Kconfig 文件定義的配置選項
- kconfig-mconf:是實現 menuconfig 的實際工具,mconf 是 kconfig 系統的一部分,負責解析 Kconfig 文件并生成相應的配置界面,換句話講,當運行 make menuconfig 命令時,實際上是在調用 kconfig-mconf 工具來讀取 Kconfig 文件并顯示配置界面
這里問題就很清晰了,cmake 執行了 menuconfig 這樣一個抽象的,不存在的概念,而 make 執行的是 kconfig-mconf Kconfig 這樣一個清晰的命令,所以 cmake 當然執行命令出錯,之前 blog 【OS】【Nuttx】【構建】cmake menuconfig 目標 講過, cmake 執行配置命令在 42 行這里
而 ${MENUCONFIG} 的值在 37 行這里
所以將 cmake 這里的 MENUCONFIG 替換成 kconfig-mconf Kconfig
再重新在 bash 終端執行命令
cmake --build build -t menuconfig
此時 cmake 可以正常打開配置界面,和 make menuconfig 一樣,并且這里打開的是 build 目錄下的 .config
這和用 make 在 nuttx 項目根路徑上進行 menuconfig 還是有區別的,make 上顯示的 .config 是相對路徑(相對于 nuttx),而 cmake 上顯示的是絕對路徑,不過不影響用 cmake 進行配置就行
ok,cmake 配置工程結束,下篇 blog 回到主線繼續分析