Make sure to create the directory before we cram a .bc file into it
[oota-llvm.git] / Makefile.rules
index 21d86eb17e7def53f0d175ba461384138805b555..ee1c5c7daae774a859c82c3498b37eef21319fb9 100644 (file)
@@ -48,6 +48,7 @@
 # For building,
 #      LLVM, LLVM_SRC_ROOT = BUILD_SRC_ROOT, and
 #      LLVM_OBJ_ROOT = BUILD_OBJ_ROOT.
+#
 #===-----------------------------------------------------------------------====
 
 #
@@ -119,14 +120,14 @@ endif
 # It is typically the root directory of what we're compiling now.
 #
 ifndef LLVM_SRC_ROOT
-LLVM_SRC_ROOT = $(BUILD_SRC_ROOT)
+LLVM_SRC_ROOT := $(BUILD_SRC_ROOT)
 endif
 
 #
 # Set the LLVM object directory.
 #
 ifndef LLVM_OBJ_ROOT
-LLVM_OBJ_ROOT = $(BUILD_OBJ_ROOT)
+LLVM_OBJ_ROOT := $(BUILD_OBJ_ROOT)
 endif
 
 ###########################################################################
@@ -140,6 +141,12 @@ ifdef SHARED_LIBRARY
 all:: dynamic
 endif
 
+ifdef BYTECODE_LIBRARY
+# if BYTECODE_LIBRARY is specified, the default is to build the bytecode lib
+all:: bytecodelib
+install:: bytecodelib-install
+endif
+
 # Default Rule:  Make sure it's also a :: rule
 all ::
 
@@ -167,7 +174,8 @@ prdirs::
 # slightly since GNU Make will not try to find implicit rules for targets
 # which are marked as Phony.
 #
-.PHONY: all dynamic clean distclean install test bytecode prdirs
+.PHONY: all dynamic bytecodelib bytecodelib-install
+.PHONY: clean distclean install test bytecode prdirs
 
 ###########################################################################
 # Miscellaneous paths and commands:
@@ -185,8 +193,6 @@ prdirs::
 
 BURG_OPTS = -I
 
-PURIFY := $(PURIFY) -cache-dir="$(BUILD_OBJ_ROOT)/../purifycache" -chain-length="30" -messages=all 
-
 ifdef ENABLE_PROFILING
   ENABLE_OPTIMIZED = 1
   CONFIGURATION := Profile
@@ -224,6 +230,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
 DESTLIBCURRENT  := $(BUILD_OBJ_ROOT)/lib/$(CONFIGURATION)
 
 # LLVM libraries used for linking
@@ -265,11 +272,7 @@ PROJTOOLCURRENT := $(BUILD_OBJ_ROOT)/tools/$(CONFIGURATION)
 #
 # Libtool is found in the current directory.
 #
-ifdef VERBOSE
-LIBTOOL=$(LLVM_SRC_ROOT)/mklib
-else
-LIBTOOL=$(LLVM_SRC_ROOT)/mklib --silent
-endif
+LIBTOOL := $(LLVM_SRC_ROOT)/mklib
 
 #
 # If we're not building a shared library, use the disable-shared tag with
@@ -283,7 +286,7 @@ endif
 # versions of libtool.
 #
 ifndef SHARED_LIBRARY
-LIBTOOL := $(LIBTOOL) --tag=disable-shared
+LIBTOOL += --tag=disable-shared
 endif
 
 #
@@ -291,6 +294,7 @@ endif
 #
 ifndef VERBOSE
 VERB := @
+LIBTOOL += --silent
 endif
 
 ###########################################################################
@@ -300,14 +304,26 @@ endif
 ###########################################################################
 
 #--------------------------------------------------------------------------
-# Special tools used while building the LLVM tree.  Burg is built as part
-# of the utils directory.
-#--------------------------------------------------------------------------
+# Utilities used while building the LLVM tree, which live in the utils dir
+#
 BURG    := $(LLVMTOOLCURRENT)/burg
 RunBurg := $(BURG) $(BURG_OPTS)
