0

スクリプト mkmakefile は、builddir に次の Makefile を生成します。

呼び出されると、すべてのターゲットが srcdir Makefile に渡されます。

誰でも理由を説明できますか?魔法はどこ?

最後の単語 = $(単語 $(単語 $(1)),$(1))
makedir := $(dir $(call lastword,\$(MAKEFILE_LIST)))

MAKEARGS := -C path_to_srcdir
MAKEARGS += O=$(if $(patsubst /%,,$(makedir)),$(CURDIR)/)$(patsubst %/,%,$(makedir))

MAKEFLAGS += --no-print-directory

.PHONY: すべての $(MAKECMDGOALS)

all := $(すべての Makefile を除外します,$(MAKECMDGOALS))

全て:
    $(MAKE) $(MAKEEARGS) $(all)

メイクファイル:;

$(all): すべて
    @:

%/: 全て
    @:
4

1 に答える 1

3

分解してみましょう。まず、allターゲットと変数名の両方として使用することは、初心者のコーダーやコード ジェネレーターが行うことであり、単に不快です。変数の名前を変更して、all_targsで呼び出していると仮定しましょうmake Makefile foo bar baz。質問に関係のないいくつかの部分をスクラッチすると、次のようになります。

MAKEARGS := -C path_to_srcdir

.PHONY: all $(MAKECMDGOALS)

all_targs := $(filter-out all Makefile,$(MAKECMDGOALS)) # foo bar baz

all:
    $(MAKE) $(MAKEARGS) $(all_targs)

Makefile:;

$(all_targs): all
    @: # do nothing

したがって、これら 3 つのターゲットについては、require 以外は何もしませMakefileん。コマンドを実行するためのルールall_targsfoo bar bazallall

make -C path_to_srcdir foo bar baz

(さらにいくつかのひねりがありますが、それが核心です。)

于 2012-07-31T15:41:36.013 に答える