一个好的开始是停止重复目标等。在规则体本身中并使用自动变量代替。所以'$@'
对于目标文件名,'$(@D)'
对于目录路径(例如dirname
) 目标文件名等。
这会让你:
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
, and lib/popup/build
中间目标并仅列出实际文件作为先决条件build
.
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))