0

脚本 mkmakefile 在 builddir 中生成以下 Makefile。

如果调用,所有目标都将传递给 srcdir Makefile。

谁能解释为什么?魔法在哪里?

lastword = $(word $(words $(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 := $(filter-out all Makefile,$(MAKECMDGOALS))

全部:
    $(制作) $(制作) $(全部)

生成文件:;

$(全部):全部
    @:

%/: 全部
    @:
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

所以我们什么都不做Makefileall_targs是的foo bar baz,对于这三个目标,我们什么也不做,只是我们需要allall运行命令的规则

make -C path_to_srcdir foo bar baz

(还有一些曲折,但这是它的核心。)

于 2012-07-31T15:41:36.013 回答