I am going over this tutorial and it has something like this
# File names EXEC = run SOURCES = $(wildcard *.cpp) OBJECTS = $(SOURCES:.cpp=.o) ..... %.o: $(SRCPATH)/%.cpp $(INC) $(CC) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
I am not sure if I understand the document and would appreciate it if someone could explain the last two statements. Here are my three questions regarding Makefile
Question 1 :
Whats the difference between
SOURCES = $(wildcard *.cpp)
and
SOURCES = $(*.cpp)
It says that the second case only works if .cpp files exist since they do not therefore it wont work. My question is why does the first one work ?
Question 2:
What does the 'wildcard *'
mean ?
what does the last statement OBJECTS = $(SOURCES:.cpp=.o)
mean ?
Question 3:
What does %.o mean when it is placed as a target ? Whats the difference between
*.o
, %.o
and wildcard *.cpp
Advertisement
Answer
SOURCES = $(*.cpp) SOURCES = *.cpp SOURCES = $(wildcard *.cpp)
The first one is an error, the second expands too late (not on definition), the third searches for all files with suffix .cpp in the source directories.
The builtin-function wildcard
is used to force wildcard-expansion where it does not naturally occur.
OBJECTS = $(SOURCES:.cpp=.o)
That means OBJECTS
is assigned the value of SOURCES
, after substituting every .cpp
at the end of an item with .o
.
And %.o
as a target means you are defining a rule for creating .o
s from something else.
References: GNU make manual
See here for a good basic makefile: https://stackoverflow.com/a/26579143