I have about the same approach for inter-dependant libraries in Jail's Makefile, which is here: http://tinyurl.com/69dyfI have a make file environment which builds objects, shared libraries and executable programs, using a non-recursive top-level make, following suggestions from Peter Miller's paper and Emile van Bergen's examples.
When a make file for a program is included, a variable is created which lists the libraries that the program is dependent on. When a make file for a library is included, a variable is created which lists any other libraries that this library is dependent on.
These variables are used to define dependency information for make, but also to allow a list of '-l<lib>' options to be constructed for the final link step (for the program).
Basically, I have a module.mk file in each of the library's directories that adds to a <library_name>_SRC variable. I transform that to a set of object files like this:
# determine the object files
define OBJ_template
$(1)_OBJ := $$(patsubst %.c,$(1)/%.lo,$$(filter %.c,$$($(1)_SRC))) \
$$(patsubst %.y,$(1)/%.lo,$$(filter %.y,$$($(1)_SRC))) \
$$(patsubst %.cc,$(1)/%.lo,$$(filter %.cc,$$($(1)_SRC))) \
$$(patsubst %.l,$(1)/%.lo,$$(filter %.l,$$($(1)_SRC)))
OBJ += $$($(1)_OBJ)
endef
$(foreach mod,$(MODULES),$(eval $(call OBJ_template,$(mod))))and define inter-library dependencies in a separate link.mk file. The link.mk file (generated by a bootstrap script) contains an entry for each library I can make:
libreplace.la : $(libreplace_OBJ)
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^libarch.la : $(arch_OBJ)
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^libmemory.la : $(libmemory_OBJ) libarch.la
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^libcontain.la : $(libcontain_OBJ) libmemory.la libarch.la
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^libconf.la : $(libconf_OBJ) libcontain.la libmemory.la libarch.la
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^libthread.la : $(libthread_OBJ) libmemory.la libarch.la
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^Which ones are actually compiled depends on my real_all target,
real_all : $(patsubst %,%.la,$(LTLIBRARIES))
in which LTLIBRARIES depends on the directories found by the bootstrap script.
This works for me: all I have to do to compile is $ bash bootstrap $ mkdir .build $ cd .build $ ../configure $ make
The bootstrap scripts takes care of generating the link.mk file and fills in some of the gaps in Makefile.in.in; configure converts Makefile.in (generated from Makefile.in.in by bootstrap) to Makefile filling in the last gaps..
I could probably add the inter-library dependencies to a <library_name>_DEPS variable in the module.mk files and have the link.mk file simply contain
<library_name>.la : $(<library_name>_OBJ) $(<library_name>_DEPS), in which case I probably wouldn't need a link.mk file anymore (as an $(eval) could create that part too) but I haven't pushed it that far yet..
HTH
rlc
_______________________________________________ Help-make mailing list [EMAIL PROTECTED] http://lists.gnu.org/mailman/listinfo/help-make
