你能在Make中使用%inner$(shell查找)吗



在这一点上,我只想找到一些有效的东西(这个和这个,不需要阅读,这个当前的问题应该简单得多)。

我想创建一个在子目录上工作的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')

如果apps/文件夹中的任何*.js文件发生更改,则会创建一个build.js文件。基本上,这就是我想要的,主要的区别是我想要一个变量名

build/%.js: $(shell find apps/% -type f -name '*.js')

但这不起作用,因为%似乎没有在$(shell)函数中进行评估(不确定它应该如何工作,也不确定它在哪里被记录)。但本质上,这就是我想要做的

这可能吗?

您可以"手动"定义与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 $^'

最新更新