Hi,

If the following proposal is new, please let me know whether I am
sending it to the right place (would help-make@gnu.org be better?).

As pointed out in "Recursive Make Considered Harmful," information
about dependencies is not visible across makefiles.

But couldn't GNU make have a facility for exposing this information?
This would solve most of the problems with recursive make.

What I have in mind is a "module" directive that's like "include," 
with two differences:

(a) it corrects for the fact that targets, prereqs, and commands
    in the included makefile should be interpreted relative to a
    different working directory.  

(b) it keeps the variable namespaces separate.

Example:

+-- child/Makefile --------
| 
| var = kid
| foo: bar
|       echo $(var)
| clean: 
|       rm *.o

+-- Makefile --------------
|
| module child/Makefile, ch-
|
| var = parent
| target: child/foo
|      echo $(ch-var), $(var)

has basically the same effect as

+---------------------------
|
| ch-var = kid
| child/foo: child/bar  # uses dir of module's makefile (rel. or abs.)
|       cd child; echo $(ch-var)  # uses namespace prefix from module directive
| child/clean: 
|       cd child; rm *.o
| 
| var = parent
| target: child/foo
|      echo $(ch-var), $(var)   

Advantages:

- the child makefile can still be written and run as a standalone.

- the parent makefile can see and analyze all the dependencies in the
  child makefile.  It uses the child makefile to ensure that child/foo
  is up to date, and rebuilds target ONLY IF child/foo needed
  updating.

- to speed up makes for large projects, it may be possible to perform
  the include processing lazily (I'm not convinced of that, though).

Notes: 

- To avoid accidental name conflicts, an unambiguous namespace qualifier
  would be preferable to the simple namespace prefix suggested above.

- It should be okay for two makefiles to use each other as modules.
  This allows you to partition your work however you want across
  multiple makefiles (within one directory or across directories).

  This is not possible by a naive implementation as a munged include
  (because of recursion) but seems straightforward enough to support
  in principle.

  Ideally, it would allow the user to write arbitrarily deep variable 
  names:
    $(module1-module2-module1-module2-var):

Regards,

Jason Eisner
Assistant Professor of Computer Science
Johns Hopkins University


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to