2010-11-25 62 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