bug-make
[Top][All Lists]
Advanced

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

Re: include should be relative to current Makefile


From: Edward Welbourne
Subject: Re: include should be relative to current Makefile
Date: Wed, 16 May 2012 10:21:11 +0200

> ifndef TOP
>
> include ../Makefile
>
> else
>
> SUBDIRS = <yadda yadda>
> TARGETS = <list of things>
> SRCS = <etc etc>
>
> endif
>
> All of the complexity you allude to can be safely buried in the TOP-level
> Makefiles,

I can't help but think this is an entirely upside-down approach.  You
appear to be expecting context's make-file to supply values for the SRCS
and SUBDIRS of the module, which should surely be the master source for
that information.  When sub-module foo is under separate version control
from the rest, this is particularly important: the source list may
change from one release of foo to the next - the parent shouldn't need
to care - that's *why* it includes a make fragment from the sub-module.

The parent should tell the module things like where to stick its
generated files, what compilation options to enable (ideally at an
abstract level, DEBUGSYMS=YES rather than CFLAGS=-g, so that components
can adapt to the language they're actually in), but it shouldn't be the
place for details internal to the module - so that it is, in fact,
modular.

As I described previously, the robust way to do non-recursive make is to
have a config.mk in each component, that says the things that clients of
that component need to know in order to build it, for inclusion by
client make-files.  You can optionally have a Makefile in each component
that it makes sense to build "autonomously" - it also includes
config.mk, of course, while setting general options suitable for its
use.

FOOSRC ?= .
FOOGEN ?= $(FOOSRC)/gen

FOOSUB = $(patsubst %,$(FOOSRC)/%,<yadda yadda>)
FOOTGT = $(patsubst %,$(FOOGEN)/%,<list of things>)
FOOFILE = $(patsubst %,$(FOOSRC)/%,<etc etc>)

ifeq (NO/,$(WARNINGS)/$(filter -w,$(LFLAGS)))
LFLAGS += -w
endif # configure lex

MODULES += $(FOOSUB)
TARGETS += $(FOOTGT)
SOURCES += $(FOOFILE)
include $(FOOSUB:%=%/config.mk)

It involves making module-specific details clear - but, if you don't do
that, your make fragment isn't actually useful to the client make-files
anyway, as they need to know your source (and sub-module) lists, which
they shouldn't need to do.

        Eddy.



reply via email to

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