help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: only run submake if that submake needs to be run?


From: David Boyce
Subject: Re: only run submake if that submake needs to be run?
Date: Fri, 20 Aug 2004 14:33:21 -0400

At 01:53 PM 8/20/2004, David Wuertele wrote:
The reason I chose recursive in the first place was for a couple of
reasons:

1.  I want to be able to run make in the sub-directory and have it
    work

2.  I want to use the same variable namespace for all the makefiles.
    For example, I don't want one of my users to have to create
    variable names like:

      my_program_OBJ := this.o that.o

    I want them to be able to write:

      OBJ := this.o that.o

    This is an oversimplified example for the purposes of making the
    point.  I want them to be able to copy their neighbor's Makefile
    and not have to change all the variable names.

Is there a way to write makefiles in a non-recursive fashion that will
enable me to acheive both goals?

I've had success with a circular-include design. E.g. there's a Makefile per directory, just like in the recursive model. Each Makefile includes the "base makefile", and the base makefile in turn includes all subtree Makefiles (this takes a bit of macro/ifdef logic to prevent infinite include loops). The net result is a single logical Makefile accessible via a different physical "entry point" in each subdir.

This preserves two of the major benefits of the recursive model: (1) the user can simply type "make" in any directory (as opposed to "make -f ../../../Makefile") and (2) a developer adding a new source file need only modify the Makefile in the same dir, which usually is just a list of object files, without having to delve into the arcanities of the full build system.

Since slashes are a legal part of a variable name in make, I tend to prefix local variables with the subdir path, e.g. "my/sub/dir_OBJS=obj1.o obj2.o". At the time I did this it had to be compatible with GNU make 3.75 or so; it's quite possible that newer versions offer help with generating unique names, similar to what Noel Yap mentioned.

Though the ability of a non-recursive system to detect and deal with out-of-dateness in other parts of the tree is generally considered a feature, a colleague subsequently added a feature such that "make local" would build only objects local to the cwd and thus emulate recursive behavior.

-David Boyce





reply via email to

[Prev in Thread] Current Thread [Next in Thread]