Chapter 7. Portable Makefiles
What do we mean by a portable makefile? As an
extreme example, we want a makefile that runs
without change on any system that GNU
make runs on. But this is virtually impossible due
to the enormous variety in operating systems. A more reasonable
interpretation is a makefile that is easy to
change for each new platform it is run on. An important added
constraint is that the port to the new system does not break support
for the previous platforms.
We can achieve this level of
portability for
makefiles using the same techniques as
traditional programming: encapsulation and abstraction. By using
variables and user-defined functions we can encapsulate applications
and algorithms. By defining variables for command-line arguments and
parameters, we can abstract out elements that vary from platform to
platform from elements that are constant.
You then have to determine what tools each platform offers to get
your job done, and what to use from each platform. The extreme in
portability is to use only those tools and features that exist on all
platforms of interest. This is typically called the
"least common denominator" approach
and obviously can leave you with very primitive functionality to work
with.
Another version of the least common denominator approach is to choose
a powerful set of tools and make sure to bring it with you to every
platform, thus guaranteeing that the commands you invoke in the
makefile work exactly the same everywhere. This
can be hard to pull off, both administratively and in terms of
getting your organization to cooperate with your fiddling with their
systems. But it can be successful, and I'll show one
example of that later with the Cygwin package for Windows. As
you'll see, standardizing on tools does not solve
every problem; there are always operating system differences to deal
with.
Finally, you can accept differences between systems and work around
them by careful choices of macros and functions.
I'll show this approach in this chapter, too.
So, by judicious use of variables and user-defined functions, and by
minimizing the use of exotic features and relying on standard tools,
we can increase the portability of our
makefiles. As noted previously, there is no such
thing as perfect portability, so it is our job to balance effort
versus portability. But before we explore specific techniques,
let's review some of the issues of portable
makefiles.
|