Отключить встроенные правила make и переменные из файла make - PullRequest
48 голосов
/ 08 ноября 2010

Я хочу отключить встроенные правила и переменные согласно передаче параметров -r и -R в GNU make из файла make. Другие решения, которые позволяют мне делать это неявно и прозрачно, также приветствуются.

Я нашел несколько ссылок на использование MAKEFLAGS, и у него были похожие проблемы.

Ответы [ 7 ]

30 голосов
/ 08 ноября 2010

Отключение встроенных правил выполняется путем написания пустого правила для .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
24 голосов
/ 12 января 2012

@ hseldon имеет правильную идею, потому что .SUFFIXES не охватывает встроенные неявные правила соответствия всем. Тем не менее, я не думаю, что его синтаксис совершенно правильный.

MAKEFLAGS += --no-builtin-rules

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

См. http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules и http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998

6 голосов
/ 18 марта 2011

Это работает для меня:

# 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 в каждый make-файл.

5 голосов
/ 24 марта 2015

Отключение встроенных правил путем записи пустого правила для .SUFFIXES не работает, если одно из них затем пишет другое правило .SUFFIXES для добавления ранее известных суффиксов - встроенные правила повторно активируются.Пример: нужно определить правила для .c.i и .i.o и отключить встроенное правило .c.o.Запись

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

не работает - она ​​не препятствует применению встроенного правила .c.o.

Это решение, используемое Марком Эдди и задокументированное в GNUmake manual, 10.5.6 Отмена неявных правил :

Вы можете переопределить встроенное неявное правило (или то, которое вы определили сами), определивновое шаблонное правило с той же целью и предпосылками, но с другим рецептом.Когда новое правило определено, встроенное заменяется.Положение нового правила в последовательности неявных правил определяется тем, где вы пишете новое правило.

Вы можете отменить встроенное неявное правило, задав шаблонное правило с той же целью и необходимыми условиями, но без рецепта.,Например, следующее отменит правило, которое запускает ассемблер:

    %.o : %.s
2 голосов
/ 02 октября 2018

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 голосов
/ 09 ноября 2010

Вы можете начать Makefile с #! и назвать его как-то иначе, чтобы люди не пытались использовать make напрямую:

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

Это вызовет ужасные проблемы, если GNU makeэто не система make.Может быть, скрипт-обертка?

Вы также можете прочитать $(MAKEFLAGS) и убедиться в наличии необходимых флагов.

1 голос
/ 18 октября 2011
################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
    MAKEFLAGS += -r
...