As was mentioned here earlier, a patch of mine that reworks and rationalises 
the OpenAFS build system was recently committed to master. This patch has 
pretty far ranging implications for how Makefile rules for OpenAFS are written, 
so I thought it might be worth publicising it here.

The initial impetus for the patch was to solve Phil Moore's problem of not 
being able to override CFLAGS and LDFLAGS, but it turned into a pretty wide 
ranging rationalisation of our build system.

The first rule of build club is that you should never override any of the 
'user' variables - CC, LDFLAGS, or CFLAGS. These are for the user to modify 
configure's settings. Instead, alternative variables have been provided to 
customise the build system on a per directory basis ...

OpenAFS has three different build types on Unix - LWP, pthread and 
shared-library. The build system now provides the following variables:

LWP_CFLAGS      PTH_CFLAGS      SHD_CFLAGS
LWP_LDFLAGS     PTH_LDFLAGS     SHD_LDFLAGS

These can be used to create rules which are specific to a particular build 
type. However, our normal model
is to have an entire directory build with a particular build type. In this 
case, you should include either

src/config/Makefile.lwp
src/config/Makefile.pthread
src/config/Makefile.shared

in your Makefile. Each of these files define an AFS_CCRULE and AFS_LDRULE which 
can be simply used to build
a target. For example:

bar.o: foo.c
        $(AFS_CCRULE) foo.c
baz.o: baz.c
        $(AFS_CCRULE) baz.c
bar: bar.o baz.o
        $(AFS_LDRULE) bar.o

The first thing to note here is that you don't have to specify the target - 
that's automatically derived from the build rule. We don't automatically derive 
the source, because we can't do that in a portable manner that also permits 
dependencies to be specified. The use of $? is discouraged for this reason.

The second thing is that you don't have to supply anything beyond the build 
rule. All of the standard compiler options are embedded within the CCRULE.

The third thing is that all of these headers have a .c.o suffix rule. So, the 
'baz.o' target above is actually unnecessary, and the same results can be 
obtained with:

bar.o: foo.c
        $(AFS_CCRULE) foo.c
bar: bar.o baz.o
        $(AFS_LDRULE) bar.o baz.o

CFLAGS can be overriden on a per target basis by setting the CFLAGS_<object> 
variable. For example, to build baz.o with -DFUBAR, you can simply do ...

CFLAGS_baz.o = -DFUBAR
bar.o: foo.c
        $(AFS_CCRULE) foo.c
bar: bar.o baz.o
        $(AFS_LDRULE) bar.o baz.o

The mechanism for disabling warnings-as-errors for a particular file then 
becomes:
CFLAGS_bar.o = @CFLAGS_NOERROR@

If you wish to override CFLAGS for a whole module, simply set MODULE_CFLAGS in 
your Makefile

And that's pretty much it. I suspect that more refinement will come over the 
coming weeks ...

Comments? Brickbats?

S.

_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to