Makefile将重建所有文件,即使只有一个文件发生更改
我正在为一个项目编写一个Makefile,该项目在复杂的目录结构中包含大量js文件。运行时,它需要对每个文件执行一些编译,并将结果保存到具有相同树结构的不同目录中(现在由Makefile将重建所有文件,即使只有一个文件发生更改,makefile,Makefile,我正在为一个项目编写一个Makefile,该项目在复杂的目录结构中包含大量js文件。运行时,它需要对每个文件执行一些编译,并将结果保存到具有相同树结构的不同目录中(现在由cp模拟)。当我运行makejs时,它会按它应该的方式构建,当我再次运行makejs时,它会说没有工作要做。但是,当我修改其中一个文件并make js时,它会重新构建整个树,而不仅仅是修改后的文件 SHELL := /bin/bash BUILDDIR := build/gui/ RAWJSFILES := $(shell f
cp
模拟)。当我运行makejs
时,它会按它应该的方式构建,当我再次运行makejs
时,它会说没有工作要做。但是,当我修改其中一个文件并make js
时,它会重新构建整个树,而不仅仅是修改后的文件
SHELL := /bin/bash
BUILDDIR := build/gui/
RAWJSFILES := $(shell find app -name '*.js')
BUILT_RAWJSFILES := $(patsubst %, $(BUILDDIR)%,$(RAWJSFILES))
$(BUILDDIR):
mkdir -p $(BUILDDIR)
$(RAWJSFILES): $(BUILDDIR)
$(BUILT_RAWJSFILES): $(RAWJSFILES)
mkdir -p $(@D)
# compile step
cp $(shell python -c "print '$@'.lstrip('${BUILDDIR}')") $(@D)
.PHONY: js
js: $(BUILT_RAWJSFILES)
行$(builded\u RAWJSFILES):$(RAWJSFILES)
将$(builded\u RAWJSFILES)
中每个文件的先决条件设置为所有$(RAWJSFILES)
中的文件
要获得所需的一对一映射,需要一个模式规则或静态模式规则
另外,嵌入的python代码片段根本没有完成您希望它在那里完成的任务。它正在从包含BUILDDIR
中任何字符的$@
值中删除最长的前导前缀,即build/gui/
(不作为字符串作为字符,因此相当于lstrip('/iugdlb')
)。(哦,您也不需要$(shell)
这里您已经在shell上下文中,因此正常的命令替换也可以正常工作($(python…
)
也就是说,如果您使用模式或静态模式规则,那么您将有更简单的方法来获取源文件名,然后再像那样处理python
类似的方法应该可以工作(未经测试):
啊,谢谢你澄清这一点!你的例子也完全符合广告的要求。
$(BUILDDIR)%.js: %.js
mkdir -p $(@D)
cp $^ $(@D)