2012-07-31 102 views
0

腳本mkmakefile在builddir中生成以下Makefile。解釋由mkmakefile(Linux內核,buildroot,busybox)生成的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 
    @: 

回答

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_targsfoo bar baz,併爲這三個目標,我們什麼也不做,但我們需要all。爲all規則運行命令

make -C path_to_srcdir foo bar baz 

(有幾個更曲折,但是這是它的核心。)

+0

偉大的回答,非常感謝! – arved 2012-07-31 16:38:58