如何检查makefile中是否存在文件

Pie*_*BdR 15 testing makefile compilation file gnu-make

我有一个makefile模板来编译单个DLL(对于插件系统).用户的makefile如下所示:

EXTRA_SRCS=file1 file2
include makefile.in
Run Code Online (Sandbox Code Playgroud)

makefile.in我有:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Run Code Online (Sandbox Code Playgroud)

plugin.os要编译的主要C++文件在哪里.顺便说一句,文件结尾是.os为共享库编译的目标文件(即使用-fpic选项gcc)

现在,问题是额外的源可能(但不一定)是头文件.理想情况下,我想将它们添加为目标plugin.os和它们的依赖项file.cpp,但前提是它们存在.

该方法应适用于Windows和Linux,或至少适用于每个.但是,我只使用了GNU版本的make.

Jes*_*erE 19

使用"通配符"功能:

$(wildcard *.h)
Run Code Online (Sandbox Code Playgroud)

编辑:为了匹配特定的列表,做

$(wildcard $(HEADER_FILES))
Run Code Online (Sandbox Code Playgroud)

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


m0j*_*0j0 5

您没有指定要使用的编译器,但是如果可以访问gcc / g ++,则可以使用-MM选项。

我要做的是为每个.c或.cpp文件创建一个扩展名为.d的文件,然后“包含” .d文件。我在我的Makefile中使用了以下内容:

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
Run Code Online (Sandbox Code Playgroud)

然后,我像这样创建依赖项:

C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
Run Code Online (Sandbox Code Playgroud)

这是在Makefile的底部:

include $(DEPS)
Run Code Online (Sandbox Code Playgroud)

这是您要采取的行为吗?这种方法的优点在于,即使您使用非GNU编译器进行实际编译,GNU编译器也可以很好地计算依赖关系。