web-dev-qa-db-ja.com

makeファイル内からmake組み込みのルールと変数を無効にする

-rおよび-Rオプション からGNU make、makeファイル内から。これを暗黙的かつ透過的に行うことができる他のソリューションも歓迎します。

MAKEFLAGS を使用する いくつかの参照 が見つかり、同様の問題がありました。

53
Matt Joiner

Makefileを_#!_で開始し、別の名前を付けて、人々がmakeを直接使用しないようにすることができます。

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

GNU makeがシステムmakeではない場合、これは恐ろしい問題を引き起こします。おそらくラッパースクリプトですか?

$(MAKEFLAGS)を読み取り、必要なフラグが存在することを確認することもできます。

2
Jack Kelly

組み込みルールの無効化は .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
31
John Marshall

@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

24
Brandon Bloom

これは私にとってはうまくいきます:

# 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をすべてのメイクファイルに入れます。

7
Marc Eaddy

.SUFFIXESの空のルールを書き込んで組み込みルールを無効にしても、以前に既知のサフィックスを追加するために別の.SUFFIXESルールを書き込んだ場合は機能しません-組み込みルールが再度有効になります。例:.c.iおよび.i.oのルールを定義し、組み込みルール.c.oを無効にしたいとします。書き込み

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

機能しません-組み込みのルール.c.oの適用を妨げません。

解決策は、Marc Eaddyによって採用され、GNU make manual、10.5.6暗黙のルールのキャンセル

同じターゲットと前提条件を持つが異なるレシピで新しいパターンルールを定義することにより、組み込みの暗黙のルール(または自分で定義したルール)を上書きできます。新しいルールが定義されると、組み込みのルールが置き換えられます。暗黙のルールのシーケンスにおける新しいルールの位置は、新しいルールを記述した場所によって決まります。

同じターゲットと前提条件を使用してパターンルールを定義し、レシピは定義しないことで、組み込みの暗黙ルールをキャンセルできます。たとえば、次はアセンブラを実行するルールをキャンセルします。

    %.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