Makefile将重建所有文件,即使只有一个文件发生更改

Makefile将重建所有文件,即使只有一个文件发生更改,makefile,Makefile,我正在为一个项目编写一个Makefile,该项目在复杂的目录结构中包含大量js文件。运行时,它需要对每个文件执行一些编译,并将结果保存到具有相同树结构的不同目录中(现在由cp模拟)。当我运行makejs时,它会按它应该的方式构建,当我再次运行makejs时,它会说没有工作要做。但是,当我修改其中一个文件并make js时,它会重新构建整个树,而不仅仅是修改后的文件 SHELL := /bin/bash BUILDDIR := build/gui/ RAWJSFILES := $(shell f

我正在为一个项目编写一个Makefile,该项目在复杂的目录结构中包含大量js文件。运行时,它需要对每个文件执行一些编译,并将结果保存到具有相同树结构的不同目录中(现在由
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)