我正在为复杂目录结构中包含大量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)
答案 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 ...)