你能在Make中使用$ inside(shell find)吗?

时间:2014-08-28 04:56:34

标签: unix path makefile dry

此时我想找到一些有用的东西(thisthis,虽然不需要阅读,但这个当前的问题应该更加简单。)

我想创建一个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}}记录)。但基本上,这就是我想做的一切。

这可能吗?

1 个答案:

答案 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 $^'
相关问题