2016-04-25 68 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)'比重新過濾更簡單。 –