You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取CMake项目所有可收集目标并实现Minibuffer选择提示

实现Emacs中CMake目标的Minibuffer选择与目标收集

一、获取CMake项目的所有可收集目标

CMake原生提供了无需手动解析CMakeLists的目标列表提取方式,不同版本对应不同命令:

  • CMake 3.17+:直接在项目根目录执行,输出纯净的目标列表
    cmake -B <你的构建目录> --list-targets
    
    比如默认build目录可写为:cmake -B build --list-targets
  • CMake 3.15-3.16:通过构建目录的help目标输出,需过滤无关信息
    cmake --build <构建目录> --target help | grep -E '^[a-zA-Z0-9_-]+:' | cut -d: -f1
    

在Emacs中可封装成自动检测版本的函数,直接返回目标列表:

(defun my/cmake-get-all-targets ()
  "获取当前CMake项目的所有可构建目标"
  (let* ((proj-root (projectile-project-root))
         (build-dir (or my/cmake-build-dir (concat proj-root "build/")))
         (cmake-ver (shell-command-to-string "cmake --version | awk '{print $3}'"))
         (cmd (if (version<= "3.17" cmake-ver)
                  (format "cmake -B %s --list-targets" build-dir)
                (format "cmake --build %s --target help | grep -E '^[a-zA-Z0-9_-]+:' | cut -d: -f1" build-dir))))
    (split-string (shell-command-to-string cmd) "\n" t)))

二、实现Minibuffer交互式选择目标

利用Emacs内置的completing-read(即C-f文件选择的补全机制),结合你已有的构建/运行/调试逻辑,实现类文件选择的目标交互:

(defun my/cmake-select-and-run-target ()
  "在Minibuffer选择CMake目标并执行(替换为你的构建/运行逻辑)"
  (interactive)
  (let* ((targets (my/cmake-get-all-targets))
         (selected (completing-read "选择CMake目标: " targets nil t)))
    ;; 替换成你已有的构建/运行/调试函数,比如cmake-build或自定义调试逻辑
    (cmake-build selected)
    (message "已启动目标: %s" selected)))

绑定快捷键后,调用该函数会弹出Minibuffer,支持模糊补全、上下选择,体验和C-f文件选择完全一致。

如果调试需要目标的可执行路径,可通过以下命令获取(可封装进Emacs函数):

cmake -B <构建目录> -LA | grep -E "^<目标名>_OUTPUT_PATH=" | cut -d= -f2

内容的提问来源于stack exchange,提问作者HamsterGamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:22:52