Zakázat make vestavěný pravidel a proměnných zevnitř make souboru

hlasů
43

Chci vypnout vestavěný pravidel a proměnných podle průchodem -ra -Rmožnosti pro GNU make, zevnitř make souboru. Jiné řešení, která umožňují, abych to implicitně a transparentně jsou také vítány.

Zjistil jsem několik odkazů na používání MAKEFLAGS, a měl podobné problémy.

Položena 08/11/2010 v 11:04
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
29

Zakázání vestavěných pravidel je provedeno písemně prázdný pravidlo.SUFFIXES :

.SUFFIXES:

Poté, co vymazal vestavěné pravidla, nejsem si jistý, že mazání vestavěné proměnné vám pomůže mnohem víc než jen zapamatování jim nastavit sami, nebo ne je používat, ale můžete použít něco jako

$(foreach V
    $(shell make -p -f/dev/null 2>/dev/null | sed -n '/^[^:#= ]* *=/s/ .*//p'),
    $(if $(findstring default,$(origin $V)),$(eval $V=)))

... což je sice docela šílené. Pokud existuje způsob, jak získat seznam definovaných proměnných zevnitř make (namísto ostřelování ven jinou značkou), by mělo být životaschopná. Jak to je, je to opravdu není o moc lepší než

CC=
CXX=
# etc, for each likely built-in variable
Odpovězeno 08/11/2010 v 19:07
zdroj uživatelem

hlasů
20

@hseldon má dobrý nápad, protože .SUFFIXES nezahrnuje zápalky všechno vestavěný implicitních pravidel. Nicméně, já si nemyslím, že jeho syntaxe je přesně to pravé.

MAKEFLAGS += --no-builtin-rules

.SUFFIXES:
.SUFFIXES: .you .own .here

Viz http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules a http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998

Odpovězeno 12/01/2012 v 01:36
zdroj uživatelem

hlasů
5

Zakázání vestavěných pravidel psaní prázdného pravidlo .SUFFIXESnefunguje, pokud jeden zapíše další .SUFFIXESpravidlo přidat dříve známých přípon - vestavěná pravidla jsou znovu povolit. Příklad: Jeden chce definovat pravidla pro .c.ia .i.o, a zakázat vestavěné pravidlo .c.o. Psaní

.SUFFIXES:
.SUFFIXES: .o .i .c

nefunguje - to nebrání vestavěné pravidlo .c.oz použity.

Řešením je jeden zaměstnaný Marc Eaddy a zdokumentovány v GNU make manuální, 10.5.6 Zrušení implicitních pravidel :

Můžete přepsat vestavěnou implicitní pravidlo (nebo ta, kterou definovali sami) definováním nové pravidlo vzor se stejným cílem a předpoklady, ale jiný recept. Je-li nová pravidla definovaná, vestavěný jeden je vyměnit. Pozice Nové pravidlo v pořadí implicitních pravidel, je určen pro psaní nové pravidlo.

Můžete zrušit vestavěný implicitní pravidlo definováním pravidlo vzor se stejným cílem a předpoklady, ale bez receptu. Například následující by zrušit pravidlo, které spouští assembler:

    %.o : %.s
Odpovězeno 24/03/2015 v 07:57
zdroj uživatelem

hlasů
5

To funguje pro mě:

# 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:

Dát do souboru s názvem disable_implicit_rules.mk a includeto v každém makefile.

Odpovězeno 18/03/2011 v 19:49
zdroj uživatelem

hlasů
4
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
    MAKEFLAGS += -r
Odpovězeno 18/10/2011 v 15:48
zdroj uživatelem

hlasů
3

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
Odpovězeno 02/10/2018 v 06:56
zdroj uživatelem

hlasů
1

Dalo by se začít Makefiles #!a říkat něco jiného, takže lidé nemají zkuste použít makepřímo:

#!/usr/bin/make -rRf
# ...

To způsobí strašné problémy, pokud GNU make není systém make. Možná wrapper skript?

Můžete si také přečíst $(MAKEFLAGS)a ujistěte se, že požadované příznaky jsou přítomny.

Odpovězeno 09/11/2010 v 00:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more