-1

compgen -c make 在 mac 上的 BASH 中运行并得到以下返回值:

makepqg
makepqg
makepqg
make
makeinfo
makepqg
makepqg

但我想要什么和应该做什么?得到(并且在完成时得到)是:

foo
bar
biz
baz

这代表了我的各种 PHONY 制定规则来做自动的事情。


通常,如何使用可执行工具从 SHELL 生成此列表compgen

(这是一个理想的问题,因为从 python3 开始,subprocess无法模拟交互,我将不得不做更多的事情)


这与重复的候选者“我如何在 make 中获取目标(释义)”不同,因为我认为(非工作)命令不是一个好的答案,这个问题是关于compgenandmake而不是makeand the的内部运作make

make -p no_targets__ 
| awk -F':' '/^[a-zA-Z0-9][^\$$#\/\\t=]*:([^=]|$$)/ {split(\$$1,A,/ /);for(i in A)print A[i]}' "
| grep -v '__\$$' "
| sort

但是我可以使用正则表达式为我的高级目的找到某种解决方案吗?

在我看来,不,因为 compgen 很容易且令人难忘,而这个 kludge 很难,并且会在我堆在上面的任何代码上引入拖累。


此外,该副本允许对 makefile 进行更改。

在我的情况下,make 文件必须被认为是给定的,否则我所做的将不太有用。

因此,更具体地说,给定任何makefile,是否存在涉及 make 之外的工具的解决方案,可以查看 make 并让 make 输出其配方列表,就像 bash 完成一样。

换句话说:可以为任何makefile(不失一般性)做到这一点,而不需要对makefile的写权限,也不需要使用tty模拟器模拟tab-tab?

4

1 回答 1

1

只是一个要点。

_make_phony() {
    COMPREPLY=( )
    # a lot of code
    COMPREPLY=( foo bar biz baz )
}
complete -F _make_phony make

现在,当您键入时,make TabTab您将获得:

foo
bar
biz
baz

当然,您必须解析 Makefile 以提取真正的 PHONY,并处理make、likemake -f Makefile.osx和其他每个可能的选项;它真的可以变得复杂。

于 2021-12-10T21:57:50.713 回答