你能在makefile中做$(通配符%/ ** / * .c)吗?

时间:2014-08-28 01:58:27

标签: unix makefile wildcard

作为this question的后续行动,我还有一个案例可以在几个小时的修修补丁中找到答案。

这是makefile目前的样子:

output = $(shell find lib -type f -name '*build.js' -or -name '*build.css')
myth = ./node_modules/.bin/myth
duo = ./node_modules/.bin/duo

build: $(output)

%/build/build.js: %/index.js %/lib/*.js node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.js > '$@'

%/build/build.css: %/index.css %/lib/*.css node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.css | $(myth) > '$@'

node_modules: package.json
  @n 0.11.13
  @npm install
  @touch node_modules # make sure folder is updated later than package.json

我在其他问题的最佳答案之上添加的内容是%/lib/*.js%/lib/*.css就在这里:

%/build/build.js: %/index.js %/lib/*.js node_modules component.json

如果您拥有所有必需的文件,那似乎工作正常,这意味着目录结构如下所示:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/page/lib/
lib/page/lib/a.js
lib/page/lib/b.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

使用当前的make任务,如果更改该文件夹中的文件,它将重建正确的子项目/文件夹(页面/弹出/等)。但是,如果您缺少其中一个依赖项,则不会重建

例如,在以下文件夹结构中,"弹出"子项目将构建正常(因为它仍然具有所有必需的目标依赖项)。然而,"页"子项目无法构建,因为它缺少任何%/lib/*.js个文件:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

因此,在这种情况下,它构建的唯一方法是,如果您同时拥有%/index.js和某个匹配%/lib/*.js的文件。

我的问题是,你如何让它适用于这两种情况?

基本上我想要的是重建一个子项目,如果除了build / build.js 中的任何文件发生变化。也就是说,如果任何文件已更改与目标名称不匹配,则运行该任务。

你是怎么做到的?

我试过这个:

%/build/build.js: %/**/*.js node_modules component.json

但是这出错了:

make: Circular lib/page/build/build.js <- lib/page/build/build.js dependency dropped.

因为它与目标名称匹配。

似乎也可以使用$(filter pattern, text)$(filter-out, pattern, text),但我还没有成功。

%/build/build.js: $(filter-out %/build/build.js, %/**/*.js) node_modules component.json

这似乎可能包含与%/**/*.js匹配的所有文件(如果存在,则为lib/page/index.jslib/page/lib/a.js),并且只排除lib/page/build/build.js。但是,我没有运气,也许我只是错误地使用它。

你如何让这个工作?

0 个答案:

没有答案