从make文件中禁用make内build规则和variables
我想要从make文件中通过-r
和-R
选项到GNU make来禁用内置规则和variables。 其他解决scheme,让我这样做隐式和透明地也是受欢迎的。
我发现使用MAKEFLAGS
几个参考 ,并有类似的问题。
禁用内置规则是通过为.SUFFIXES
写一个空的规则来完成的:
.SUFFIXES:
删除内置的规则后,我不确定擦除内置variables是否能够帮助您,而不仅仅是记住自己设置或不使用它们,而是可以使用类似
$(foreach V $(shell make -p -f/dev/null 2>/dev/null | sed -n '/^[^:#= ]* *=/s/ .*//p'), $(if $(findstring default,$(origin $V)),$(eval $V=)))
这是公认的相当疯狂。 如果有办法从make中获得定义variables的列表(而不是退出到另一个make),它将是可行的。 事实上,这并不比这更好
CC= CXX= # etc, for each likely built-in variable
@ hseldon有正确的想法,因为.SUFFIXES不包含匹配所有内build隐式规则的匹配。 但是,我不认为他的语法是完全正确的。
MAKEFLAGS += --no-builtin-rules .SUFFIXES: .SUFFIXES: .you .own .here
################################################################ # DISABLE BUILT-IN RULES # .SUFFIXES: MAKEFLAGS += -r
这适用于我:
# Disable implicit rules to speedup build .SUFFIXES: SUFFIXES := %.out: %.a: %.ln: %.o: %: %.o %.c: %: %.c %.ln: %.c %.o: %.c %.cc: %: %.cc %.o: %.cc %.C: %: %.C %.o: %.C %.cpp: %: %.cpp %.o: %.cpp %.p: %: %.p %.o: %.p %.f: %: %.f %.o: %.f %.F: %: %.F %.o: %.F %.f: %.F %.r: %: %.r %.o: %.r %.f: %.r %.y: %.ln: %.y %.c: %.y %.l: %.ln: %.l %.c: %.l %.r: %.l %.s: %: %.s %.o: %.s %.S: %: %.S %.o: %.S %.s: %.S %.mod: %: %.mod %.o: %.mod %.sym: %.def: %.sym: %.def %.h: %.info: %.dvi: %.tex: %.dvi: %.tex %.texinfo: %.info: %.texinfo %.dvi: %.texinfo %.texi: %.info: %.texi %.dvi: %.texi %.txinfo: %.info: %.txinfo %.dvi: %.txinfo %.w: %.c: %.w %.tex: %.w %.ch: %.web: %.p: %.web %.tex: %.web %.sh: %: %.sh %.elc: %.el: (%): % %.out: % %.c: %.w %.ch %.tex: %.w %.ch %: %,v %: RCS/%,v %: RCS/% %: s.% %: SCCS/s.% .web.p: .lr: .dvi: .Fo: .l: .y.ln: .o: .y: .def.sym: .po: .p: .txinfo.dvi: .a: .l.ln: .wc: .texi.dvi: .sh: .cc: .cc.o: .def: .co: .ro: .r: .info: .elc: .lc: .out: .C: .rf: .S: .texinfo.info: .c: .w.tex: .c.ln: .so: .s: .texinfo.dvi: .el: .texinfo: .yc: .web.tex: .texi.info: .DEFAULT: .h: .tex.dvi: .cpp.o: .cpp: .Co: .ln: .texi: .txinfo: .tex: .txinfo.info: .ch: .Ss: .mod: .mod.o: .Ff: .w: .So: .F: .web: .sym: .f: .fo:
把它放在一个名为disable_implicit_rules.mk的文件中,并将其include
在每个makefile中。
通过为.SUFFIXES
编写一个空的规则来禁用内置规则,如果之后再编写一个.SUFFIXES
规则来添加以前已知的后缀,则不起作用 – 内置规则将被重新启用。 例如:想要为.ci
和.io
定义规则,并禁用内置规则.co
。 写作
.SUFFIXES: .SUFFIXES: .o .i .c
不起作用 – 它不会阻止应用内置规则.co
。
解决scheme是Marc Eaddy使用的解决scheme,并在GNU make手册10.5.6取消隐式规则中有logging :
您可以通过定义具有相同目标和先决条件的新模式规则,而使用不同的配方来覆盖内置的隐式规则(或您自己定义的规则)。 当新的规则被定义时,内置的一个被replace。 新规则在隐式规则序列中的位置取决于您编写新规则的位置。
您可以通过定义具有相同目标和先决条件但没有配方的模式规则来取消内置隐式规则。 例如,以下操作将取消运行汇编程序的规则:
%.o : %.s
你可以用#!
来启动Makefile
并称之为不同的东西,所以人们不会直接使用make
:
#!/usr/bin/make -rRf # ...
这会造成可怕的问题,如果GNU make不是系统make
。 也许是一个包装脚本?
您也可以阅读$(MAKEFLAGS)
并确保所需的标志存在。