-
 TBLGEN  := $(LLVMTOOLCURRENT)/tblgen
 
+#--------------------------------------------------------------------------
+# The LLVM GCC front-end in C and C++ flavors
+#
+LLVMGCC := $(LLVMGCCDIR)/bin/gcc
+LCC1    := $(LLVMGCCDIR)/lib/gcc-lib/$(LLVMGCCARCH)/cc1
+LLVMGXX := $(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
+
 
 ###########################################################################
 # Compile Time Flags
@@ -328,7 +344,6 @@ endif
 # Allow gnu extensions...
 CPPFLAGS += -D_GNU_SOURCE
 
-# -Wno-unused-parameter
 CompileCommonOpts := -Wall -W  -Wwrite-strings -Wno-unused -I$(LEVEL)/include
 CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions -fshort-enums
 
@@ -356,11 +371,7 @@ CompileCP := $(CompileC) $(CompileOptimizeOpts) $(PROFILE)
 # Link final executable
 #      (Note that we always link with the C++ compiler).
 #
-ifdef ENABLE_PURIFY # To enable purify, build with 'gmake ENABLE_PURIFY=1'
-Link     := $(PURIFY) $(LIBTOOL) --mode=link $(CXX) -static
-else
 Link     := $(LIBTOOL) --mode=link $(CXX)
-endif
 
 # link both projlib and llvmlib libraries
 LinkG    := $(Link) -g -L$(PROJLIBDEBUGSOURCE)  -L$(LLVMLIBDEBUGSOURCE) $(STRIP)
@@ -368,26 +379,20 @@ 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...
-#ifdef SHARED_LIBRARY
-Relink = ${LIBTOOL} --mode=link $(CXX)
-#else
-Relink = ${LIBTOOL} --mode=link $(CXX) -only-static
-#endif
-
-# MakeSO - Create a .so file from a .o files...
-#MakeSO   := $(LIBTOOL) --mode=link $(CXX) $(MakeSharedObjectOption)
-#MakeSOO  := $(MakeSO) -O3
-#MakeSOP  := $(MakeSOO) $(PROFILE)
+Relink := ${LIBTOOL} --mode=link $(CXX)
+ifndef SHARED_LIBRARY
+Relink += -only-static
+endif
 
 #
 # Configure where the item being compiled should go.
 #
 ifdef SHARED_LIBRARY
-Link := $(Link) -rpath $(DESTLIBCURRENT)
+Link += -rpath $(DESTLIBCURRENT)
 endif
 
 ifdef TOOLNAME
-Link := $(Link) -rpath $(DESTTOOLCURRENT)
+Link += -rpath $(DESTTOOLCURRENT)
 endif
 
 # Create dependancy file from CPP file, send to stdout.
@@ -410,10 +415,12 @@ endif
 #
 # Libtool Objects
 #
-Objs := $(sort $(patsubst Debug/%.lo, %.lo, $(addsuffix .lo,$(notdir $(basename $(Source))))))
+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)))
 
 #
 # The real objects underlying the libtool objects
@@ -492,6 +499,7 @@ LIBNAME_AG   := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).a
 LIBNAME_OBJO := $(DESTLIBRELEASE)/$(LIBRARYNAME).o
 LIBNAME_OBJP := $(DESTLIBPROFILE)/$(LIBRARYNAME).o
 LIBNAME_OBJG := $(DESTLIBDEBUG)/$(LIBRARYNAME).o
+LIBNAME_BC   := $(DESTLIBBYTECODE)/lib$(LIBRARYNAME).bc
 
 #--------------------------------------------------------------------
 # Library Targets
@@ -500,6 +508,12 @@ LIBNAME_OBJG := $(DESTLIBDEBUG)/$(LIBRARYNAME).o
 
 # dynamic target builds a shared object version of the library...
 dynamic:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).so
