首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >您能在Make中使用$(shell find)中的%吗?

您能在Make中使用$(shell find)中的%吗?
EN

Stack Overflow用户
提问于 2014-08-28 04:56:33
回答 1查看 24关注 0票数 0

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

我想要创建一个在子目录上工作的make任务,其子文件的数量是动态的(未知的)。你能用make做这个吗?

代码语言:javascript
代码运行次数:0
运行
复制
build/%.js: $(shell find apps/% -type f -name '*.js')

假设您希望最终目录树看起来如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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做到这一点呢?如果您有一堆类似的构建任务,而不是枯燥的,那么不需要重复,这是很简单的。

我也尝试过这样做:

代码语言:javascript
代码运行次数:0
运行
复制
build/%.js: apps/%/index.js apps/%/lib/*.js

但是,只有在每个项目中都存在一个lib/*.js时,这才有效。上面的示例目录树中的“弹出”项目没有这个功能,所以它从不构建。

因此,基本上,这些目标必须是“可选的”。一个简单的例子是:

代码语言:javascript
代码运行次数:0
运行
复制
build.js: $(shell find apps -type f -name '*.js')

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

代码语言:javascript
代码运行次数:0
运行
复制
build/%.js: $(shell find apps/% -type f -name '*.js')

但是这不起作用,因为%似乎没有在$(shell)函数中进行评估(不确定它应该如何工作,或者在什么地方有文档)。但本质上,这就是我想做的。

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-28 05:09:58

您可以为每个与build/%.js“手动”匹配的目标定义prereqs,并且仍然保留通用的build/%.js目标规则来构建它们。

代码语言:javascript
代码运行次数:0
运行
复制
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 $^'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25540996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档