Answers:
您可以解析make -pn
(make --print-data-base --dry-run
)的输出吗?它打印出所有变量,规则,隐式规则以及要费力的细节运行哪些命令。
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
。该-r
删除隐含规则。
make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}'
取自make arg补全,其工作原理像一个魅力。
~/bin
而不是使用别名。效果很好;谢谢!
alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
将为您节省2分钟的报价游戏时间:-)
| sort -u
看起来更有用:)
我不确定这是否只是一个gnu make东西,但是效果很好:
make help
一些响应者建议使用make -pn
,它将打印规则数据库,但不执行任何操作-或多或少。这种方法的问题在于,-n
它仍然会调用所有递归的make,并且仍然做比必要的事情更多的工作,因为它会打印出它将在常规构建中调用的每个命令。一个更有效的解决方案是使用以下内容创建一个普通的makefile:dummy.mk:
__all_targets__: ; #no-op
现在调用make as make -p -f Makefile -f dummy.mk __all_targets__
。在任何实质性构建上,make生成的输出量之间的差异都很大。例如:
$ gmake -pn | wc
138985 2632330 69612711
$ gmake -f Makefile -f /tmp/dummy.mk -pn __all_targets__ | wc
21673 93437 878985
执行时间也明显更好-第一个版本为2.063s,第二个版本为0.059s。
time make -pn | wc -l
‘:1338738 real 0m47.754s.
’ time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
”: 938621 real 0m40.219s
。
make
似乎暗示了类似但友好的内容,即make -p -f/dev/null
-f /dev/null
将阻止make
对常规makefile的解析,因此您将仅获得内置规则的打印输出。这就是我的解决方案指定的原因-f Makefile -f dummy.mk
。但这还不够,因为有了-n
,make
将继续并实际上也开始执行makefile中的规则。不幸的是,我不知道有任何修改可以简化最初介绍的解决方案。
-n
...”
编辑:仅供参考,另一个答案中的debian bash完成git存储库现在结合了针对bash完成用例量身定制的此脚本的增强版本。
#!/bin/bash
SCRIPT='
/^# Make data base/,/^# Files/d # skip until files section
/^# Not a target/,+1 d # following target isnt
/^\.PHONY:/ d # special target
/^\.SUFFIXES:/ d # special target
/^\.DEFAULT:/ d # special target
/^\.PRECIOUS:/ d # special target
/^\.INTERMEDIATE:/ d # special target
/^\.SECONDARY:/ d # special target
/^\.SECONDEXPANSION/ d # special target
/^\.DELETE_ON_ERROR:/ d # special target
/^\.IGNORE:/ d # special target
/^\.LOW_RESOLUTION_TIME:/ d # special target
/^\.SILENT:/ d # special target
/^\.EXPORT_ALL_VARIABLES:/ d # special target
/^\.NOTPARALLEL:/ d # special target
/^\.ONESHELL:/ d # special target
/^\.POSIX:/ d # special target
/^\.NOEXPORT:/ d # special target
/^\.MAKE:/ d # special target
# The stuff above here describes lines that are not
# explicit targets or not targets other than special ones
# The stuff below here decides whether an explicit target
# should be output.
/^[^#\t:=%]+:([^=]|$)/ { # found target block
h # hold target
d # delete line
}
/^# File is an intermediate prerequisite/ { # nope
s/^.*$//;x # unhold target
d # delete line
}
/^([^#]|$)/ { # end of target block
s/^.*$//;x # unhold target
s/:.*$//p # write current target
d # hide any bugs
}
'
make -npq .DEFAULT 2>/dev/null | sed -n -r "$SCRIPT" \
| sort | uniq
这是一个比debian bash完成脚本更完整的脚本,因为它提供了生成规则的结果,这是问题所要的,并且投票最高的答案(debian git服务器上的debian bash完成脚本)还远远不够。
这不是我链接到的原始脚本,但是它更简单并且触感也更快。
这是基于Todd Hodes解决方案的别名代码
alias mtargets='make -qp | awk -F":" "/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split(\$1,A,/ /);for(i in A)print A[i]}"'
这里有一个很好的解决方案,带有一些sed和egrep魔术:https : //gist.github.com/pvdb/777954
我正在研究solaris 10和turbo C外壳。给定的解决方案不适用于我的makefile项目。即使将上面的命令行更改为tcsh语法也是如此。但是,我发现您可以使用以下方法获得简单的解决方案
remake --tasks | grep -v "clean some static output or just grep tabs on start of line" | awk ´{print $1}´
重制版本:
remake --version
是
GNU Make 3.82+dbg0.8
Built for sparc-sun-sparc2-9
和其他一些不重要的版本数据
当然可以,但是您什么时候要它吐出来呢?
要在目标运行规则时报告目标名称,请在规则中添加一行:
foo$(VAR): $(PREREQS)
@echo now making the foo target: $@
do_other_stuff...
要一次吐出所有内容,您可以设置一个单独的PHONY目标:
.PHONY: show_vars
show_vars:
@echo foo$(VAR)
@echo bar$(PARAM) blah$(FLAG)
# and so on
这可以成为默认目标的先决条件:
all: show_vars
...
编辑:
您想要一种显示任意makefile的所有可能目标的方法,我想这是非侵入性的。好...
为了做到这一点,并能够处理复杂的makefile,例如涉及由eval
语句构造的规则,您必须编写接近Make仿真器的内容。不切实际的。
要查看简单规则的目标,您可以编写一个可以作为makefile扫描程序的makefile,并在任意makefile上运行:
这将是一项令人印象深刻的工作。您确定目标值得努力吗?
grep ^[a-z].*\:$ Makefile | sed s,:,,g
:=
),该方法也会产生误报。