脚本 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: all $(MAKECMDGOALS) all := $(filter-out all Makefile,$(MAKECMDGOALS)) all: $(MAKE) $(MAKEARGS) $(all) Makefile:; $(all): all @: %/: all @:
最佳答案
让我们分解一下。首先,使用 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
所以我们什么都不做 Makefile
,all_targs
是 foo bar baz
,对于这三个目标我们什么都不做,但我们需要 所有
。 all
的规则运行命令
make -C path_to_srcdir foo bar baz
(还有一些曲折,但这是它的核心。)
关于linux - 详解mkmakefile生成的Makefile(Linux内核、buildroot、busybox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740096/