如何检查文件是否存在于生成文件

问题描述:

我有一个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版本。

使用 “通配符” 功能:

$(wildcard *.h) 

编辑:以匹配特定的列表,请

$(wildcard $(HEADER_FILES)) 

没有必要使用$(过滤器...)通配符函数会自动过滤不存在​​的文件。

+0

这不是我想要的...我有一个特定的.h文件列表来测试... – PierreBdR 2008-10-30 14:50:32

+0

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

您没有指定您正在使用的编译器,但是如果您有权访问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

是否简单

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

你想要做什么?