build - what - Deshabilite las reglas y variables integradas desde dentro del archivo make
yoast meta titles (6)
Deseo inhabilitar las reglas y variables integradas según pasen las opciones -r
y -R
a GNU make, desde dentro del archivo make. También son bienvenidas otras soluciones que me permitan hacer esto de manera implícita y transparente.
He encontrado varias referencias al uso de MAKEFLAGS
y tuve problemas similares.
¡Podrías comenzar el Makefile
con un #!
y llamarlo de otra manera para que la gente no intente usar make
directamente:
#!/usr/bin/make -rRf
# ...
Esto causará problemas terribles si GNU make no es la make
sistema. Tal vez un script de envoltura?
También puede leer $(MAKEFLAGS)
y asegurarse de que estén presentes los indicadores requeridos.
@hseldon tiene la idea correcta porque .SUFFIXES no cubre las reglas implícitas integradas de match-everything. Sin embargo, no creo que su sintaxis sea exactamente correcta.
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
.SUFFIXES: .you .own .here
Ver http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules y http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998
Esto funciona para 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:
Coloque esto en un archivo llamado disable_implicit_rules.mk e inclúyalo en cada archivo MAKE.
La desactivación de las reglas incorporadas se hace escribiendo una regla vacía para .SUFFIXES
:
.SUFFIXES:
Al haber borrado las reglas integradas, no estoy seguro de que borrar las variables integradas te ayude mucho más que solo recordar haberlas configurado o no usarlas, pero podrías usar algo como
$(foreach V
$(shell make -p -f/dev/null 2>/dev/null | sed -n ''/^[^:#= ]* *=/s/ .*//p''),
$(if $(findstring default,$(origin $V)),$(eval $V=)))
... lo cual es ciertamente bastante loco. Si hay una manera de obtener una lista de las variables definidas desde make (en lugar de desembolsarlas a otra marca), sería viable. Tal como están las cosas, no es mucho mejor que
CC=
CXX=
# etc, for each likely built-in variable
La desactivación de reglas incorporadas al escribir una regla vacía para .SUFFIXES
no funciona si se escribe otra regla .SUFFIXES
para agregar sufijos previamente conocidos: las reglas incorporadas se vuelven a habilitar. Ejemplo: uno quiere definir reglas para .ci
y .io
, y para desactivar la regla incorporada .co
. Escritura
.SUFFIXES:
.SUFFIXES: .o .i .c
no funciona: no impide que se aplique la regla incorporada .co
.
La solución es la empleada por Marc Eaddy y documentada en el manual de creación de GNU, 10.5.6 Cancelación de reglas implícitas :
Puede anular una regla implícita incorporada (o una que haya definido usted mismo) definiendo una nueva regla de patrón con el mismo objetivo y requisitos previos, pero con una receta diferente. Cuando se define la nueva regla, se reemplaza la incorporada. La posición de la nueva regla en la secuencia de reglas implícitas está determinada por el lugar donde se escribe la nueva regla.
Puede cancelar una regla implícita incorporada definiendo una regla de patrón con el mismo objetivo y requisitos previos, pero sin receta. Por ejemplo, lo siguiente cancelaría la regla que ejecuta el ensamblador:
%.o : %.s
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
MAKEFLAGS += -r