2010-11-25 61 views
4

我是一個新手,並試圖用它來部署一些javascript文件。我一直在努力解決以下問題一段時間沒有成功。動態目標在製作

我的目錄結構如下:

helpers/ 
    foo/ 
     foo.js 
     test/ 
      test1.js 
      test2.js 
      ... 
    bar/ 
     bar.js 
     test/ 
      test1.js 
      test2.js 
      ... 
    other helpers... 
distrib/ 
    files ready for distribution 
other stuff... 

我的makefile應該建立,除其他事項外,傭工。對於每個幫手foo,我想在distrib下生成以下文件:foo-version.js,foo-version-uncommented.js,foo-version-packed.jsfoo-version-tests.zip。前三個分別作爲副本,通過剝離註釋並運行javascript minifier,由foo.js獲得。我已經有執行這些任務的命令。

的版本號應該在文件本身,我可以很容易地與

def version 
    $(shell cat $1 | grep @version | sed -e"s/.*version *//") 
endef 

我的問題做的評論閱讀的是,像foo-version.js目標是動態的,因爲它們依賴於版本號,在運行make時讀取。我試圖使用模式,但我沒有做到這一點。問題是,這樣的事情是行不通的

helpers := foo bar 
helpers: $(helpers) 
$(helpers): %: $(call version, %) 

因爲第二%未在宏調用擴展,但它字面上使用。

我需要能夠做make helpers建立所有幫助者或make foo建立一個。第二步是使用較低的版本號刪除distrib下的所有文件。任何想法如何做到這一點?

作爲一個側面的問題:使用不同的構建工具,這樣的任務會更容易嗎?我不是專家,學習別的東西可能是痛苦的。

+0

你使用什麼版本的Make? (嘗試「make -v」找出答案。) – Beta 2010-11-25 19:36:15

回答

9

在GNU做,你可以用foreach使用的功能calleval,通常組合:

%-version.js: %.js 
    # your recipe here 
%-version-uncommented.js: %.js 
    # your recipe here 
%-version-packed.js: %.js 
    # your recipe here 
%-version-tests.zip: %.js 
    # your recipe here 

versions_sfxs := .js -uncommented.js -packed.js -tests.zip 
helpers := $(shell ls $(HELPERSDIR)) 

define JS_template 

helpers: $(1)-version$(2) 

endef 

$(foreach h, $(helpers), \ 
    $(foreach sfx, $(versions_sfxs), \ 
    $(eval $(call JS_template,$(h),$(sfx)) \ 
) \ 
) 

此代碼是未經測試,但它給人的總體思路。希望花一個下午來調試你的空間,製表符,美元符號和反斜槓的使用,就像在shell腳本中一樣。 Search Stack Overflow for makeeval或更多的細節和指針。

+2

關於度過一個下午的評論特別令人沮喪...... :-( – Andrea 2010-11-26 17:57:35

-4

最後我決定寫我自己的構建工具PHPmake。它有一個讓人聯想到標準makefile的語法,但它已經比標準make更強大,並且它很容易擴展,因爲makefiles本身是用普通的PHP編寫的。

沒有更多的調試空間,標籤和美元符號! :-)

+0

'已經比標準作品更強大了' – jwg 2017-07-03 10:20:55