2017-01-10 62 views
0

設置的所有路徑,我有兩個文件(從樹命令)以下。在Makefile中,如何使文件通配符功能工作由變量VPATH

. 
|-- Makefile 
|-- dir1 
| `-- file1.c 
`-- dir2 
    `-- file2.c 

我想在DIR1和DIR2目錄編譯文件,所以我寫了一個Makefile如下。

VPATH = dir1:dir2 
CFILES := ${wildcard *.v} 
$(info CFILES = ${CFILES}) 

輸出:

CFILES = 

所以wildcar功能不會自動搜索由VPATH變量設置路徑。
如果我專門寫通配符功能的路徑,它的工作原理。

CFILES := ${wildcard dir1/*.c dir2/*.c} <== this makes it work 
$(info CFILES = ${CFILES}) 

輸出:

CFILES = dir1/file1.c dir2/file2.c 

我想只添加到Makefile中存在的路徑,但沒有辦法,我可以使用通配符功能通過VPATH設置路徑的任何方式? (假設我需要從編譯列表中刪除一些文件,所以我需要的文件列表。只是好奇..)

+0

它看起來像你不能。詳情在這裏http://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make –

回答

0

您可以使用make的文本轉換功能,把一個目錄列表到你想要的通配符命令。看看GNU Make manual,他們甚至在他們的例子中使用提取VPATH的目錄。考慮類似於:

$(wildcard $(addsuffix /*.c,$(subst :, ,$(VPATH)) 

由於您通過通配符獲取文件的完整路徑,因此似乎不需要使用VPATH。恕我直言,VPATH是一個壞主意,精心設計的構建系統不使用它。

還要考慮你想,如果具有相同名稱的文件出現在不同的目錄中,以發生什麼!