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

时间:2015-04-23 02:57:32

标签: makefile

我正在为复杂目录结构中包含大量js文件的项目编写Makefile。运行时,它需要对每个文件执行一些编译,并将结果保存到具有相同树结构的不同目录(现在由cp模拟)。当我运行make js时,它会按原样构建,当我再次运行make js时,它表示没有工作要做。但是,当我修改其中一个文件并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)

1 个答案:

答案 0 :(得分:1)

class MyList(list): def __init__(self, xs): super(MyList, self).__init__() for x in xs: # Assign all values of xs to the list object ``self`` self.append(x) 行正在将$(BUILT_RAWJSFILES): $(RAWJSFILES)每个文件的先决条件设置为所有 $(BUILT_RAWJSFILES)中的文件。

要获得所需的一对一映射,您需要一个模式规则或静态模式规则。

此外,嵌入式python代码片段 它正在删除包含$(RAWJSFILES)$@中任何字符BUILDDIR的{​​{1}}值的最长前导前缀(仅作为字符串而不是字符,因此它等同于build/gui/)。 (哦,你也不需要lstrip('/iugdlb'),你已经在shell上下文中,所以正常的命令替换也可以正常工作($(shell)。)

如果您使用模式或静态模式规则,那么您可以使用更简单的方法来获取源文件名,然后像这样搞乱python。

这样的事情应该有效(未经测试):

$$(python ...)