在这一点上,我只想找到一些有用的东西(this和this,虽然不需要阅读,但当前的问题应该简单得多)。
我想要创建一个在子目录上工作的make任务,其子文件的数量是动态的(未知的)。你能用make做这个吗?
build/%.js: $(shell find apps/% -type f -name '*.js')
假设您希望最终目录树看起来如下所示:
build/
build/page.js
build/popup.js
apps/
apps/page/
apps/page/index.js
apps/page/lib/
apps/page/lib/a.js
apps/page/lib/b.js
apps/popup/
apps/popup/index.js
当您更改任何index.js
文件或嵌套在lib/*.js
中的文件时,对应的文件夹应该重新生成。
你怎么用make
做到这一点呢?如果您有一堆类似的构建任务,而不是枯燥的,那么不需要重复,这是很简单的。
我也尝试过这样做:
build/%.js: apps/%/index.js apps/%/lib/*.js
但是,只有在每个项目中都存在一个lib/*.js
时,这才有效。上面的示例目录树中的“弹出”项目没有这个功能,所以它从不构建。
因此,基本上,这些目标必须是“可选的”。一个简单的例子是:
build.js: $(shell find apps -type f -name '*.js')
如果build.js
文件夹中的任何*.js
文件发生更改,就会创建apps/
文件。基本上,这就是我想要的,主要的区别是我想要有一个变量名:
build/%.js: $(shell find apps/% -type f -name '*.js')
但是这不起作用,因为%
似乎没有在$(shell)
函数中进行评估(不确定它应该如何工作,或者在什么地方有文档)。但本质上,这就是我想做的。
这个是可能的吗?
发布于 2014-08-27 21:09:58
您可以为每个与build/%.js
“手动”匹配的目标定义prereqs,并且仍然保留通用的build/%.js
目标规则来构建它们。
APPS := $(subst apps/,,$(wildcard apps/*))
TARGETS := $(patsubst %,build/%.js,$(APPS))
all: $(TARGETS)
# Add prerequisites (based on $(wildcard) output) to each target file.
$(foreach app,$(APPS),$(eval build/$(app).js: $(wildcard apps/$(app)/lib/*.js)))
build/%.js: apps/%/index.js
@echo 'Building $@ from $^'
https://stackoverflow.com/questions/25540996
复制相似问题