web-dev-qa-db-fra.com

Désactiver les règles et variables internes de make depuis l'intérieur du fichier make

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.

53
Matt Joiner

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.

2
Jack Kelly

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
31
John Marshall

@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

24
Brandon Bloom

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.

7
Marc Eaddy

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
5
Armali

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
2
Jaakko
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
    MAKEFLAGS += -r
1
hseldon