ifdef SHARED_LIBRARY
# if SHARED_LIBRARY is specified, the default is to build the dynamic lib
all:: dynamic
+install:: install-dynamic-library
endif
ifdef BYTECODE_LIBRARY
# if BYTECODE_LIBRARY is specified, the default is to build the bytecode lib
all:: bytecodelib
-install:: bytecodelib-install
+install:: install-bytecode-library
endif
# Default Rule: Make sure it's also a :: rule
###########################################################################
.SUFFIXES:
.SUFFIXES: .c .cpp .h .hpp .y .l
-.SUFFIXES: .lo .o .a .so .bc .td
+.SUFFIXES: .lo .o .a $(SHLIBEXT) .bc .td
.SUFFIXES: .ps .dot .d
#
# slightly since GNU Make will not try to find implicit rules for targets
# which are marked as Phony.
#
-.PHONY: all dynamic bytecodelib bytecodelib-install
+.PHONY: all dynamic bytecodelib install-bytecode-library
.PHONY: clean distclean install test bytecode prdirs
###########################################################################
# Variables derived from configuration options...
#--------------------------------------------------------------------
-#BinInstDir=/usr/local/bin
-#LibInstDir=/usr/local/lib/xxx
-#DocInstDir=/usr/doc/xxx
-
BURG_OPTS = -I
ifdef ENABLE_PROFILING
#--------------------------------------------------------------------------
# Utilities used while building the LLVM tree, which live in the utils dir
#
-BURG := $(LLVMTOOLCURRENT)/burg
-RunBurg := $(BURG) $(BURG_OPTS)
-TBLGEN := $(LLVMTOOLCURRENT)/tblgen
+BURG := $(LLVMTOOLCURRENT)/burg
+RunBurg := $(BURG) $(BURG_OPTS)
+TBLGEN := $(LLVMTOOLCURRENT)/tblgen
+LGCCLDPROG := $(LLVMTOOLCURRENT)/gccld
#--------------------------------------------------------------------------
# The LLVM GCC front-end in C and C++ flavors
#
LLVMGCC := PATH=$(LLVMTOOLCURRENT):$(PATH) $(LLVMGCCDIR)/bin/gcc
-LCC1 := $(LLVMGCCDIR)/libexec/gcc/$(LLVMGCCARCH)/cc1
LLVMGXX := PATH=$(LLVMTOOLCURRENT):$(PATH) $(LLVMGCCDIR)/bin/g++
-LCC1XX := $(LLVMGCCDIR)/libexec/gcc/$(LLVMGCCARCH)/cc1plus
#--------------------------------------------------------------------------
# Some of the compiled LLVM tools which are used for compilation of runtime
# Pull in limit macros from stdint.h, even in C++:
CPPFLAGS += -D__STDC_LIMIT_MACROS
-CompileWarnings := -Wall -W -Wwrite-strings -Wno-unused
-CompileCommonOpts := $(CompileWarnings) -fshort-enums
+### FIXME: this is GCC specific
+CPPFLAGS += -DDEPRECATED='__attribute__ ((deprecated))'
+
+CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused
CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions
#
DependC := $(CC) -MM -I$(LEVEL)/include $(CPPFLAGS)
# Archive a bunch of .o files into a .a file...
-AR = ${AR_PATH} cq
+AR = $(AR_PATH) cr
#----------------------------------------------------------
#
ifndef Source
Source := $(notdir $(ExtraSource) $(wildcard $(SourceDir)/*.cpp \
- $(SourceDir)/*.c $(SourceDir)/*.y $(SourceDir)/*.l))
+ $(SourceDir)/*.cc $(SourceDir)/*.c $(SourceDir)/*.y \
+ $(SourceDir)/*.l))
endif
#
# Libtool Objects
#
Srcs := $(sort $(basename $(Source)))
-Objs := $(addsuffix .lo, $(Srcs))
-ObjectsO := $(addprefix $(BUILD_OBJ_DIR)/Release/,$(Objs))
-ObjectsP := $(addprefix $(BUILD_OBJ_DIR)/Profile/,$(Objs))
-ObjectsG := $(addprefix $(BUILD_OBJ_DIR)/Debug/,$(Objs))
-ObjectsBC := $(addprefix $(BUILD_OBJ_DIR)/BytecodeObj/,$(addsuffix .bc, $(Srcs)))
+ObjectsO := $(Srcs:%=$(BUILD_OBJ_DIR)/Release/%.lo)
+ObjectsP := $(Srcs:%=$(BUILD_OBJ_DIR)/Profile/%.lo)
+ObjectsG := $(Srcs:%=$(BUILD_OBJ_DIR)/Debug/%.lo)
+ObjectsBC := $(Srcs:%=$(BUILD_OBJ_DIR)/BytecodeObj/%.bc)
#
# The real objects underlying the libtool objects
#---------------------------------------------------------
ifdef DIRS
-all install clean test bytecode ::
+all install clean test bytecode stripped-bytecode::
$(VERB) for dir in ${DIRS}; do \
+ if [ ! -f $$dir/Makefile ]; \
+ then \
+ $(MKDIR) $$dir; \
+ cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \
+ fi; \
($(MAKE) -C $$dir $@) || exit 1; \
done
endif
clean :: $(addsuffix /.makeclean , $(PARALLEL_DIRS))
test :: $(addsuffix /.maketest , $(PARALLEL_DIRS))
bytecode :: $(addsuffix /.makebytecode, $(PARALLEL_DIRS))
-
-%/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode:
- $(VERB) $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@)
+stripped-bytecode :: $(addsuffix /.makestripped-bytecode, $(PARALLEL_DIRS))
+
+%/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode %/.makestripped-bytecode:
+ $(VERB) if [ ! -f $(@D)/Makefile ]; \
+ then \
+ $(MKDIR) $(@D); \
+ cp $(SourceDir)/$(@D)/Makefile $(@D)/Makefile; \
+ fi; \
+ $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@)
endif
# Handle directories that may or may not exist
ifdef OPTIONAL_DIRS
-all install clean test bytecode ::
+all install clean test bytecode stripped-bytecode::
$(VERB) for dir in ${OPTIONAL_DIRS}; do \
- if [ -d $$dir ]; \
+ if [ -d $(SourceDir)/$$dir ]; \
then\
+ if [ ! -f $$dir/Makefile ]; \
+ then \
+ $(MKDIR) $$dir; \
+ cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \
+ fi; \
($(MAKE) -C$$dir $@) || exit 1; \
fi \
done
# of it. For this reason, sometimes it's useful to use libraries as .a files.
###########################################################################
+# Install rule for making bytecode library directory if it does not exist.
+# Trigger this by making libraries that need to be installed here depend on it.
+$(DESTDIR)$(bytecode_libdir):
+ $(MKDIR) $@
+
ifdef LIBRARYNAME
# Make sure there isn't any extranous whitespace on the LIBRARYNAME option
LIBRARYNAME := $(strip $(LIBRARYNAME))
-LIBNAME_O := $(DESTLIBRELEASE)/lib$(LIBRARYNAME).so
-LIBNAME_P := $(DESTLIBPROFILE)/lib$(LIBRARYNAME).so
-LIBNAME_G := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).so
+LIBNAME_O := $(DESTLIBRELEASE)/lib$(LIBRARYNAME)$(SHLIBEXT)
+LIBNAME_P := $(DESTLIBPROFILE)/lib$(LIBRARYNAME)$(SHLIBEXT)
+LIBNAME_G := $(DESTLIBDEBUG)/lib$(LIBRARYNAME)$(SHLIBEXT)
+LIBNAME_CUR := $(DESTLIBCURRENT)/lib$(LIBRARYNAME)$(SHLIBEXT)
LIBNAME_AO := $(DESTLIBRELEASE)/lib$(LIBRARYNAME).a
LIBNAME_AP := $(DESTLIBPROFILE)/lib$(LIBRARYNAME).a
LIBNAME_AG := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).a
+LIBNAME_ACUR := $(DESTLIBCURRENT)/lib$(LIBRARYNAME).a
LIBNAME_OBJO := $(DESTLIBRELEASE)/$(LIBRARYNAME).o
LIBNAME_OBJP := $(DESTLIBPROFILE)/$(LIBRARYNAME).o
LIBNAME_OBJG := $(DESTLIBDEBUG)/$(LIBRARYNAME).o
+LIBNAME_OBJCUR := $(DESTLIBCURRENT)/$(LIBRARYNAME).o
LIBNAME_BC := $(DESTLIBBYTECODE)/lib$(LIBRARYNAME).bc
+
#--------------------------------------------------------------------
# Library Targets
# Modify the top level targets to build the desired libraries.
#--------------------------------------------------------------------
# dynamic target builds a shared object version of the library...
-dynamic:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).so
+dynamic:: $(LIBNAME_CUR)
bytecodelib:: $(LIBNAME_BC)
-bytecodelib-install:: $(LLVMGCCDIR)/bytecode-libs/lib$(LIBRARYNAME).bc
+install-bytecode-library:: $(DESTDIR)$(bytecode_libdir)/lib$(LIBRARYNAME).bc
-$(LLVMGCCDIR)/bytecode-libs/lib$(LIBRARYNAME).bc: $(LIBNAME_BC)
+$(DESTDIR)$(bytecode_libdir)/lib$(LIBRARYNAME).bc: $(LIBNAME_BC) $(DESTDIR)$(bytecode_libdir)
@${ECHO} ======= Installing $(LIBRARYNAME) bytecode library =======
cp $< $@
# Does the library want a .o version built?
ifndef DONT_BUILD_RELINKED
-all:: $(DESTLIBCURRENT)/$(LIBRARYNAME).o
+all:: $(LIBNAME_OBJCUR)
+install:: install-single-object-library
endif
# Does the library want an archive version built?
ifdef BUILD_ARCHIVE
-all:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).a
+all:: $(LIBNAME_ACUR)
+install:: install-archive-library
endif
#--------------------------------------------------------------------
$(VERB) $(LIBTOOL) --mode=install $(INSTALL) $*.la $(DESTLIBCURRENT)
@${ECHO} ======= Finished building $(LIBRARYNAME) dynamic debug library =======
+install-dynamic-library: $(LIBNAME_CUR)
+ $(MKDIR) $(DESTDIR)$(libdir)
+ $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_CUR) $(DESTDIR)$(libdir)/lib$(LIBRARYNAME)$(SHLIBEXT)
+
#
# Rules for building static archive libraries.
#
$(VERB) $(Link) -g $(STRIP) -o $@ $(ObjectsG) $(LibSubDirs) -static
@${ECHO} ======= Finished building $(LIBRARYNAME) archive debug library =======
+install-archive-library: $(LIBNAME_ACUR)
+ $(MKDIR) $(DESTDIR)$(libdir)
+ $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_ACUR) $(DESTDIR)$(libdir)/lib$(LIBRARYNAME).a
#
# Rules for building .o libraries.
@${ECHO} "Linking `basename $@`"
$(VERB) $(Relink) -o $@ $(RObjectsG) $(LibSubDirs)
-endif
+install-single-object-library: $(LIBNAME_OBJCUR)
+ $(MKDIR) $(DESTDIR)$(libdir)
+ $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_OBJCUR) $(DESTDIR)$(libdir)/$(LIBRARYNAME).o
-#------------------------------------------------------------------------
-# Create a TAGS database for emacs
-#------------------------------------------------------------------------
-
-ifneq ($(ETAGS),false)
-ifeq ($(LEVEL), .)
-SRCDIRS := $(wildcard $(SourceDir)/include $(SourceDir)/lib $(SourceDir)/tools)
-
-tags:
- $(ETAGS) -l c++ `find $(SRCDIRS) -name '*.cpp' -o -name '*.h'`
-all:: tags
-endif
-else
-tags:
- ${ECHO} "Cannot build $@: The program etags is not installed"
endif
#------------------------------------------------------------------------
$(VERB) $(LinkP) -o $@ $(ObjectsP) $(LIB_OPTS_P) $(LINK_OPTS) $(LIBS)
@${ECHO} ======= Finished building $(TOOLNAME) profile executable =======
+install:: $(TOOLEXENAMES)
+ $(MKDIR) $(DESTDIR)$(bindir)
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) -c -m 0755 $(TOOLEXENAMES) $(DESTDIR)$(bindir)/$(TOOLNAME)
+
endif
$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.cpp $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LCC1XX)
@${ECHO} "Compiling `basename $<` to bytecode"
- $(VERB) $(LLVMGXX) $(CompileWarnings) $(CPPFLAGS) -c $< -o $@
+ $(VERB) $(LLVMGXX) $(CompileCommonOpts) $(CPPFLAGS) -c $< -o $@
$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.c $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LCC1)
@${ECHO} "Compiling `basename $<` to bytecode"
- $(VERB) $(LLVMGCC) $(CompileWarnings) $(CPPFLAGS) -c $< -o $@
+ $(VERB) $(LLVMGCC) $(CompileCommonOpts) $(CPPFLAGS) -c $< -o $@
$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.ll $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LLVMAS)
@${ECHO} "Compiling `basename $<` to bytecode"
$(VERB) $(RM) -rf $(BUILD_OBJ_DIR)/Debug $(BUILD_OBJ_DIR)/Release
$(VERB) $(RM) -rf $(BUILD_OBJ_DIR)/Profile $(BUILD_OBJ_DIR)/Depend
$(VERB) $(RM) -rf $(BUILD_OBJ_DIR)/BytecodeObj
- $(VERB) $(RM) -f core core.[0-9][0-9]* *.o *.d *.so *~ *.flc
+ $(VERB) $(RM) -f core core.[0-9][0-9]* *.o *.d *~ *.flc
+ifneq ($(strip $(SHLIBEXT)),) # Extra paranoia - make real sure SHLIBEXT is set
+ $(VERB) $(RM) -f *$(SHLIBEXT)
+endif
$(VERB) $(RM) -f $(LEX_OUTPUT) $(YACC_OUTPUT)
###########################################################################
# build tree.
Makefile :: $(BUILD_SRC_DIR)/Makefile
@${ECHO} "===== Updating Makefile from source dir: `dirname $<` ====="
+ $(MKDIR) $(@D)
cp -f $< $@
#