Makefile 制造中的动态目标
我是make的新手,我正在尝试使用它来部署一些javascript文件。我一直在努力解决以下问题很长一段时间没有成功 我的目录结构如下:Makefile 制造中的动态目标,makefile,Makefile,我是make的新手,我正在尝试使用它来部署一些javascript文件。我一直在努力解决以下问题很长一段时间没有成功 我的目录结构如下: helpers/ foo/ foo.js test/ test1.js test2.js ... bar/ bar.js test/ test1.js test2
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”来找出答案。)关于花一个下午的评论特别令人沮丧-(