【发布时间】:2014-08-27 20:49:12
【问题描述】:
有没有办法简化 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
任何想法如何使这个干燥?
【问题讨论】:
-
该尝试行不通,因为
$(js)是一个文件名列表,因此将在目标槽中扩展为一个文件名列表,其中/build/build.js附加到最后的文件名列表。