从make文件中禁用make内置规则和变量

时间:2010-11-08 10:04:27

标签: build makefile gnu gnu-make

我希望禁用内置规则和变量,方法是在make文件中将-r and -R options传递给GNU make。允许我隐式和透明地执行此操作的其他解决方案也是受欢迎的。

我发现several references使用了MAKEFLAGS,并遇到了类似的问题。

7 个答案:

答案 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-Ruleshttp://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