A Cursory Look at Makefiles
New to Makefiles? At best they’re confusing, and at worst completely incomprehensible. Here’s a dissection of a simple Makefile.
structure
The basic format of a Makefile follows this:
<targets> : <dependencies>
<commands>
Where multiple entries will make up a larger Makefile. A simple
Makefile to compile a helloworld.c program might look something like
this:
helloworld.o : helloworld.c
gcc -o helloworld.o helloworld.c
The target is helloworld.o, and it depends on having
helloworld.c. Running the following command:
$ make helloworld.o
Will cause gcc to be run as specified in the Makefile.
practical makefiles
Developing a Makefile that might actually be used in a smallish software project involves a bit more work. Generally speaking, the project will consist of several — in this case — .c files, which will need to be linked in interesting ways against each other.
%, $@, and $^ are all special variables. Here’s how they might be used:
%.o : %.c
gcc -o $@ $^
The % grabs the matching string from the target and applies it to
the dependency. If the target is foo.h, the Makefile will search for
foo.c. The next variable, $@, grabs whatever file matched the
target. Likewise, %^ grabs the file(s) that matched the dependency.
Thus running
$ make helloworld.o
will, as above, run gcc -o helloworld.o helloworld.c. The %
operator will match “helloworld”, the $@ grabs
helloworld.o, and the $^ grabs helloworld.c.
Most Makefiles will also define some standard targets, such as
clean:
clean :
rm -f *.o
That covers the basics. For additional resources on Makefiles check out:
- The GNU make page.
- GNU make overview.
- The Wikipedia entry.