我有一个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.os
和file.cpp
的依赖项,但仅限于它们存在。
该方法应该适用于Windows和Linux,或者至少适用于每种方法。但是,我只使用了GNU版本的make。
答案 0 :(得分:19)
使用“通配符”功能:
$(wildcard *.h)
编辑:为了匹配特定列表,请执行
$(wildcard $(HEADER_FILES))
没有必要使用$(filter ...),通配符函数会自动过滤不存在的文件。
答案 1 :(得分:5)
您没有指定正在使用的编译器,但是如果您可以访问gcc / g ++,则可以使用-MM选项。
我所做的是为每个.c或.cpp文件创建扩展名为.d的文件,然后“包含”.d文件。我在Makefile中使用这样的东西:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
然后我创建了这样的依赖项:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
,这位于Makefile的底部:
include $(DEPS)
这是你要采取的行为吗?这种方法的优点在于,即使您使用非GNU编译器进行实际编译,GNU编译器也能很好地计算依赖关系。
答案 2 :(得分:3)
是否简单
$(filter $(wildcard *.h),$(HEADER_FILES))
做你想做的事吗?