# example, ../.. for two levels deep.
#
# 2. DIRS - A list of subdirectories to be built. Fake targets are set up
-# so that each of the targets "all", "install", and "clean" each build.
-# the subdirectories before the local target.
+# so that each of the targets "all", "install", and "clean" each build
+# the subdirectories before the local target. DIRS are guaranteed to be
+# built in order.
#
-# 3. Source - If specified, this sets the source code filenames. If this
+# 3. PARALLEL_DIRS - A list of subdirectories to be built, but that may be
+# built in any order. All DIRS are built in order before PARALLEL_DIRS are
+# built, which are then built in any order.
+#
+# 4. Source - If specified, this sets the source code filenames. If this
# is not set, it defaults to be all of the .cpp, .c, .y, and .l files
# in the current directory. Also, if you want to build files in addition
# to the local files, you can use the ExtraSource variable
#
#ENABLE_OPTIMIZED = 1
+
+# Figure out how to do platform specific stuff on this platform. This is really
+# gross and should be autoconfiscated (automake actually), but should hopefully
+# work on Linux and solaris (SunOS).
+#
+UNAME := $(shell uname)
+include $(LEVEL)/Makefile.$(UNAME)
+
ifdef SHARED_LIBRARY
# if SHARED_LIBRARY is specified, the default is to build the dynamic lib
dynamic ::
PROFILE =
endif
+# Allow gnu extensions...
+CPPFLAGS += -D_GNU_SOURCE
+
# -Wno-unused-parameter
CompileCommonOpts := $(PROFILE) -Wall -W -Wwrite-strings -Wno-unused -I$(LEVEL)/include
LinkG := $(Link) -g -L $(LIBDEBUG)
LinkO := $(Link) -O3 -L $(LIBRELEASE)
-# Create a .so file from a .o files...
-#MakeSO := $(CXX) -shared $(PROFILE)
-MakeSO := $(CXX) -G $(PROFILE)
-MakeSOO := $(MakeSO) -O3
-
# Create one .o file from a bunch of .o files...
Relink = ld -r
+# MakeSO - Create a .so file from a .o files...
+MakeSO := $(CXX) $(MakeSharedObjectOption) $(PROFILE)
+MakeSOO := $(MakeSO) -O3
+
# Create dependancy file from CPP file, send to stdout.
Depend := $(CXX) -MM -I$(LEVEL)/include $(CPPFLAGS)
#---------------------------------------------------------
-# Handle the DIRS option
+# Handle the DIRS and PARALLEL_DIRS options
#---------------------------------------------------------
-ifdef DIRS # Only do this if we're using DIRS!
+all install clean ::
+ $(VERB) for dir in ${DIRS}; do \
+ (cd $$dir; $(MAKE) $@) || exit 1; \
+ done
-all :: $(addsuffix /.makeall , $(DIRS))
-install :: $(addsuffix /.makeinstall, $(DIRS))
-clean :: $(addsuffix /.makeclean , $(DIRS))
+# Handle PARALLEL_DIRS
+ifdef PARALLEL_DIRS
+all :: $(addsuffix /.makeall , $(PARALLEL_DIRS))
+install :: $(addsuffix /.makeinstall, $(PARALLEL_DIRS))
+clean :: $(addsuffix /.makeclean , $(PARALLEL_DIRS))
-%/.makeall %/.makeclean %/.makeinstall:
+%/.makeall %/.makeinstall %/.makeclean:
$(VERB) cd $(@D); $(MAKE) $(subst $(@D)/.make,,$@)
+
endif
#---------------------------------------------------------
ifdef LIBRARYNAME
+# Make sure there isn't any extranous whitespace on the LIBRARYNAME option
+LIBRARYNAME := $(strip $(LIBRARYNAME))
+
LIBNAME_O := $(LIBRELEASE)/lib$(LIBRARYNAME).so
LIBNAME_G := $(LIBDEBUG)/lib$(LIBRARYNAME).so
LIBNAME_AO := $(LIBRELEASE)/lib$(LIBRARYNAME).a
$(VERB) rm -f $(TOOLEXENAMES)
$(TOOLEXENAME_G): $(ObjectsG) $(USED_LIB_PATHS_G) $(BUILD_ROOT_TOP)/tools/Debug/.dir
+ @echo ======= Linking $(TOOLNAME) debug executable =======
$(VERB) $(LinkG) -o $@ $(ObjectsG) $(USED_LIBS_OPTIONS_G) $(TOOLLINKOPTS)
$(TOOLEXENAME_O): $(ObjectsO) $(USED_LIB_PATHS_O) $(BUILD_ROOT_TOP)/tools/Release/.dir
+ @echo ======= Linking $(TOOLNAME) release executable =======
$(VERB) $(LinkO) -o $@ $(ObjectsG) $(USED_LIBS_OPTIONS_O) $(TOOLLINKOPTS)
endif