2015-04-23 70 views
1

我正在爲具有複雜目錄結構中大量js文件的項目編寫一個Makefile。運行時,需要對每個文件執行一些編譯並將結果保存到具有相同樹結構的不同目錄中(現在由cp模擬)。當我運行make js時,它會自動生成,當我再次運行make js時,它說沒有任何工作要做。但是,當我修改其中一個文件和make js時,它會重新構建整個樹而不是修改後的文件。即使只有一個更改,Makefile也會重建所有文件

SHELL := /bin/bash 
BUILDDIR := build/gui/ 

RAWJSFILES := $(shell find app -name '*.js') 
BUILT_RAWJSFILES := $(patsubst %, $(BUILDDIR)%,$(RAWJSFILES)) 

$(BUILDDIR): 
    mkdir -p $(BUILDDIR) 

$(RAWJSFILES): $(BUILDDIR) 

$(BUILT_RAWJSFILES): $(RAWJSFILES) 
    mkdir -p $(@D) 
    # compile step 
    cp $(shell python -c "print '[email protected]'.lstrip('${BUILDDIR}')") $(@D) 

.PHONY: js 
js: $(BUILT_RAWJSFILES) 

回答

1

$(BUILT_RAWJSFILES): $(RAWJSFILES)$(RAWJSFILES)設定每個文件的先決條件在$(BUILT_RAWJSFILES)所有文件。

要獲得您想要的一對一映射,您需要一個模式規則或一個靜態模式規則。

此外,嵌入式python片段不是在所有做你打算在那裏做的。它將從[email protected]的值中刪除最長的前導字首,其中包含BUILDDIR中的任何字符,即build/gui/(僅作爲字符的字符串,因此相當於lstrip('/iugdlb'))。 (哦,你也不需要$(shell)這裏你已經在一個shell的上下文中,所以一個正常的命令替換也可以工作($$(python ...))。

這就是說,如果你使用模式或靜態模式規則, 。就會有更容易的方法來獲取源文件名,然後用像蟒蛇弄亂

像這樣的東西應該工作(未經測試):

$(BUILDDIR)%.js: %.js 
     mkdir -p $(@D) 
     cp $^ $(@D) 
+0

啊感謝結算,多達你舉的例子也工作完全一樣標榜! – hatch

相關問題