|
Suffix Rules
It becomes tedious to tell make
how to invoke the compiler for every single cpp file in your project,
when you know it’s the same basic process each time. Since make is
designed to be a time-saver, it also has a way to abbreviate actions, as long as
they depend on file name suffixes. These abbreviations are called
suffix rules. A suffix rule
is the way to teach make how to convert a file with one type of extension
(.cpp, for example) into a file with another type of extension
(.obj or .exe). Once you teach make the rules for producing
one kind of file from another, all you have to do is tell make which
files depend on which other files. When make finds a file with a date
earlier than the file it depends on, it uses the rule to create a new file.
The suffix rule tells make that it
doesn’t need explicit rules to build everything, but instead it can figure
out how to build things based on their file extension. In this case it says
“To build a file that ends in exe from one that ends in cpp,
invoke the following command.” Here’s what it looks like for the
example above:
CPP = mycompiler
.SUFFIXES: .exe .cpp
.cpp.exe:
$(CPP) $<
The
.SUFFIXES directive tells
make that it should watch out for any of the following file-name
extensions because they have special meaning for this particular makefile. Next
you see the suffix rule .cpp.exe, which says “Here’s how to
convert any file with an extension of cpp to one with an extension of
exe” (when the cpp file is more recent than the exe
file). As before, the $(CPP) macro is used, but then you see something
new: $<. Because this begins with a
‘$’ it’s a macro, but this is one of
make’s special built-in macros. The $< can be used only
in suffix rules, and it means “whatever prerequisite triggered the
rule” (sometimes called the dependent), which in this case
translates to “the cpp file that needs to be
compiled.”
Once the suffix rules have been set up,
you can simply say, for example, “make Union.exe,” and the
suffix rule will kick in, even though there’s no mention of
“Union” anywhere in the makefile.
|
|