Подтвердить что ты не робот

Отключить создание встроенных правил и переменных внутри файла make

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

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

4b9b3361

Ответ 1

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

Ответ 2

@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

Ответ 3

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

# 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 файл.

Ответ 4

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

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

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

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

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

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

    %.o : %.s

Ответ 6

################################################################
# DISABLE BUILT-IN RULES
#
.SUFFIXES:
    MAKEFLAGS += -r

Ответ 7

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

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

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

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