我希望禁用内置规则和变量,方法是在make文件中将-r
and -R
options传递给GNU make。允许我隐式和透明地执行此操作的其他解决方案也是受欢迎的。
我发现several references使用了MAKEFLAGS
,并遇到了类似的问题。
答案 0 :(得分:30)
禁用内置规则由writing an empty rule for .SUFFIXES
完成:
.SUFFIXES:
删除内置规则后,我不确定删除内置变量会不仅仅是记住自己设置或不使用它们,而是可以使用类似
的内容$(foreach V
$(shell make -p -f/dev/null 2>/dev/null | sed -n '/^[^:#= ]* *=/s/ .*//p'),
$(if $(findstring default,$(origin $V)),$(eval $V=)))
......这无疑是相当疯狂的。如果有办法从make中获取已定义变量的列表(而不是炮轰到另一个make),那么它将是可行的。事实上,它并不比
好多少CC=
CXX=
# etc, for each likely built-in variable
答案 1 :(得分:24)
@hseldon有正确的想法,因为.SUFFIXES没有涵盖匹配 - 所有内置的隐式规则。但是,我不认为他的语法是完全正确的。
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
.SUFFIXES: .you .own .here
请参阅http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules和http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998
答案 2 :(得分:6)
这对我有用:
# 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:
.l.r:
.dvi:
.F.o:
.l:
.y.ln:
.o:
.y:
.def.sym:
.p.o:
.p:
.txinfo.dvi:
.a:
.l.ln:
.w.c:
.texi.dvi:
.sh:
.cc:
.cc.o:
.def:
.c.o:
.r.o:
.r:
.info:
.elc:
.l.c:
.out:
.C:
.r.f:
.S:
.texinfo.info:
.c:
.w.tex:
.c.ln:
.s.o:
.s:
.texinfo.dvi:
.el:
.texinfo:
.y.c:
.web.tex:
.texi.info:
.DEFAULT:
.h:
.tex.dvi:
.cpp.o:
.cpp:
.C.o:
.ln:
.texi:
.txinfo:
.tex:
.txinfo.info:
.ch:
.S.s:
.mod:
.mod.o:
.F.f:
.w:
.S.o:
.F:
.web:
.sym:
.f:
.f.o:
将它放在名为disable_implicit_rules.mk的文件中,并将include
放在每个makefile中。
答案 3 :(得分:5)
通过为.SUFFIXES
编写空规则来禁用内置规则如果再编写另一个.SUFFIXES
规则以添加以前已知的后缀,则无效 - 内置规则将重新启用。示例:有人想要为.c.i
和.i.o
定义规则,并禁用内置规则.c.o
。写
.SUFFIXES:
.SUFFIXES: .o .i .c
不起作用 - 它不会阻止应用内置规则.c.o
。
解决方案是Marc Eaddy使用的解决方案,并在GNU制作手册中记录, 10.5.6 Canceling Implicit Rules :
您可以覆盖内置隐式规则(或已定义的规则) 你自己)通过定义一个具有相同目标和的新模式规则 先决条件,但不同的食谱。定义新规则时 内置的一个被替换。新规则在序列中的位置 隐式规则的定义取决于您编写新规则的位置。
您可以通过定义模式规则来取消内置隐式规则 具有相同的目标和先决条件,但没有配方。例如, 以下将取消运行汇编程序的规则:
%.o : %.s
答案 4 :(得分:2)
您可以使用Makefile
启动#!
并将其称为不同的内容,以免人们直接使用make
:
#!/usr/bin/make -rRf
# ...
如果GNU make不是系统make
,这将导致可怕的问题。也许是一个包装脚本?
您还可以阅读$(MAKEFLAGS)
并确保存在所需的标记。
答案 5 :(得分:2)
https://www.gnu.org/software/make/manual/make.html#Canceling-Rules
# Disable built-in rules and variables
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
# Makefile begins
main: main.c
cc main.c -o main
答案 6 :(得分:1)
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
MAKEFLAGS += -r