How to check if a file exists in a makefile

不打扰是莪最后的温柔 提交于 2019-12-04 16:26:42

问题


I have a makefile template to compile a single DLL (for a plugin system). The makefile of the user looks like this:

EXTRA_SRCS=file1 file2
include makefile.in

In the makefile.in I have:

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

Where plugin.os is the main C++ file to be compiled. Btw, the files ending is .os are the object files compiled for shared library (i.e. using the -fpic option with gcc)

Now, the problem is that the extra sources will probably (but not necessarily) be header files. Ideally I would like to add them as dependencies for the target plugin.os and the file.cpp, but only if they exist.

The method should work for both windows and linux, or at least be adaptable to each. However, I only use the GNU version of make.


回答1:


Use the "wildcard" function:

$(wildcard *.h)

EDIT: in order to match a specific list, do

$(wildcard $(HEADER_FILES))

There is no need to use $(filter ...), the wildcard function automatically filters files which don't exist.




回答2:


You didn't specify what compiler(s) you are using, but if you have access to gcc/g++ you can use the -MM option.

What I do is create a file with the extension of .d for every .c or .cpp file, and then "include" the .d files. I use something like this in my Makefile:

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

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

I then create the dependencies like this:

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

and this at the bottom of the Makefile:

include $(DEPS)

Is this the kind of behavior you're going for? The beauty of this method is that even if you're using a non-GNU compiler for actual compiling, the GNU compilers do a good job of calculating the dependencies.




回答3:


Does the simple

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

do what you want?



来源:https://stackoverflow.com/questions/250082/how-to-check-if-a-file-exists-in-a-makefile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!