X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Makefile.rules;h=393ce48d07b6ca60abf88b8e3500b869eebe37d6;hb=85c08351cec796d541c18435c6e6c0edec343e93;hp=4b2ecde43679006f5c06cef4bc90be5be2b0e790;hpb=1ddb6b61ea5973aa097088ef1be35625b91956a2;p=oota-llvm.git diff --git a/Makefile.rules b/Makefile.rules index 4b2ecde4367..393ce48d07b 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -1,9 +1,16 @@ -#===-- Makefile.common - Common make rules for LLVM -------*- makefile -*--==== +#===-- Makefile.rules - Common make rules for LLVM ---------*- Makefile -*--===# +# +# The LLVM Compiler Infrastructure +# +# This file was developed by the LLVM research group and is distributed under +# the University of Illinois Open Source License. See LICENSE.TXT for details. +# +#===------------------------------------------------------------------------===# # # This file is included by all of the LLVM makefiles. This file defines common -# rules to do things like compile a .cpp file or generate dependancy info. -# These are platform dependant, so this is the file used to specify these -# system dependant operations. +# rules to do things like compile a .cpp file or generate dependency info. +# These are platform dependent, so this is the file used to specify these +# system dependent operations. # # The following functionality can be set by setting incoming variables. # The variable $(LEVEL) *must* be set: @@ -32,9 +39,6 @@ # # 6. LLVM_SRC_ROOT - If specified, points to the top of the LLVM source tree. # -# 7. LLVM_OBJ_ROOT - If specified, points to the top directory where LLVM -# object files are placed. -# # 8. BUILD_SRC_DIR - The directory which contains the current set of Makefiles # and usually the source code too (unless SourceDir is set). # @@ -46,89 +50,14 @@ # placed. # # For building, -# LLVM, LLVM_SRC_ROOT = BUILD_SRC_ROOT, and -# LLVM_OBJ_ROOT = BUILD_OBJ_ROOT. +# LLVM, LLVM_SRC_ROOT = BUILD_SRC_ROOT # #===-----------------------------------------------------------------------==== # -# Configuration file to set paths specific to local installation of LLVM -# -include $(LEVEL)/Makefile.config - -########################################################################### -# Directory Configuration -# This section of the Makefile determines what is where. To be -# specific, there are several locations that need to be defined: -# -# o LLVM_SRC_ROOT : The root directory of the LLVM source code. -# o LLVM_OBJ_ROOT : The root directory containing the built LLVM code. -# -# o BUILD_SRC_DIR : The directory containing the code to build. -# o BUILD_SRC_ROOT : The root directory of the code to build. -# -# o BUILD_OBJ_DIR : The directory in which compiled code will be placed. -# o BUILD_OBJ_ROOT : The root directory in which compiled code is placed. -# -########################################################################### - -# -# Set the source build directory. That is almost always the current directory. -# -ifndef BUILD_SRC_DIR -BUILD_SRC_DIR = $(shell pwd) -endif - -# -# Set the source root directory. -# -ifndef BUILD_SRC_ROOT -BUILD_SRC_ROOT = $(shell cd $(BUILD_SRC_DIR)/$(LEVEL); pwd) -endif - -# -# Determine the path of the source tree relative from $HOME (the mythical -# home directory). -# -HOME_OBJ_ROOT := $(OBJ_ROOT)$(patsubst $(HOME)%,%,$(BUILD_SRC_ROOT)) - -# -# Set the object build directory. Its location depends upon the source path -# and where object files should go. -# -ifndef BUILD_OBJ_DIR -ifeq ($(OBJ_ROOT),.) -BUILD_OBJ_DIR = $(BUILD_SRC_DIR) -else -BUILD_OBJ_DIR := $(HOME_OBJ_ROOT)$(patsubst $(BUILD_SRC_ROOT)%,%,$(BUILD_SRC_DIR)) -endif -endif - -# -# Set the root of the object directory. +# Set the VPATH so that we can find source files. # -ifndef BUILD_OBJ_ROOT -ifeq ($(OBJ_ROOT),.) -BUILD_OBJ_ROOT = $(BUILD_SRC_ROOT) -else -BUILD_OBJ_ROOT := $(HOME_OBJ_ROOT) -endif -endif - -# -# Set the LLVM source directory. -# It is typically the root directory of what we're compiling now. -# -ifndef LLVM_SRC_ROOT -LLVM_SRC_ROOT := $(BUILD_SRC_ROOT) -endif - -# -# Set the LLVM object directory. -# -ifndef LLVM_OBJ_ROOT -LLVM_OBJ_ROOT := $(BUILD_OBJ_ROOT) -endif +VPATH=$(SourceDir) ########################################################################### # Default Targets: @@ -136,15 +65,20 @@ endif # building. ########################################################################### +# Ensure people re-run configure when it gets updated +all::$(LLVM_OBJ_ROOT)/config.status + 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 +install-bytecode:: install-bytecode-library endif # Default Rule: Make sure it's also a :: rule @@ -159,23 +93,36 @@ test:: # Default rule for building only bytecode. bytecode:: +# Default rule for installing only bytecode. +install-bytecode:: + # Print out the directories used for building prdirs:: - echo "Home Offset : " $(HOME_OBJ_ROOT) - echo "Build Source Root: " $(BUILD_SRC_ROOT) - echo "Build Source Dir : " $(BUILD_SRC_DIR) - echo "Build Object Root: " $(BUILD_OBJ_ROOT) - echo "Build Object Dir : " $(BUILD_OBJ_DIR) - echo "LLVM Source Root: " $(LLVM_SRC_ROOT) - echo "LLVM Object Root: " $(LLVM_OBJ_ROOT) + @${ECHO} "Build Source Root: " $(BUILD_SRC_ROOT) + @${ECHO} "Build Source Dir : " $(BUILD_SRC_DIR) + @${ECHO} "Build Object Root: " $(BUILD_OBJ_ROOT) + @${ECHO} "Build Object Dir : " $(BUILD_OBJ_DIR) + @${ECHO} "LLVM Source Root: " $(LLVM_SRC_ROOT) + @${ECHO} "LLVM Object Root: " $(LLVM_OBJ_ROOT) + +########################################################################### +# Suffixes and implicit rules: +# Empty out the list of suffixes, generate a list that is only +# used by this Makefile, and cancel useless implicit rules. This +# will hopefully speed up compilation a little bit. +########################################################################### +.SUFFIXES: +.SUFFIXES: .c .cpp .h .hpp .y .l +.SUFFIXES: .lo .o .a $(SHLIBEXT) .bc .td +.SUFFIXES: .ps .dot .d # # Mark all of these targets as phony. This will hopefully speed up builds # 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: clean cleandeps distclean install test bytecode prdirs +.PHONY: all dynamic bytecodelib install-bytecode-library +.PHONY: clean distclean install test bytecode prdirs ########################################################################### # Miscellaneous paths and commands: @@ -187,10 +134,6 @@ 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 @@ -212,11 +155,6 @@ ifdef ENABLE_PROFILING PROFILE = -pg endif -# -# Suffixes for library compilation rules -# -.SUFFIXES: .so - ########################################################################### # Library Locations: # These variables describe various library locations: @@ -230,7 +168,7 @@ endif DESTLIBDEBUG := $(BUILD_OBJ_ROOT)/lib/Debug DESTLIBRELEASE := $(BUILD_OBJ_ROOT)/lib/Release DESTLIBPROFILE := $(BUILD_OBJ_ROOT)/lib/Profile -DESTLIBBYTECODE := $(BUILD_OBJ_ROOT)/lib/Bytecode +DESTLIBBYTECODE := $(BUILD_OBJ_ROOT)/lib/BytecodeLibs DESTLIBCURRENT := $(BUILD_OBJ_ROOT)/lib/$(CONFIGURATION) # LLVM libraries used for linking @@ -272,7 +210,7 @@ PROJTOOLCURRENT := $(BUILD_OBJ_ROOT)/tools/$(CONFIGURATION) # # Libtool is found in the current directory. # -LIBTOOL := $(LLVM_SRC_ROOT)/mklib +LIBTOOL := $(LLVM_OBJ_ROOT)/mklib # # If we're not building a shared library, use the disable-shared tag with @@ -306,23 +244,37 @@ endif #-------------------------------------------------------------------------- # 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$(EXEEXT) +RunBurg := $(BURG) $(BURG_OPTS) +TBLGEN := $(LLVMTOOLCURRENT)/tblgen$(EXEEXT) +LGCCLDPROG := $(LLVMTOOLCURRENT)/gccld$(EXEEXT) #-------------------------------------------------------------------------- # The LLVM GCC front-end in C and C++ flavors # LLVMGCC := PATH=$(LLVMTOOLCURRENT):$(PATH) $(LLVMGCCDIR)/bin/gcc -LCC1 := $(LLVMGCCDIR)/lib/gcc-lib/$(LLVMGCCARCH)/cc1 LLVMGXX := PATH=$(LLVMTOOLCURRENT):$(PATH) $(LLVMGCCDIR)/bin/g++ -LCC1XX := $(LLVMGCCDIR)/lib/gcc-lib/$(LLVMGCCARCH)/cc1plus #-------------------------------------------------------------------------- -# Some of the compiled LLVM tools which are used for compilation of runtime -# libraries. -# -LLVMAS := $(LLVMTOOLCURRENT)/as +# The compiled LLVM tools +# + +LLVMAS := $(LLVMTOOLCURRENT)/llvm-as$(EXEEXT) +# Find the location of the platform specific LLVM GCC libraries +LLVMGCCLIBDIR=$(dir $(shell $(LLVMGCC) -print-file-name=libgcc.a)) +# LLVM Tool Definitions (LLVMGCC, LLVMGXX, LLVMAS are provided by +# Makefile.rules) +LLI = $(LLVMTOOLCURRENT)/lli$(EXEEXT) +LLC = $(LLVMTOOLCURRENT)/llc$(EXEEXT) +LGCCAS = $(LLVMTOOLCURRENT)/gccas$(EXEEXT) +LGCCLD = $(LGCCLDPROG) -L$(LLVMGCCLIBDIR) -L$(LLVMGCCDIR)/lib +LDIS = $(LLVMTOOLCURRENT)/llvm-dis$(EXEEXT) +LOPT = $(LLVMTOOLCURRENT)/opt$(EXEEXT) +LLINK = $(LLVMTOOLCURRENT)/llvm-link$(EXEEXT) +LPROF = $(LLVMTOOLCURRENT)/llvm-prof$(EXEEXT) +LANALYZE = $(LLVMTOOLCURRENT)/analyze$(EXEEXT) +LBUGPOINT = $(LLVMTOOLCURRENT)/bugpoint$(EXEEXT) +LLVMC = $(LLVMTOOLCURRENT)/llvmc$(EXEEXT) ########################################################################### @@ -333,7 +285,17 @@ LLVMAS := $(LLVMTOOLCURRENT)/as # Include both the project headers and the LLVM headers for compilation and # dependency computation. # -CPPFLAGS += -I$(BUILD_SRC_ROOT)/include -I$(LLVM_SRC_ROOT)/include +# BUILD_OBJ_DIR : Files local to the particular object directory +# (locallly generated header files). +# BUILD_SRC_DIR : Files local to the particular source directory. +# BUILD_SRC_ROOT/include : Files global to the project. +# LLVM_OBJ_ROOT/include : config.h files generated by autoconf +# LEVEL/include : config.h files for the project +# LLVM_SRC_ROOT/include : Files global to LLVM. +# +CPPFLAGS += -I$(BUILD_OBJ_DIR) -I$(BUILD_SRC_DIR) -I$(LLVM_OBJ_ROOT)/include \ + -I$(BUILD_SRC_ROOT)/include -I$(LEVEL)/include \ + -I$(LLVM_SRC_ROOT)/include # By default, strip symbol information from executable ifndef KEEP_SYMBOLS @@ -341,17 +303,19 @@ STRIP = $(PLATFORMSTRIPOPTS) STRIP_WARN_MSG = "(without symbols)" endif -# Allow gnu extensions... +# Allow GNU extensions: CPPFLAGS += -D_GNU_SOURCE +# Pull in limit macros from stdint.h, even in C++: +CPPFLAGS += -D__STDC_LIMIT_MACROS -CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused -I$(LEVEL)/include -CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions -fshort-enums +CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused +CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions # # Compile commands with libtool. # -Compile := $(LIBTOOL) --mode=compile $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(CompileCommonOpts) -CompileC := $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CCFLAGS) $(CompileCommonOpts) +Compile := $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(CompileCommonOpts) +CompileC := $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(CompileCommonOpts) # Compile a cpp file, don't link... CompileG := $(Compile) -g -D_DEBUG @@ -371,19 +335,26 @@ CompileCP := $(CompileC) $(CompileOptimizeOpts) $(PROFILE) # Link final executable # (Note that we always link with the C++ compiler). # -Link := $(LIBTOOL) --mode=link $(CXX) +Link := $(LIBTOOL) --tag=CXX --mode=link $(CXX) # link both projlib and llvmlib libraries LinkG := $(Link) -g -L$(PROJLIBDEBUGSOURCE) -L$(LLVMLIBDEBUGSOURCE) $(STRIP) LinkO := $(Link) -O3 -L$(PROJLIBRELEASESOURCE) -L$(LLVMLIBRELEASESOURCE) LinkP := $(Link) -O3 -L$(PROJLIBPROFILESOURCE) -L$(LLVMLIBPROFILESOURCE) $(PROFILE) -# Create one .o file from a bunch of .o files... -Relink := ${LIBTOOL} --mode=link $(CXX) -ifndef SHARED_LIBRARY -Relink += -only-static +# TOOLLINKOPTSB to pass options to the linker like library search path etc +# Note that this is different from TOOLLINKOPTS, these options +# are passed to the linker *before* the USEDLIBS options are passed. +# e.g. usage TOOLLINKOPTSB = -L/home/xxx/lib +ifdef TOOLLINKOPTSB +LinkG := $(LinkG) $(TOOLLINKOPTSB) +LinkO := $(LinkO) $(TOOLLINKOPTSB) +LinkP := $(LinkP) $(TOOLLINKOPTSB) endif +# Create one .o file from a bunch of .o files... +Relink := ${LIBTOOL} --tag=CXX --mode=link $(CXX) + # # Configure where the item being compiled should go. # @@ -395,12 +366,12 @@ ifdef TOOLNAME Link += -rpath $(DESTTOOLCURRENT) endif -# Create dependancy file from CPP file, send to stdout. +# Create dependency file from CPP file, send to stdout. Depend := $(CXX) -MM -I$(LEVEL)/include $(CPPFLAGS) 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 #---------------------------------------------------------- @@ -409,23 +380,24 @@ AR = ${AR_PATH} cq # The local Makefile can list other Source files via ExtraSource = ... # ifndef Source -Source := $(ExtraSource) $(wildcard *.cpp *.c *.y *.l) +Source := $(notdir $(ExtraSource) $(wildcard $(SourceDir)/*.cpp \ + $(SourceDir)/*.cc $(SourceDir)/*.c $(SourceDir)/*.y \ + $(SourceDir)/*.l)) endif # # Libtool Objects # -Srcs := $(sort $(notdir $(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)/Bytecode/,$(addsuffix .bc, $(Srcs))) +Srcs := $(sort $(basename $(Source))) +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 # -RObjs := $(sort $(patsubst Debug/%.o, %.o, $(addsuffix .o,$(notdir $(basename $(Source)))))) +RObjs := $(sort $(patsubst Debug/%.o, %.o, $(addsuffix .o,$(basename $(Source))))) RObjectsO := $(addprefix $(BUILD_OBJ_DIR)/Release/,$(RObjs)) RObjectsP := $(addprefix $(BUILD_OBJ_DIR)/Profile/,$(RObjs)) RObjectsG := $(addprefix $(BUILD_OBJ_DIR)/Debug/,$(RObjs)) @@ -435,9 +407,14 @@ RObjectsG := $(addprefix $(BUILD_OBJ_DIR)/Debug/,$(RObjs)) #--------------------------------------------------------- ifdef DIRS -all install clean cleandeps test bytecode :: +all install clean test bytecode stripped-bytecode install-bytecode:: $(VERB) for dir in ${DIRS}; do \ - (cd $$dir; $(MAKE) $@) || exit 1; \ + if [ ! -f $$dir/Makefile ]; \ + then \ + $(MKDIR) $$dir; \ + cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ + fi; \ + ($(MAKE) -C $$dir $@ $(MFLAGS)) || exit 1; \ done endif @@ -446,26 +423,52 @@ ifdef PARALLEL_DIRS all :: $(addsuffix /.makeall , $(PARALLEL_DIRS)) install :: $(addsuffix /.makeinstall , $(PARALLEL_DIRS)) clean :: $(addsuffix /.makeclean , $(PARALLEL_DIRS)) -cleandeps:: $(addsuffix /.makecleandeps, $(PARALLEL_DIRS)) test :: $(addsuffix /.maketest , $(PARALLEL_DIRS)) bytecode :: $(addsuffix /.makebytecode, $(PARALLEL_DIRS)) +stripped-bytecode :: $(addsuffix /.makestripped-bytecode, $(PARALLEL_DIRS)) +install-bytecode :: $(addsuffix /.makeinstall-bytecode, $(PARALLEL_DIRS)) -%/.makeall %/.makeinstall %/.makeclean %/.makecleandeps %/.maketest \ - %/.makebytecode: - $(VERB) cd $(@D); $(MAKE) $(subst $(@D)/.make,,$@) +%/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode %/.makestripped-bytecode %/.makeinstall-bytecode: + $(VERB) if [ ! -f $(@D)/Makefile ]; \ + then \ + $(MKDIR) $(@D); \ + cp $(SourceDir)/$(@D)/Makefile $(@D)/Makefile; \ + fi; \ + $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) $(MFLAGS) endif # Handle directories that may or may not exist ifdef OPTIONAL_DIRS -all install clean cleandeps test bytecode :: +all install clean test bytecode stripped-bytecode install-bytecode:: $(VERB) for dir in ${OPTIONAL_DIRS}; do \ - if [ -d $$dir ]; \ + if [ -d $(SourceDir)/$$dir ]; \ then\ - (cd $$dir; $(MAKE) $@) || exit 1; \ + if [ ! -f $$dir/Makefile ]; \ + then \ + $(MKDIR) $$dir; \ + cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ + fi; \ + ($(MAKE) -C$$dir $@ $(MFLAGS)) || exit 1; \ fi \ done endif +#--------------------------------------------------------- +# Handle the CONFIG_FILES options +#--------------------------------------------------------- +ifdef CONFIG_FILES +install:: install-config-files + +$(sysconfdir): + $(MKDIR) $(sysconfdir) + +install-config-files: $(sysconfdir) $(CONFIG_FILES) + $(VERB)$(ECHO) Installing Configuration Files To $(sysconfdir) + $(VERB)for file in $(CONFIG_FILES); do \ + $(INSTALL) $(SourceDir)/$${file} $(sysconfdir) ; \ + done +endif + ########################################################################### # Library Build Rules: # @@ -487,98 +490,128 @@ endif # 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).la +LIBNAME_P := $(DESTLIBPROFILE)/lib$(LIBRARYNAME).la +LIBNAME_G := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).la +LIBNAME_CUR := $(DESTLIBCURRENT)/lib$(LIBRARYNAME).la 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) - @echo ======= Installing $(LIBRARYNAME) bytecode library ======= - cp $< $@ +$(DESTDIR)$(bytecode_libdir)/lib$(LIBRARYNAME).bc: $(LIBNAME_BC) $(DESTDIR)$(bytecode_libdir) + @${ECHO} ======= Installing $(LIBRARYNAME) bytecode library ======= + $(VERB)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 #-------------------------------------------------------------------- # Rules for building libraries #-------------------------------------------------------------------- -LinkBCLib := $(LLVMGCC) -shared +LinkBCLib := $(LLVMGCC) -shared -nostdlib ifdef EXPORTED_SYMBOL_LIST LinkBCLib += -Xlinker -internalize-public-api-list=$(EXPORTED_SYMBOL_LIST) else + ifdef EXPORTED_SYMBOL_FILE +LinkBCLib += -Xlinker -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE) + else LinkBCLib += -Xlinker -disable-internalize + endif endif # Rule for building bytecode libraries. $(LIBNAME_BC): $(ObjectsBC) $(LibSubDirs) $(DESTLIBBYTECODE)/.dir - @echo ======= Linking $(LIBRARYNAME) bytecode library ======= + @${ECHO} Linking $(LIBRARYNAME) bytecode library $(VERB) $(LinkBCLib) -o $@ $(ObjectsBC) $(LibSubDirs) $(LibLinkOpts) + @${ECHO} ======= Finished building $(LIBRARYNAME) bytecode library ======= # # Rules for building dynamically linked libraries. # $(LIBNAME_O): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir - @echo ======= Linking $(LIBRARYNAME) dynamic release library ======= - $(VERB) $(Link) -o $*.la $(ObjectsO) $(LibSubDirs) $(LibLinkOpts) - $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $*.la $(DESTLIBCURRENT) + @${ECHO} Linking $(LIBRARYNAME) dynamic release library + $(VERB) $(Link) -o $@ $(ObjectsO) $(LibSubDirs) $(LibLinkOpts) + $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $@ $(DESTLIBCURRENT) + @${ECHO} ======= Finished building $(LIBRARYNAME) dynamic release library ======= $(LIBNAME_P): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir - @echo ======= Linking $(LIBRARYNAME) dynamic profile library ======= - $(VERB) $(Link) -o $*.la $(ObjectsP) $(LibSubDirs) $(LibLinkOpts) - $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $*.la $(DESTLIBCURRENT) + @${ECHO} Linking $(LIBRARYNAME) dynamic profile library + $(VERB) $(Link) -o $@ $(ObjectsP) $(LibSubDirs) $(LibLinkOpts) + $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $@ $(DESTLIBCURRENT) + @${ECHO} ======= Finished building $(LIBRARYNAME) dynamic profile library ======= $(LIBNAME_G): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir - @echo ======= Linking $(LIBRARYNAME) dynamic debug library ======= - $(VERB) $(Link) -o $*.la $(ObjectsG) $(LibSubDirs) $(LibLinkOpts) - $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $*.la $(DESTLIBCURRENT) + @${ECHO} Linking $(LIBRARYNAME) dynamic debug library + $(VERB) $(Link) -o $@ $(ObjectsG) $(LibSubDirs) $(LibLinkOpts) + $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $@ $(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) + $(VERB) $(LIBTOOL) --finish $(DESTDIR)$(libdir) # # Rules for building static archive libraries. # $(LIBNAME_AO): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir - @echo ======= Linking $(LIBRARYNAME) archive release library ======= - @$(RM) -f $@ + @${ECHO} Linking $(LIBRARYNAME) archive release library + $(VERB)$(RM) -f $@ $(VERB) $(Link) -03 -o $@ $(ObjectsO) $(LibSubDirs) -static + @${ECHO} Finished building $(LIBRARYNAME) archive release library ======= $(LIBNAME_AP): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir - @echo ======= Linking $(LIBRARYNAME) archive profile library ======= + @${ECHO} Linking $(LIBRARYNAME) archive profile library @$(RM) -f $@ $(VERB) $(Link) -03 $(PROFILE) -o $@ $(ObjectsP) $(LibSubDirs) -static + @${ECHO} ======= Finished building $(LIBRARYNAME) archive profile library ======= $(LIBNAME_AG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir - @echo ======= Linking $(LIBRARYNAME) archive debug library ======= + @${ECHO} Linking $(LIBRARYNAME) archive debug library @$(RM) -f $@ $(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. @@ -595,32 +628,21 @@ $(LIBNAME_AG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir # I think that is safe. # $(LIBNAME_OBJO): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir - @echo "Linking $@" + @${ECHO} "Linking `basename $@`" $(VERB) $(Relink) -o $@ $(RObjectsO) $(LibSubDirs) $(LIBNAME_OBJP): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir - @echo "Linking $@" + @${ECHO} "Linking `basename $@`" $(VERB) $(Relink) -o $@ $(RObjectsP) $(LibSubDirs) $(LIBNAME_OBJG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir - @echo "Linking $@" + @${ECHO} "Linking `basename $@`" $(VERB) $(Relink) -o $@ $(RObjectsG) $(LibSubDirs) -endif - -#------------------------------------------------------------------------ -# Create a TAGS database for emacs -#------------------------------------------------------------------------ +install-single-object-library: $(LIBNAME_OBJCUR) + $(MKDIR) $(DESTDIR)$(libdir) + $(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_OBJCUR) $(DESTDIR)$(libdir)/$(LIBRARYNAME).o -ifdef ETAGS -ifeq ($(LEVEL), .) -tags: - $(ETAGS) -l c++ `find include lib tools -name '*.cpp' -o -name '*.h'` -all:: tags -endif -else -tags: - ${ECHO} "Cannot build $@: The program etags is not installed" endif #------------------------------------------------------------------------ @@ -634,6 +656,13 @@ endif # ifdef TOOLNAME +# Handle compression libraries automatically +ifeq ($(HAVE_BZIP2),1) +TOOLLINKOPTS += -lbz2 +endif +ifeq ($(HAVE_ZLIB),1) +TOOLLINKOPTS += -lz +endif # TOOLEXENAME* - These compute the output filenames to generate... TOOLEXENAME_G := $(DESTTOOLDEBUG)/$(TOOLNAME) TOOLEXENAME_O := $(DESTTOOLRELEASE)/$(TOOLNAME) @@ -664,6 +693,11 @@ USED_LIB_PATHS_G := $(addprefix $(DESTLIBDEBUG)/, $(STATICUSEDLIBS)) USED_LIB_PATHS_O := $(addprefix $(DESTLIBRELEASE)/, $(STATICUSEDLIBS)) USED_LIB_PATHS_P := $(addprefix $(DESTLIBPROFILE)/, $(STATICUSEDLIBS)) +LLVMSTATICUSEDLIBS := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(LLVMLIBS))) +LLVM_LIB_PATHS_G := $(addprefix $(LLVMLIBDEBUGSOURCE)/, $(LLVMSTATICUSEDLIBS)) +LLVM_LIB_PATHS_O := $(addprefix $(LLVMLIBRELEASESOURCE)/, $(LLVMSTATICUSEDLIBS)) +LLVM_LIB_PATHS_P := $(addprefix $(LLVMLIBPROFILESOURCE)/, $(LLVMSTATICUSEDLIBS)) + # # Libtool link options: # Ensure that all binaries have their symbols exported so that they can @@ -685,61 +719,70 @@ all:: $(TOOLEXENAMES) clean:: $(VERB) $(RM) -f $(TOOLEXENAMES) -$(TOOLEXENAME_G): $(ObjectsG) $(USED_LIB_PATHS_G) $(DESTTOOLDEBUG)/.dir - @echo ======= Linking $(TOOLNAME) debug executable $(STRIP_WARN_MSG) ======= +$(TOOLEXENAME_G): $(ObjectsG) $(USED_LIB_PATHS_G) $(LLVM_LIB_PATHS_G) $(DESTTOOLDEBUG)/.dir + @${ECHO} Linking $(TOOLNAME) debug executable $(STRIP_WARN_MSG) $(VERB) $(LinkG) -o $@ $(ObjectsG) $(LIB_OPTS_G) $(LINK_OPTS) $(LIBS) + @${ECHO} ======= Finished building $(TOOLNAME) debug executable $(STRIP_WARN_MSG) ======= -$(TOOLEXENAME_O): $(ObjectsO) $(USED_LIB_PATHS_O) $(DESTTOOLRELEASE)/.dir - @echo ======= Linking $(TOOLNAME) release executable ======= +$(TOOLEXENAME_O): $(ObjectsO) $(USED_LIB_PATHS_O) $(LLVM_LIB_PATHS_O) $(DESTTOOLRELEASE)/.dir + @${ECHO} Linking $(TOOLNAME) release executable $(VERB) $(LinkO) -o $@ $(ObjectsO) $(LIB_OPTS_O) $(LINK_OPTS) $(LIBS) + @${ECHO} ======= Finished building $(TOOLNAME) release executable ======= -$(TOOLEXENAME_P): $(ObjectsP) $(USED_LIB_PATHS_P) $(DESTTOOLPROFILE)/.dir - @echo ======= Linking $(TOOLNAME) profile executable ======= +$(TOOLEXENAME_P): $(ObjectsP) $(USED_LIB_PATHS_P) $(LLVM_LIB_PATHS_P) $(DESTTOOLPROFILE)/.dir + @${ECHO} Linking $(TOOLNAME) profile executable $(VERB) $(LinkP) -o $@ $(ObjectsP) $(LIB_OPTS_P) $(LINK_OPTS) $(LIBS) + @${ECHO} ======= Finished building $(TOOLNAME) profile executable ======= + +install:: $(TOOLEXENAMES) + @${ECHO} Installing $(TOOLEXENAMES) to $(DESTDIR)$(bindir) + $(VERB)$(MKDIR) $(DESTDIR)$(bindir) + $(VERB)$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) -c -m 0755 $(TOOLEXENAMES) $(DESTDIR)$(bindir)/$(TOOLNAME) endif #--------------------------------------------------------- -.PRECIOUS: $(BUILD_OBJ_DIR)/Depend/.dir $(BUILD_OBJ_DIR)/Bytecode/.dir +.PRECIOUS: $(BUILD_OBJ_DIR)/Depend/.dir $(BUILD_OBJ_DIR)/BytecodeObj/.dir .PRECIOUS: $(BUILD_OBJ_DIR)/Debug/.dir $(BUILD_OBJ_DIR)/Release/.dir +.PRECIOUS: $(BUILD_OBJ_DIR)/Profile/.dir # Create .lo files in the ObjectFiles directory from the .cpp and .c files... -$(BUILD_OBJ_DIR)/Release/%.lo: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Release/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Release/%.lo: %.cpp $(BUILD_OBJ_DIR)/Release/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileO) $< -o $@ -$(BUILD_OBJ_DIR)/Release/%.lo: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Release/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Release/%.lo: %.c $(BUILD_OBJ_DIR)/Release/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileCO) $< -o $@ -$(BUILD_OBJ_DIR)/Profile/%.lo: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Profile/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Profile/%.lo: %.cpp $(BUILD_OBJ_DIR)/Profile/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileP) $< -o $@ -$(BUILD_OBJ_DIR)/Profile/%.lo: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Profile/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Profile/%.lo: %.c $(BUILD_OBJ_DIR)/Profile/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileCP) $< -o $@ -$(BUILD_OBJ_DIR)/Debug/%.lo: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Debug/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Debug/%.lo: %.cpp $(BUILD_OBJ_DIR)/Debug/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileG) $< -o $@ -$(BUILD_OBJ_DIR)/Debug/%.lo: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Debug/.dir - @echo "Compiling $<" +$(BUILD_OBJ_DIR)/Debug/%.lo: %.c $(BUILD_OBJ_DIR)/Debug/.dir + @${ECHO} "Compiling `basename $<`" $(VERB) $(CompileCG) $< -o $@ -$(BUILD_OBJ_DIR)/Bytecode/%.bc: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Bytecode/.dir $(LCC1XX) - @echo "Compiling $< to bytecode" - $(VERB) $(LLVMGXX) $(CPPFLAGS) -c $< -o $@ +$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.cpp $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LCC1XX) + @${ECHO} "Compiling `basename $<` to bytecode" + $(VERB) $(LLVMGXX) $(CompileCommonOpts) $(CPPFLAGS) -c $< -o $@ -$(BUILD_OBJ_DIR)/Bytecode/%.bc: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Bytecode/.dir $(LCC1) - @echo "Compiling $< to bytecode" - $(VERB) $(LLVMGCC) $(CPPFLAGS) -c $< -o $@ +$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.c $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LCC1) + @${ECHO} "Compiling `basename $<` to bytecode" + $(VERB) $(LLVMGCC) $(CompileCommonOpts) $(CPPFLAGS) -c $< -o $@ -$(BUILD_OBJ_DIR)/Bytecode/%.bc: $(SourceDir)%.ll $(BUILD_OBJ_DIR)/Bytecode/.dir $(LCC1) - @echo "Compiling $< to bytecode" +$(BUILD_OBJ_DIR)/BytecodeObj/%.bc: %.ll $(BUILD_OBJ_DIR)/BytecodeObj/.dir $(LLVMAS) + @${ECHO} "Compiling `basename $<` to bytecode" $(VERB) $(LLVMAS) $< -f -o $@ @@ -761,7 +804,7 @@ YACC_OUTPUT = $(addprefix $(YACC_FILES:%.y=%), .h .cpp .output) # FIXME. (f.e. char Buffer[10000] ) # %.cpp: %.l - @echo Flex\'ing $<... + @${ECHO} Flexing $< $(VERB) $(FLEX) -t $< | \ $(SED) '/^find_rule/d' | \ $(SED) 's/void yyunput/inline void yyunput/' | \ @@ -776,8 +819,8 @@ YACC_OUTPUT = $(addprefix $(YACC_FILES:%.y=%), .h .cpp .output) %.c: %.y # Cancel built-in rules for yacc %.h: %.y # Cancel built-in rules for yacc %.cpp %.h : %.y - @echo Bison\'ing $<... - $(VERB) $(BISON) -v -d -p $(<:%Parser.y=%) $*.y + @${ECHO} "Bisoning `basename $<`" + $(VERB) $(BISON) -v -d -p $( /dev/null || ${MV} -f $*.tab.c $*.cpp $(VERB) cmp -s $*.tab.h $*.h > /dev/null || ${MV} -f $*.tab.h $*.h @# If the files were not updated, don't leave them lying around... @@ -789,7 +832,7 @@ YACC_OUTPUT = $(addprefix $(YACC_FILES:%.y=%), .h .cpp .output) @$(DATE) > $@ # To create postscript files from dot files... -ifdef DOT +ifneq ($(DOT),false) %.ps: %.dot ${DOT} -Tps < $< > $@ else @@ -797,12 +840,22 @@ else ${ECHO} "Cannot build $@: The program dot is not installed" endif +# +# This rules ensures that header files that are removed still have a rule for +# which they can be "generated." This allows make to ignore them and +# reproduce the dependency lists. +# +%.h:: ; + # 'make clean' nukes the tree clean:: $(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)/Bytecode - $(VERB) $(RM) -f core core.[0-9][0-9]* *.o *.d *.so *~ *.flc + $(VERB) $(RM) -rf $(BUILD_OBJ_DIR)/BytecodeObj + $(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) ########################################################################### @@ -811,21 +864,38 @@ clean:: # from C/C++ source files. ########################################################################### +ifndef DISABLE_AUTO_DEPENDENCIES + # If dependencies were generated for the file that included this file, -# include the dependancies now... +# include the dependencies now... # -SourceBaseNames := $(basename $(notdir $(filter-out Debug/%, $(Source)))) +SourceBaseNames := $(basename $(Source)) SourceDepend := $(SourceBaseNames:%=$(BUILD_OBJ_DIR)/Depend/%.d) # Create dependencies for the *.cpp files... -#$(SourceDepend): \x -$(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Depend/.dir - $(VERB) $(Depend) $< | $(SED) 's|\.o|\.lo|' | $(SED) 's|$*\.lo *|$(BUILD_OBJ_DIR)/Release/& $(BUILD_OBJ_DIR)/Profile/& $(BUILD_OBJ_DIR)/Debug/& $(BUILD_OBJ_DIR)/Depend/$(@F)|g' > $@ +$(BUILD_OBJ_DIR)/Depend/%.d: %.cpp $(BUILD_OBJ_DIR)/Depend/.dir + $(VERB) $(Depend) $< | $(SED) 's|\.o:|\.lo:|' | $(SED) 's|$*\.lo *|$(BUILD_OBJ_DIR)/Release/& $(BUILD_OBJ_DIR)/Profile/& $(BUILD_OBJ_DIR)/Debug/& $(BUILD_OBJ_DIR)/Depend/$(@F)|g' > $@ # Create dependencies for the *.c files... -#$(SourceDepend): \x -$(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Depend/.dir - $(VERB) $(DependC) -o $@ $< | $(SED) 's|\.o|\.lo|' | $(SED) 's|$*\.lo *|$(BUILD_OBJ_DIR)/Release/& $(BUILD_OBJ_DIR)/Profile/& $(BUILD_OBJ_DIR)/Debug/& $(BUILD_OBJ_DIR)/Depend/$(@F)|g' > $@ +$(BUILD_OBJ_DIR)/Depend/%.d: %.c $(BUILD_OBJ_DIR)/Depend/.dir + $(VERB) $(DependC) -o $@ $< | $(SED) 's|\.o:|\.lo:|' | $(SED) 's|$*\.lo *|$(BUILD_OBJ_DIR)/Release/& $(BUILD_OBJ_DIR)/Profile/& $(BUILD_OBJ_DIR)/Debug/& $(BUILD_OBJ_DIR)/Depend/$(@F)|g' > $@ + +# +# Autoconf Dependencies. +# +$(LLVM_OBJ_ROOT)/config.status:: $(LLVM_SRC_ROOT)/configure + @${ECHO} "****************************************************************" + @${ECHO} " You need to re-run $(LLVM_SRC_ROOT)/configure" + @${ECHO} " in directory $(LLVM_OBJ_ROOT)" + @${ECHO} "****************************************************************" + $(VERB) exit 1 + +# If the Makefile in the source tree has been updated, copy it over into the +# build tree. +Makefile :: $(BUILD_SRC_DIR)/Makefile + @${ECHO} "===== Updating Makefile from source dir: `dirname $<` =====" + $(MKDIR) $(@D) + cp -f $< $@ # # Include dependencies generated from C/C++ source files, but not if we @@ -833,14 +903,8 @@ $(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Depend/.dir # ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),distclean) -ifneq ($(MAKECMDGOALS),cleandeps) -ifneq ($(SourceDepend),) --include $(SourceDepend) -endif +-include /dev/null $(SourceDepend) endif endif -endif - -cleandeps:: - $(VERB) rm -f $(SourceDepend) +endif # ifndef DISABLE_AUTO_DEPENDENCIES