此时我想找到一些有用的东西(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
时才有效。 " popup"
所以基本上,这些目标必须是"可选"。一个简单的例子就是:
build.js: $(shell find apps -type f -name '*.js')
如果{em> build.js
文件夹中的任何 *.js
文件发生更改,那么会创建apps/
文件。基本上这就是我想要的,主要区别在于我想要一个变量名:
build/%.js: $(shell find apps/% -type f -name '*.js')
但这并不起作用,因为似乎%
内部$(shell)
函数未被评估(不确定该如何工作或在哪里?{s}}记录)。但基本上,这就是我想做的一切。
这可能吗?
答案 0 :(得分:1)
您可以为每个匹配build/%.js
"手动"匹配的目标定义先决条件并且仍然保留常见的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 $^'