Add support for the new PARALLEL_DIRS option
[oota-llvm.git] / Makefile.common
index 8e298946adbee101761dc4b03aaced26a5c941cb..5beeaa7ca737bc015b2e60ee96dae8945432ff39 100644 (file)
 #    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
@@ -46,6 +51,14 @@ include $(LEVEL)/Makefile.config
 #
 #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 ::
@@ -118,6 +131,9 @@ else
 PROFILE =
 endif
 
+# Allow gnu extensions...
+CPPFLAGS += -D_GNU_SOURCE
+
 # -Wno-unused-parameter
 CompileCommonOpts := $(PROFILE) -Wall -W  -Wwrite-strings -Wno-unused -I$(LEVEL)/include
 
@@ -136,14 +152,13 @@ endif
 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) 
 
@@ -164,17 +179,23 @@ ObjectsG = $(addprefix $(BUILD_ROOT)/Debug/,$(Objs))
 
 
 #---------------------------------------------------------
-# 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
 
 #---------------------------------------------------------
@@ -196,6 +217,9 @@ 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
@@ -304,9 +328,11 @@ clean::
        $(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