gpt4 book ai didi

makefile - make 中的动态目标

转载 作者:行者123 更新时间:2023-11-30 23:55:28 24 4
gpt4 key购买 nike

我是 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 应该构建,除其他外,帮助程序。每个 helper foo我想在 distrib 下生成以下文件: foo-version.js , foo-version-uncommented.js , foo-version-packed.jsfoo-version-tests.zip .前三个由 foo.js 分别作为副本、通过剥离注释和运行 javascript minifier 获得。我已经有了执行这些任务的命令。

应该在文件本身的注释中读取版本号,我可以轻松地使用它
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 下的所有文件版本号较低。任何想法如何做到这一点?

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

最佳答案

在 GNU make 中,您可以使用函数 calleval ,通常与 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 脚本中一样。 Search Stack Overflow for make eval 或更多细节和指针的东西。

关于makefile - make 中的动态目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com