【问题标题】:Can you use the % inside $(shell find) in Make?你可以在 Make 中使用 $(shell find) 中的 % 吗?
【发布时间】:2014-08-28 04:56:33
【问题描述】:

在这一点上,我只想找到一些有用的东西(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 如何做到这一点?无需重复,如果您有一堆类似的非 DRY 构建任务,这很简单。

我也试过这个:

build/%.js: apps/%/index.js apps/%/lib/*.js

但这只有在每个项目中都存在lib/*.js 时才有效。上面示例目录树中的“弹出”项目没有,因此它永远不会构建。

所以基本上,这些目标需要是“可选的”。一个简单的例子是这样的:

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

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

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

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

这可能吗?

【问题讨论】:

    标签: unix path makefile dry


    【解决方案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 $^'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2016-12-01
      • 2010-09-23
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多