有办法简化Makefile中的这种重复吗?
duo = ./node_modules/.bin/duo
build: lib/background/build lib/page/build lib/popup/build
lib/background/build: lib/background/build/build.js lib/background/build/build.css
lib/page/build: lib/page/build/build.js lib/page/build/build.css
lib/popup/build: lib/popup/build/build.js lib/popup/build/build.css
lib/background/build/build.js: lib/background/index.js node_modules component.json
@mkdir -p lib/background/build
@$(duo) lib/background/index.js > lib/background/build/build.js
lib/page/build/build.js: lib/page/index.js node_modules component.json
@mkdir -p lib/page/build
@$(duo) lib/page/index.js > lib/page/build/build.js
lib/popup/build/build.js: lib/popup/index.js node_modules component.json
@mkdir -p lib/popup/build
@$(duo) lib/popup/index.js > lib/popup/build/build.js
lib/background/build/build.css: lib/background/index.css node_modules component.json
@mkdir -p lib/background/build
@$(duo) lib/background/index.css | $(myth) > lib/background/build/build.css
lib/page/build/build.css: lib/page/index.css node_modules component.json
@mkdir -p lib/page/build
@$(duo) lib/page/index.css | $(myth) > lib/page/build/build.css
lib/popup/build/build.css: lib/popup/index.css node_modules component.json
@mkdir -p lib/popup/build
@$(duo) lib/popup/index.css | $(myth) > lib/popup/build/build.css
基本上,我想从顶层运行一个简单的make build
命令,它只在必要时重新构建这些子项目。我不想为每个子项目使用Makefile,因为这也是重复的。我尝试过的关于通配符路径的所有东西都没有结果,所以想知道是否有办法做到这一点。例如,我尝试这样做(对于js和css来说都是类似的),但是没有运气:
js = $(shell find lib test -type f -name '*.js' ! -path "*build.js")
$(js)/build/build.js: node_modules component.json
# somehow get the directory such as lib/background based on the make command?
local dir=$(shell dirname $(shell dirname $@))
@mkdir -p $(dir)/build
@$(duo) $(dir)/index.js > $(dir)/build/build.js
有什么办法把这个弄干吗?
发布于 2014-08-27 13:08:36
一个好的第一步将是停止在规则主体中重复目标/等等,而是为它们使用自动变量。因此,目标文件名的'$@'
,目标文件名的目录路径(如dirname
)的'$(@D)'
,等等。
这会让你:
duo = ./node_modules/.bin/duo
build: lib/background/build lib/page/build lib/popup/build
lib/background/build: lib/background/build/build.js lib/background/build/build.css
lib/page/build: lib/page/build/build.js lib/page/build/build.css
lib/popup/build: lib/popup/build/build.js lib/popup/build/build.css
lib/background/build/build.js: lib/background/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/background/index.js > '$@'
lib/page/build/build.js: lib/page/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/page/index.js > '$@'
lib/popup/build/build.js: lib/popup/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/popup/index.js > '$@'
lib/background/build/build.css: lib/background/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/background/index.css | $(myth) > '$@'
lib/page/build/build.css: lib/page/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/page/index.css | $(myth) > '$@'
lib/popup/build/build.css: lib/popup/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) lib/popup/index.css | $(myth) > '$@'
然后意识到当您有共享文件名模式和类似规则体的目标和先决条件时,模式规则是有帮助的,您也可以开始使用它们。他们还会给你额外的自动变量。
你得到了这个(中间)阶段:
duo = ./node_modules/.bin/duo
build: lib/background/build lib/page/build lib/popup/build
lib/background/build: lib/background/build/build.js lib/background/build/build.css
lib/page/build: lib/page/build/build.js lib/page/build/build.css
lib/popup/build: lib/popup/build/build.js lib/popup/build/build.css
%/build/build.js: %/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.js: %/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.js: %/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.css: %/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
%/build/build.css: %/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
%/build/build.css: %/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
他们,你看到,你真的有两个重复的规则,所以你把它们结合起来。
duo = ./node_modules/.bin/duo
build: lib/background/build lib/page/build lib/popup/build
lib/background/build: lib/background/build/build.js lib/background/build/build.css
lib/page/build: lib/page/build/build.js lib/page/build/build.css
lib/popup/build: lib/popup/build/build.js lib/popup/build/build.css
%/build/build.js: %/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.css: %/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
然后,由于make不像人们所希望的那样处理目录目标/先决条件,所以可以删除lib/background/build
、lib/page/build
和lib/popup/build
中间目标,只需将实际的文件作为build
的prereqs列出即可。
duo = ./node_modules/.bin/duo
build: lib/background/build/build.js lib/background/build/build.css \
lib/page/build/build.js lib/page/build/build.css \
lib/popup/build/build.js lib/popup/build/build.css
%/build/build.js: %/index.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.css: %/index.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
我可能应该提到,我没有测试这个(因为我不想模拟目录布局/等等)。但是这些转换是直截了当的,而且概念相当简单,所以它应该工作得很好。但一切皆有可能。
要清理build
先决条件,您可以使用以下内容:
build: $(foreach d,background page popup,$(addprefix lib/$d/build/,build.js build.css))
https://stackoverflow.com/questions/25536683
复制相似问题