+bytecodelib:: $(LIBNAME_BC)
+bytecodelib-install:: $(LLVMGCCDIR)/bytecode-libs/lib$(LIBRARYNAME).bc
+
+$(LLVMGCCDIR)/bytecode-libs/lib$(LIBRARYNAME).bc: $(LIBNAME_BC)
+       @echo ======= Installing $(LIBRARYNAME) bytecode library =======
+       cp $< $@
 
 # Does the library want a .o version built?
 ifndef DONT_BUILD_RELINKED
@@ -515,6 +529,18 @@ endif
 # Rules for building libraries
 #--------------------------------------------------------------------
 
+LinkBCLib := $(LLVMGCC) -shared
+ifdef EXPORTED_SYMBOL_LIST
+LinkBCLib += -Xlinker -internalize-public-api-list=$(EXPORTED_SYMBOL_LIST)
+else
+LinkBCLib += -Xlinker -disable-internalize
+endif
+
+
+# Rule for building bytecode libraries.
+$(LIBNAME_BC): $(ObjectsBC) $(LibSubDirs) $(DESTLIBBYTECODE)/.dir
+       @echo ======= Linking $(LIBRARYNAME) bytecode library =======
+       $(VERB) $(LinkBCLib) -o $@ $(ObjectsBC) $(LibSubDirs) $(LibLinkOpts)
 #
 # Rules for building dynamically linked libraries.
 #
@@ -551,6 +577,7 @@ $(LIBNAME_AG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir
        @$(RM) -f $@
        $(VERB) $(Link) -g $(STRIP) -o $@ $(ObjectsG) $(LibSubDirs) -static
 
+
 #
 # Rules for building .o libraries.
 #
@@ -634,7 +661,6 @@ STATICUSEDLIBS   := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(USEDLIBS)))
 USED_LIB_PATHS_G := $(addprefix $(DESTLIBDEBUG)/, $(STATICUSEDLIBS))
 USED_LIB_PATHS_O := $(addprefix $(DESTLIBRELEASE)/, $(STATICUSEDLIBS))
 USED_LIB_PATHS_P := $(addprefix $(DESTLIBPROFILE)/, $(STATICUSEDLIBS))
-#LINK_OPTS        := $(TOOLLINKOPTS) $(PLATFORMLINKOPTS)
 
 #
 # Libtool link options:
@@ -674,7 +700,7 @@ endif
 
 
 #---------------------------------------------------------
-.PRECIOUS: $(BUILD_OBJ_DIR)/Depend/.dir
+.PRECIOUS: $(BUILD_OBJ_DIR)/Depend/.dir $(BUILD_OBJ_DIR)/Bytecode/.dir
 .PRECIOUS: $(BUILD_OBJ_DIR)/Debug/.dir $(BUILD_OBJ_DIR)/Release/.dir
 
 # Create .lo files in the ObjectFiles directory from the .cpp and .c files...
@@ -702,6 +728,19 @@ $(BUILD_OBJ_DIR)/Debug/%.lo: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Debug/.dir
        @echo "Compiling $<"
        $(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)/Bytecode/%.bc: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Bytecode/.dir $(LCC1)
+       @echo "Compiling $< to bytecode"
+       $(VERB) $(LLVMGCC) $(CPPFLAGS) -c $< -o $@
+
+$(BUILD_OBJ_DIR)/Bytecode/%.bc: $(SourceDir)%.ll $(BUILD_OBJ_DIR)/Bytecode/.dir $(LCC1)
+       @echo "Compiling $< to bytecode"
+       $(VERB) $(LLVMAS) $< -f -o $@
+
+
 #
 # Rules for building lex/yacc files
 #
@@ -758,7 +797,9 @@ endif
 
 # 'make clean' nukes the tree
 clean::
-       $(VERB) $(RM) -rf $(BUILD_OBJ_DIR)/Debug $(BUILD_OBJ_DIR)/Release $(BUILD_OBJ_DIR)/Profile $(BUILD_OBJ_DIR)/Depend
+       $(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) -f $(LEX_OUTPUT) $(YACC_OUTPUT)