如何获取CMake项目所有可收集目标并实现Minibuffer选择提示
实现Emacs中CMake目标的Minibuffer选择与目标收集
一、获取CMake项目的所有可收集目标
CMake原生提供了无需手动解析CMakeLists的目标列表提取方式,不同版本对应不同命令:
- CMake 3.17+:直接在项目根目录执行,输出纯净的目标列表
比如默认cmake -B <你的构建目录> --list-targetsbuild目录可写为: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
相关产品推荐
相关产品推荐

