2016-04-25 66 views
0

给出一个Makefile前提过滤器生成文件的先决条件

PY_FILES := $(shell find . -type f -name *.py) 

my_target: $(PY_FILES) 
    do_something $(PY_FILES) 

是否可以调用do_something在它的一个子集,即排除如与模式匹配的所有Python文件*/test/*

我的理解是,$(filter-out pattern, text)可以做类似的事情,但模式必须是我想要排除的文件列表。

在这种情况下,我还可以find-not并将结果保存到另一个前提条件,这是我试图避免的 - 我想重用PY_FILES prereq。

+0

'pattern'必须是* pattern *与您想要排除的文件相匹配。不幸的是,make模式只支持单个通配符元素,所以你不能'$(过滤掉)'容易匹配'*/test/*'的模式。正如你所指出的那样,你可以很容易地忽略那些带有find的东西。 –

回答

0

有没有很好的内置方式来匹配*/test/*风格模式与内置插件。模式匹配并不是那么复杂。

你可以尝试这样的事情,但是在find处分割文件的时间可能会更好,并且最终会变得更有用。

define testfilter 
    $(foreach f,$1,$(if $(findstring /test/,$f),,$f)) 
endef 

my_target: $(PY_FILES) 
     do_something $(call testfilter,$(PY_FILES)) 
+0

@ComeRaczy感谢您的捅,但使用'$(if)'比重新过滤更简单。 –