2008-10-30 148 views
13

我有一個makefile模板來編譯單個DLL(用於插件系統)。 用戶的makefile文件看起來是這樣的:如何檢查文件是否存在於生成文件

EXTRA_SRCS=file1 file2 
include makefile.in 

makefile.in我:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

哪裏plugin.os是主要的C++文件進行編譯。順便說一句,結尾的文件是.os是編譯爲共享庫的目標文件(使用即-fpic選項與gcc

現在的問題是,額外的資源將可能(但不是必須)頭文件。理想情況下,我想將它們添加爲目標plugin.osfile.cpp的依存關係,但僅限於它們存在。

該方法應該適用於Windows和Linux,或者至少適用於每個。但是,我只使用make的GNU版本。

回答

18

使用 「通配符」 功能:

$(wildcard *.h) 

編輯:以匹配特定的列表,請

$(wildcard $(HEADER_FILES)) 

沒有必要使用$(過濾器...)通配符函數會自動過濾不存在​​的文件。

+0

這不是我想要的...我有一個特定的.h文件列表來測試... – PierreBdR 2008-10-30 14:50:32

+0

沒關係,你不需要使用通配符。使用$(通配符$(HEADER_FILES)) – JesperE 2008-10-31 11:11:14

4

您沒有指定您正在使用的編譯器,但是如果您有權訪問gcc/g ++,則可以使用-MM選項。

我所做的是爲每個.c或.cpp文件創建一個擴展名爲.d的文件,然後「包含」.d文件。我用這樣的事情在我的Makefile:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

我然後創建依賴這樣的:

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

,這在Makefile的底部:

include $(DEPS) 

是這個你要去做什麼樣的行爲?這種方法的優點在於,即使您使用非GNU編譯器進行實際編譯,GNU編譯器也可以很好地計算依賴關係。

+0

我寧願避免makeflie一代......但謝謝! – PierreBdR 2008-10-30 16:48:19

2

是否簡單

$(filter $(wildcard *.h),$(HEADER_FILES)) 

你想要做什麼?