2014-08-28 48 views
0

在這一點上,我想找到一些有用的東西(thisthis,雖然沒有必要閱讀,但這個問題應該簡單得多)。

我想創建一個使用子動態(未知)數量的子文件的子任務的make任務。你能做這個嗎?

build/%.js: $(shell find apps/% -type f -name '*.js') 

說你想要的最終目錄樹看起來像這樣:

build/ 
build/page.js 
build/popup.js 
apps/ 
apps/page/ 
apps/page/index.js 
apps/page/lib/ 
apps/page/lib/a.js 
apps/page/lib/b.js 
apps/popup/ 
apps/popup/index.js 

當您更改任何index.js文件,或嵌套在lib/*.js的文件,那麼對應的文件夾應該重建。

你如何用make做到這一點?沒有重複性,如果你有一堆非DRY的類似構建任務,就很容易做到。

我也試過這樣:

build/%.js: apps/%/index.js apps/%/lib/*.js 

但是,只有當存在於每個項目lib/*.js工作。上面的示例目錄樹中的「popup」項目沒有這個,所以它永遠不會構建。

所以基本上,這些目標需要是「可選的」。一個簡單的例子是這樣的:

build.js: $(shell find apps -type f -name '*.js') 

這將創建一個build.js文件,如果任何*.js文件apps/文件夾內改變。基本上這就是我要去的,主要區別是我想有一個變量名涉及:

build/%.js: $(shell find apps/% -type f -name '*.js') 

但是,這並不工作,因爲它似乎%不在$(shell)函數內部評估(不知道該如何工作或記錄在哪裏)。但基本上,這就是我想要做的。

這可能嗎?

回答

1

您可以爲「手動」匹配build/%.js的每個目標定義先決條件,並仍然保留常用的build/%.js目標規則來構建它們。

APPS := $(subst apps/,,$(wildcard apps/*)) 

TARGETS := $(patsubst %,build/%.js,$(APPS)) 

all: $(TARGETS) 

# Add prerequisites (based on $(wildcard) output) to each target file. 
$(foreach app,$(APPS),$(eval build/$(app).js: $(wildcard apps/$(app)/lib/*.js))) 

build/%.js: apps/%/index.js 
     @echo 'Building [email protected] from $^' 
相關問題