Makefile 制造中的动态目标

Makefile 制造中的动态目标,makefile,Makefile,我是make的新手,我正在尝试使用它来部署一些javascript文件。我一直在努力解决以下问题很长一段时间没有成功 我的目录结构如下: helpers/ foo/ foo.js test/ test1.js test2.js ... bar/ bar.js test/ test1.js test2

我是make的新手,我正在尝试使用它来部署一些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应该构建helpers。对于每个助手
foo
我想在distrib下生成以下文件:
foo version.js
foo version uncommented.js
foo version packed.js
foo version tests.zip>。前三个由foo.js获得,分别作为副本,通过剥离注释和运行javascript迷你程序。我已经有了执行这些任务的命令

版本号应该在文件本身的注释中读取,我可以很容易地使用它

def version
    $(shell cat $1 | grep @version | sed -e"s/.*version *//")
endef
我的问题是像
foo version.js
这样的目标是动态的,因为它们依赖于版本号,而版本号是在运行make时读取的。我曾尝试使用模式,但未能成功。问题是这样的事情是行不通的

helpers := foo bar
helpers: $(helpers)
$(helpers): %: $(call version, %)
因为第二个%在宏调用中没有展开,但它是按字面意思使用的

我需要能够使用
makehelpers
构建所有帮助程序,或者使用
makefoo
构建单个帮助程序。第二步是删除
distrib
下版本号较低的所有文件。有什么办法吗


作为一个附带问题:使用不同的构建工具,这样的任务会更容易吗?我不是专家,学习其他东西可能是值得的。

在GNU make中,您可以使用函数
call
eval
,通常与
foreach
结合使用:

%-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脚本中一样。或者是一些关于更多细节和指针的东西。

最后,我决定编写自己的构建工具。它的语法让人联想到标准makefile,但它已经比标准make强大,并且很容易扩展,因为makefile本身是用普通PHP编写的


不再调试空格、制表符和美元符号!:-)

您使用的是什么版本的Make?(试试“make-v”来找出答案。)关于花一个下午的评论特别令人沮丧-(