Je veux désactiver les règles et les variables intégrées en passant le -r
et -R
options à GNU make, depuis l'intérieur du fichier make. D'autres solutions qui me permettent de le faire implicitement et de manière transparente sont également les bienvenues.
J'ai trouvé plusieurs références pour utiliser MAKEFLAGS
, et j'ai eu des problèmes similaires.
Vous pouvez démarrer le Makefile
avec un #!
Et l'appeler quelque chose de différent pour que les gens n'essaient pas d'utiliser make
directement:
#!/usr/bin/make -rRf
# ...
Cela causera des problèmes horribles si GNU make n'est pas le système make
. Peut-être un script wrapper?
Vous pouvez également lire $(MAKEFLAGS)
et vous assurer que les indicateurs requis sont présents.
La désactivation des règles intégrées se fait en en écrivant une règle vide pour .SUFFIXES
:
.SUFFIXES:
Après avoir effacé les règles intégrées, je ne suis pas sûr que l'effacement des variables intégrées vous aide beaucoup plus que de simplement vous rappeler de les définir vous-même ou de ne pas les utiliser, mais vous pouvez utiliser quelque chose comme
$(foreach V
$(Shell make -p -f/dev/null 2>/dev/null | sed -n '/^[^:#= ]* *=/s/ .*//p'),
$(if $(findstring default,$(Origin $V)),$(eval $V=)))
... ce qui est certes assez fou. S'il existe un moyen d'obtenir une liste des variables définies à l'intérieur de la marque (au lieu de passer à une autre marque), ce serait viable. En l'état, ce n'est pas vraiment mieux que
CC=
CXX=
# etc, for each likely built-in variable
@hseldon a la bonne idée car .SUFFIXES ne couvre pas les règles implicites intégrées de match-everything. Cependant, je ne pense pas que sa syntaxe soit exacte.
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
.SUFFIXES: .you .own .here
Voir http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules et http://www.gnu.org/software/make/ manual/make.html # index-g_t_002eSUFFIXES-998
Cela fonctionne pour moi:
# 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:
Placez-le dans un fichier nommé disable_implicit_rules.mk et include
dans chaque makefile.
Désactivation des règles intégrées en écrivant une règle vide pour .SUFFIXES
ne fonctionne pas si l'on en écrit ensuite un autre .SUFFIXES
règle pour ajouter des suffixes précédemment connus - les règles intégrées sont réactivées. Exemple: on veut définir des règles pour .c.i
et .i.o
, et pour désactiver la règle intégrée .c.o
. L'écriture
.SUFFIXES:
.SUFFIXES: .o .i .c
ne fonctionne pas - cela n'empêche pas la règle intégrée .c.o
d'être appliqué.
La solution est celle employée par Marc Eaddy et documentée dans le manuel GNU make, 10.5.6 Annulation des règles implicites:
Vous pouvez remplacer une règle implicite intégrée (ou celle que vous avez définie vous-même) en définissant une nouvelle règle de modèle avec la même cible et les mêmes conditions préalables, mais une recette différente. Lorsque la nouvelle règle est définie, celle intégrée est remplacée. La position de la nouvelle règle dans la séquence de règles implicites est déterminée par l'endroit où vous écrivez la nouvelle règle.
Vous pouvez annuler une règle implicite intégrée en définissant une règle de modèle avec la même cible et les mêmes conditions préalables, mais sans recette. Par exemple, ce qui suit annulerait la règle qui exécute l'assembleur:
%.o : %.s
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
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
MAKEFLAGS += -r