Skip to content
Makefile.rules 58.2 KiB
Newer Older
#===-- 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.
# 
#===------------------------------------------------------------------------===#
Chris Lattner's avatar
Chris Lattner committed
#
Reid Spencer's avatar
Reid Spencer committed
# This file is included by all of the LLVM makefiles.  For details on how to use
# it properly, please see the document MakefileGuide.html in the docs directory.
#===-----------------------------------------------------------------------====#
Chris Lattner's avatar
Chris Lattner committed

################################################################################
Reid Spencer's avatar
Reid Spencer committed
# TARGETS: Define standard targets that can be invoked
################################################################################
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
# Define the various target sets
#--------------------------------------------------------------------
RecursiveTargets := all clean clean-all install uninstall install-bytecode
LocalTargets     := all-local clean-local clean-all-local check-local \
                    install-local printvars uninstall-local \
		    install-bytecode-local
TopLevelTargets  := check dist dist-check dist-clean tags dist-gzip dist-bzip2 \
                    dist-zip
UserTargets      := $(RecursiveTargets) $(LocalTargets) $(TopLevelTargets)
InternalTargets  := preconditions distdir dist-hook
################################################################################
Reid Spencer's avatar
Reid Spencer committed
# INITIALIZATION: Basic things the makefile needs
################################################################################

#--------------------------------------------------------------------
# Set the VPATH so that we can find source files.
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
VPATH=$(PROJ_SRC_DIR)
Reid Spencer's avatar
Reid Spencer committed

#--------------------------------------------------------------------
# Reset the list of suffixes we know how to build
#--------------------------------------------------------------------
.SUFFIXES:
Chris Lattner's avatar
Chris Lattner committed
.SUFFIXES: .c .cpp .cc .h .hpp .y .l .lo .o .a .bc .td .ps .dot .ll
.SUFFIXES: $(SHLIBEXT) $(SUFFIXES)
Reid Spencer's avatar
Reid Spencer committed

Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
# Mark all of these targets as phony to avoid implicit rule search
#--------------------------------------------------------------------
.PHONY: $(UserTargets) $(InternalTargets)
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
# Make sure all the user-target rules are double colon rules and 
# they are defined first.
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed

################################################################################
# PRECONDITIONS: that which must be built/checked first
################################################################################

SrcMakefiles       := $(filter %Makefile %Makefile.tests,\
Reid Spencer's avatar
Reid Spencer committed
                      $(wildcard $(PROJ_SRC_DIR)/Makefile*))
ObjMakefiles       := $(subst $(PROJ_SRC_DIR),$(PROJ_OBJ_DIR),$(SrcMakefiles))
ConfigureScript    := $(PROJ_SRC_ROOT)/configure
ConfigStatusScript := $(PROJ_OBJ_ROOT)/config.status
MakefileConfigIn   := $(strip $(wildcard $(PROJ_SRC_ROOT)/Makefile.config.in))
MakefileCommonIn   := $(strip $(wildcard $(PROJ_SRC_ROOT)/Makefile.common.in))
MakefileConfig     := $(PROJ_OBJ_ROOT)/Makefile.config
MakefileCommon     := $(PROJ_OBJ_ROOT)/Makefile.common
PreConditions      := $(ConfigStatusScript) $(ObjMakefiles)
ifneq ($(MakefileCommonIn),)
PreConditions      += $(MakefileCommon)
endif
ifneq ($(MakefileConfigIn),)
PreConditions      += $(MakefileConfig)
endif
Reid Spencer's avatar
Reid Spencer committed

Reid Spencer's avatar
Reid Spencer committed
preconditions: $(PreConditions)
Reid Spencer's avatar
Reid Spencer committed

#------------------------------------------------------------------------
# Make sure the BUILT_SOURCES are built first
#------------------------------------------------------------------------
$(filter-out clean clean-local,$(UserTargets)):: $(BUILT_SOURCES)
Reid Spencer's avatar
Reid Spencer committed

clean-local::
ifneq ($(strip $(BUILT_SOURCES)),)
Reid Spencer's avatar
Reid Spencer committed
endif

Reid Spencer's avatar
Reid Spencer committed
ifneq ($(PROJ_OBJ_ROOT),$(PROJ_SRC_ROOT))
spotless:
	$(Verb) if test -x config.status ; then \
Reid Spencer's avatar
Reid Spencer committed
	  $(EchoCmd) Wiping out $(PROJ_OBJ_ROOT) ; \
	  $(MKDIR) .spotless.save ; \
	  $(MV) config.status .spotless.save ; \
	  $(MV) mklib  .spotless.save ; \
	  $(MV) projects  .spotless.save ; \
	  $(MV) .spotless.save/config.status . ; \
	  $(MV) .spotless.save/mklib . ; \
	  $(MV) .spotless.save/projects . ; \
	  $(RM) -rf .spotless.save ; \
Reid Spencer's avatar
Reid Spencer committed
	  $(EchoCmd) Rebuilding configuration of $(PROJ_OBJ_ROOT) ; \
	  $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
	  $(ConfigStatusScript) ; \
Reid Spencer's avatar
Reid Spencer committed
	  $(EchoCmd) "make spotless" can only be run from $(PROJ_OBJ_ROOT); \
Reid Spencer's avatar
Reid Spencer committed
else
spotless:
	$(EchoCmd) "spotless target not supported for objdir == srcdir"
Reid Spencer's avatar
Reid Spencer committed

Reid Spencer's avatar
Reid Spencer committed
#------------------------------------------------------------------------
# Make sure we're not using a stale configuration
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
reconfigure:
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Reconfiguring $(PROJ_OBJ_ROOT)
	$(Verb) cd $(PROJ_OBJ_ROOT) && \
	  if test -w $(PROJ_OBJ_ROOT)/config.cache ; then \
	    $(RM) $(PROJ_OBJ_ROOT)/config.cache ; \
Reid Spencer's avatar
Reid Spencer committed
	  fi ; \
Reid Spencer's avatar
Reid Spencer committed
	  $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
	  $(ConfigStatusScript)

.PRECIOUS: $(ConfigStatusScript)
$(ConfigStatusScript): $(ConfigureScript)
	$(Echo) Reconfiguring with $<
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) cd $(PROJ_OBJ_ROOT) && \
	  if test -w $(PROJ_OBJ_ROOT)/config.cache ; then \
	    $(RM) $(PROJ_OBJ_ROOT)/config.cache ; \
Reid Spencer's avatar
Reid Spencer committed
	  fi ; \
	  $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
	  $(ConfigStatusScript)
Reid Spencer's avatar
Reid Spencer committed

#------------------------------------------------------------------------
# Make sure the configuration makefile is up to date
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifneq ($(MakefileConfigIn),)
$(MakefileConfig): $(MakefileConfigIn) $(ConfigStatusScript)
	$(Echo) Regenerating $@
	$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ConfigStatusScript) Makefile.config
endif

ifneq ($(MakefileCommonIn),)
$(MakefileCommon): $(MakefileCommonIn) $(ConfigStatusScript)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ConfigStatusScript) Makefile.common
endif
Reid Spencer's avatar
Reid Spencer committed

#------------------------------------------------------------------------
# If the Makefile in the source tree has been updated, copy it over into the
# build tree. But, only do this if the source and object makefiles differ
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifneq ($(PROJ_OBJ_DIR),$(PROJ_SRC_DIR))
Reid Spencer's avatar
Reid Spencer committed

Reid Spencer's avatar
Reid Spencer committed
Makefile: $(PROJ_SRC_DIR)/Makefile
	$(Echo) "Updating Makefile"
	$(Verb) $(MKDIR) $(@D)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(CP) -f $< $@
Reid Spencer's avatar
Reid Spencer committed

# Copy the Makefile.* files unless we're in the root directory which avoids
# the copying of Makefile.config.in or other things that should be explicitly
# taken care of.
Reid Spencer's avatar
Reid Spencer committed
$(PROJ_OBJ_DIR)/Makefile% : $(PROJ_SRC_DIR)/Makefile%
	@case '$?' in \
          *Makefile.rules) ;; \
          *.in) ;; \
Reid Spencer's avatar
Reid Spencer committed
	     $(CP) -f $< $@ ;; \
Reid Spencer's avatar
Reid Spencer committed
endif
Reid Spencer's avatar
Reid Spencer committed
#------------------------------------------------------------------------
# Set up the basic dependencies
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed

all:: all-local
Reid Spencer's avatar
Reid Spencer committed
clean:: clean-local 
clean-all:: clean-local clean-all-local
Reid Spencer's avatar
Reid Spencer committed
install:: install-local
uninstall:: uninstall-local
install-local:: all-local 
install-bytecode:: install-bytecode-local
Reid Spencer's avatar
Reid Spencer committed

###############################################################################
# VARIABLES: Set up various variables based on configuration data
###############################################################################
Chris Lattner's avatar
Chris Lattner committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
# Variables derived from configuration we are building
Chris Lattner's avatar
Chris Lattner committed
#--------------------------------------------------------------------

# OPTIMIZE_OPTION - The optimization level option we want to build LLVM with
# this can be overridden on the make command line.
ifneq ($(OS),MingW)
  OPTIMIZE_OPTION := -O3
else
  OPTIMIZE_OPTION := -O2
endif
  CXX.Flags := $(OPTIMIZE_OPTION) -pg -g
  C.Flags   := $(OPTIMIZE_OPTION) -pg -g
  LD.Flags  := $(OPTIMIZE_OPTION) -pg -g
    # Don't use -fomit-frame-pointer on FreeBSD
    ifneq ($(OS),FreeBSD)
    # Don't use -fomit-frame-pointer on Darwin, it breaks backtraces.
    ifneq ($(OS),Darwin)
      OmitFramePointer := -fomit-frame-pointer
    endif
    CXX.Flags := $(OPTIMIZE_OPTION) $(OmitFramePointer)
    C.Flags   := $(OPTIMIZE_OPTION) $(OmitFramePointer)
    LD.Flags  := $(OPTIMIZE_OPTION)
Evan Cheng's avatar
Evan Cheng committed
    LD.Flags  := -g
# If DISABLE_ASSERTIONS=1 is specified (make command line or configured),
# then disable assertions by defining the appropriate preprocessor symbols.
ifdef DISABLE_ASSERTIONS
Reid Spencer's avatar
Reid Spencer committed
  BuildMode := $(BuildMode)-Asserts
  CXX.Flags += -DNDEBUG
  C.Flags   += -DNDEBUG
else
  CXX.Flags += -D_DEBUG
  C.Flags   += -D_DEBUG
CXX.Flags     += $(CXXFLAGS)
C.Flags       += $(CFLAGS)
CPP.BaseFlags += $(CPPFLAGS)
LD.Flags      += $(LDFLAGS)
AR.Flags      := cru
Reid Spencer's avatar
Reid Spencer committed

#Make Floating point ieee complient on alpha
ifeq ($(ARCH),Alpha)
Andrew Lenharth's avatar
Andrew Lenharth committed
  CXX.Flags     += -mieee -fPIC
  CPP.BaseFlags += -mieee -fPIC
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ObjDir      := $(PROJ_OBJ_DIR)/$(BuildMode)
LibDir      := $(PROJ_OBJ_ROOT)/$(BuildMode)/lib
ToolDir     := $(PROJ_OBJ_ROOT)/$(BuildMode)/bin
ExmplDir    := $(PROJ_OBJ_ROOT)/$(BuildMode)/examples
Reid Spencer's avatar
Reid Spencer committed
LLVMLibDir  := $(LLVM_OBJ_ROOT)/$(BuildMode)/lib
LLVMToolDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/bin
LLVMExmplDir:= $(LLVM_OBJ_ROOT)/$(BuildMode)/examples
Reid Spencer's avatar
Reid Spencer committed
CFERuntimeLibDir := $(LLVMGCCDIR)/lib
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
# Full Paths To Compiled Tools and Utilities
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
EchoCmd  = $(ECHO) llvm[$(MAKELEVEL)]:
Echo     = @$(EchoCmd)
endif
ifndef LLVMAS
LLVMAS   := $(LLVMToolDir)/llvm-as$(EXEEXT)
endif
ifndef TBLGEN
TBLGEN   := $(LLVMToolDir)/tblgen$(EXEEXT)
endif
ifndef GCCAS
GCCAS    := $(LLVMToolDir)/gccas$(EXEEXT)
endif
ifndef GCCLD
GCCLD    := $(LLVMToolDir)/gccld$(EXEEXT)
endif
ifndef LDIS
LLVMDIS  := $(LLVMToolDir)/llvm-dis$(EXEEXT)
endif
ifndef LLI
LLI      := $(LLVMToolDir)/lli$(EXEEXT)
endif
Alkis Evlogimenos's avatar
Alkis Evlogimenos committed
ifndef LLC
LLC      := $(LLVMToolDir)/llc$(EXEEXT)
endif
ifndef LOPT
Alkis Evlogimenos's avatar
Alkis Evlogimenos committed
LOPT     := $(LLVMToolDir)/opt$(EXEEXT)
endif
ifndef LBUGPOINT
LBUGPOINT := $(LLVMToolDir)/bugpoint$(EXEEXT)
endif

LLVMGCCWITHPATH  := PATH="$(LLVMToolDir):$(PATH)" $(LLVMGCC)
LLVMGXXWITHPATH  := PATH="$(LLVMToolDir):$(PATH)" $(LLVMGXX)
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
#--------------------------------------------------------------------
# Adjust LD.Flags and Libtool.Flags depending on the kind of library that is
# to be built. Note that if LOADABLE_MODULE is specified then the resulting
# shared library can be opened with dlopen
ifdef SHARED_LIBRARY
  ifdef LOADABLE_MODULE
    LD.Flags += -module
  endif
else
  LibTool.Flags += --tag=disable-shared
ifdef TOOL_VERBOSE
  C.Flags += -v
  CXX.Flags += -v
  LD.Flags += -v
  VERBOSE := 1
endif

Reid Spencer's avatar
Reid Spencer committed
# Adjust settings for verbose mode
  Verb := @
  LibTool.Flags += --silent
  AR.Flags += >/dev/null 2>/dev/null
Reid Spencer's avatar
Reid Spencer committed
  ConfigureScriptFLAGS += >$(PROJ_OBJ_DIR)/configure.out 2>&1
Reid Spencer's avatar
Reid Spencer committed
else
# By default, strip symbol information from executable
  Strip := $(PLATFORMSTRIPOPTS)
  StripWarnMsg := "(without symbols)"
Reid Spencer's avatar
Reid Spencer committed
# Adjust linker flags for building an executable
Reid Spencer's avatar
Reid Spencer committed
ifdef EXAMPLE_TOOL
  LD.Flags += -rpath $(ExmplDir) -export-dynamic
else
  LD.Flags += -rpath $(ToolDir) -export-dynamic
Reid Spencer's avatar
Reid Spencer committed
endif
Reid Spencer's avatar
Reid Spencer committed
#----------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
#----------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused -Wno-long-long \
                     -pedantic $(EXTRA_OPTIONS)
Chris Lattner's avatar
Chris Lattner committed

Duraid Madina's avatar
Duraid Madina committed
  CompileCommonOpts := -D_REENTRANT -D_HPUX_SOURCE
# If we are building a universal binary on Mac OS/X, pass extra options.  This
# is useful to people that want to link the LLVM libraries into their universal
# apps.
#
# The following can be optionally specified:
#   UNIVERSAL_SDK_PATH variable can be specified as a path to the SDK to use.
#      For Mac OS/X 10.4 Intel machines, the traditional one is:
#      UNIVERSAL_SDK_PATH=/Developer/SDKs/MacOSX10.4u.sdk/
#   UNIVERSAL_ARCH can be optionally specified to be a list of architectures
#      to build for, e.g. UNIVERSAL_ARCH="i386 ppc ppc64".  This defaults to
#      i386/ppc only.
  ifndef UNIVERSAL_ARCH
    UNIVERSAL_ARCH := i386 ppc
  endif
  UNIVERSAL_ARCH_OPTIONS := $(UNIVERSAL_ARCH:%=-arch %)
  CompileCommonOpts += $(UNIVERSAL_ARCH_OPTIONS)
  Relink.Flags := $(UNIVERSAL_ARCH_OPTIONS:%=-XCClinker %)
  ifdef UNIVERSAL_SDK_PATH
    CompileCommonOpts += -isysroot $(UNIVERSAL_SDK_PATH)
    Relink.Flags      += -XCClinker -isysroot -XCClinker $(UNIVERSAL_SDK_PATH)
  endif

  # Building universal cannot compute dependencies automatically.
LD.Flags      += -L$(LibDir) -L$(LLVMLibDir) 
CPP.BaseFlags += -D_GNU_SOURCE -D__STDC_LIMIT_MACROS
# All -I flags should go here, so that they don't confuse llvm-config.
CPP.Flags     += -I$(PROJ_OBJ_DIR) -I$(PROJ_SRC_DIR) \
	         -I$(PROJ_OBJ_ROOT)/include \
	         -I$(PROJ_SRC_ROOT)/include \
	         -I$(LLVM_OBJ_ROOT)/include \
	         -I$(LLVM_SRC_ROOT)/include \
		 $(CPP.BaseFlags)
Compile.C     = $(CC) $(CPP.Flags) $(CompileCommonOpts) -c $(C.Flags)
LTCompile.C   = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.C)
Reid Spencer's avatar
Reid Spencer committed
BCCompile.C   = $(LLVMGCCWITHPATH) $(CPP.Flags) $(CompileCommonOpts) \
Chris Lattner's avatar
Chris Lattner committed
                $(C.Flags)
Preprocess.C  = $(CC) $(CPP.Flags) $(CompileCommonOpts) -E $(C.Flags)

Compile.CXX   = $(CXX) $(CPP.Flags) $(CompileCommonOpts) $(CXX.Flags) -c
LTCompile.CXX = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.CXX)
BCCompile.CXX = $(LLVMGXXWITHPATH) $(CPP.Flags) $(CompileCommonOpts) \
Chris Lattner's avatar
Chris Lattner committed
                $(CXX.Flags)
Preprocess.CXX= $(CXX) $(CPP.Flags) $(CompileCommonOpts) $(CXX.Flags) -E
Link          = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \
	        $(CXX.Flags) $(CompileCommonOpts) $(LD.Flags) $(Strip)
Relink        = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \
                $(CXX.Flags) $(CompileCommonOpts) $(Relink.Flags)
LTInstall     = $(LIBTOOL) $(LibTool.Flags) --mode=install $(INSTALL) \
		$(Install.Flags)
ProgInstall   = $(INSTALL) $(Install.StripFlag) -m 0755 
DataInstall   = $(INSTALL) -m 0644
TableGen      = $(TBLGEN) -I $(PROJ_SRC_DIR) -I$(PROJ_SRC_ROOT)/include \
                -I $(PROJ_SRC_ROOT)/lib/Target      
Reid Spencer's avatar
Reid Spencer committed
LArchive      = $(LLVMToolDir)/llvm-ar rcsf
Reid Spencer's avatar
Reid Spencer committed
Ranlib        = $(RANLIB)
Reid Spencer's avatar
Reid Spencer committed
Ranlib        = ranlib
Chris Lattner's avatar
Chris Lattner committed

#----------------------------------------------------------
# Get the list of source files and compute object file 
# names from them. 
Reid Spencer's avatar
Reid Spencer committed
#----------------------------------------------------------
Chris Lattner's avatar
Chris Lattner committed
ifndef SOURCES
  Sources := $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp \
             $(PROJ_SRC_DIR)/*.cc $(PROJ_SRC_DIR)/*.c $(PROJ_SRC_DIR)/*.y \
             $(PROJ_SRC_DIR)/*.l))
else
  Sources := $(SOURCES)
endif 
Chris Lattner's avatar
Chris Lattner committed
ifdef BUILT_SOURCES
Sources += $(filter %.cpp %.c %.cc %.y %.l,$(BUILT_SOURCES))
endif
Reid Spencer's avatar
Reid Spencer committed

Chris Lattner's avatar
Chris Lattner committed
BaseNameSources := $(sort $(basename $(Sources)))

ObjectsO  := $(BaseNameSources:%=$(ObjDir)/%.o)
ObjectsLO := $(BaseNameSources:%=$(ObjDir)/%.lo)
ObjectsBC := $(BaseNameSources:%=$(ObjDir)/%.bc)

Reid Spencer's avatar
Reid Spencer committed
###############################################################################
# DIRECTORIES: Handle recursive descent of directory structure
###############################################################################
Reid Spencer's avatar
Reid Spencer committed
#---------------------------------------------------------
# Provide rules to make install dirs. This must be early
# in the file so they get built before dependencies
#---------------------------------------------------------

$(PROJ_bindir): $(PROJ_bindir)/.dir
$(PROJ_libdir): $(PROJ_libdir)/.dir
$(PROJ_includedir): $(PROJ_includedir)/.dir
$(PROJ_etcdir): $(PROJ_etcdir)/.dir
Reid Spencer's avatar
Reid Spencer committed

# To create other directories, as needed, and timestamp their creation
%/.dir:
	$(Verb) $(MKDIR) $* > /dev/null
	$(Verb) $(DATE) > $@
Reid Spencer's avatar
Reid Spencer committed
.PRECIOUS: $(ObjDir)/.dir $(LibDir)/.dir $(ToolDir)/.dir $(ExmplDir)/.dir
.PRECIOUS: $(LLVMLibDir)/.dir $(LLVMToolDir)/.dir $(LLVMExmplDir)/.dir
Reid Spencer's avatar
Reid Spencer committed

Chris Lattner's avatar
Chris Lattner committed
#---------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
# Handle the DIRS options for sequential construction
Chris Lattner's avatar
Chris Lattner committed
#---------------------------------------------------------


ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
$(RecursiveTargets)::
	$(Verb) for dir in $(DIRS); do \
	  if [ ! -f $$dir/Makefile ]; then \
	    $(MKDIR) $$dir; \
Reid Spencer's avatar
Reid Spencer committed
	    $(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
	  ($(MAKE) -C $$dir $@ ) || exit 1; \
else
$(RecursiveTargets)::
	$(Verb) for dir in $(DIRS); do \
	  ($(MAKE) -C $$dir $@ ) || exit 1; \
	done
endif

Reid Spencer's avatar
Reid Spencer committed
#---------------------------------------------------------
# Handle the EXPERIMENTAL_DIRS options ensuring success
# after each directory is built.
#---------------------------------------------------------
ifdef EXPERIMENTAL_DIRS
$(RecursiveTargets)::
	$(Verb) for dir in $(EXPERIMENTAL_DIRS); do \
Reid Spencer's avatar
Reid Spencer committed
	  if [ ! -f $$dir/Makefile ]; then \
	    $(MKDIR) $$dir; \
Reid Spencer's avatar
Reid Spencer committed
	    $(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
Reid Spencer's avatar
Reid Spencer committed
	  fi; \
	  ($(MAKE) -C $$dir $@ ) || exit 0; \
Reid Spencer's avatar
Reid Spencer committed
	done
endif

Reid Spencer's avatar
Reid Spencer committed
#-----------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
# Handle the PARALLEL_DIRS options for parallel construction
Reid Spencer's avatar
Reid Spencer committed
#-----------------------------------------------------------
ifdef PARALLEL_DIRS
Reid Spencer's avatar
Reid Spencer committed

# Unfortunately, this list must be maintained if new recursive targets are added
all      :: $(addsuffix /.makeall      ,$(PARALLEL_DIRS))
clean    :: $(addsuffix /.makeclean    ,$(PARALLEL_DIRS))
clean-all:: $(addsuffix /.makeclean-all,$(PARALLEL_DIRS))
install  :: $(addsuffix /.makeinstall  ,$(PARALLEL_DIRS))
Reid Spencer's avatar
Reid Spencer committed
uninstall:: $(addsuffix /.makeuninstall,$(PARALLEL_DIRS))
install-bytecode  :: $(addsuffix /.makeinstall-bytecode,$(PARALLEL_DIRS))
ParallelTargets := $(foreach T,$(RecursiveTargets),%/.make$(T))
Reid Spencer's avatar
Reid Spencer committed

$(ParallelTargets) :
	$(Verb) if [ ! -f $(@D)/Makefile ]; then \
Reid Spencer's avatar
Reid Spencer committed
	  $(CP) $(PROJ_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \
	$(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) ;
Chris Lattner's avatar
Chris Lattner committed
endif

Reid Spencer's avatar
Reid Spencer committed
#---------------------------------------------------------
# Handle the OPTIONAL_DIRS options for directores that may
# or may not exist.
#---------------------------------------------------------
ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
$(RecursiveTargets)::
	$(Verb) for dir in $(OPTIONAL_DIRS); do \
Reid Spencer's avatar
Reid Spencer committed
	  if [ -d $(PROJ_SRC_DIR)/$$dir ]; then\
	    if [ ! -f $$dir/Makefile ]; then \
	      $(MKDIR) $$dir; \
Reid Spencer's avatar
Reid Spencer committed
	      $(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
	    ($(MAKE) -C$$dir $@ ) || exit 1; \
else
$(RecursiveTargets)::
	$(Verb) for dir in $(OPTIONAL_DIRS); do \
	  ($(MAKE) -C$$dir $@ ) || exit 1; \
	done
endif
#---------------------------------------------------------
# Handle the CONFIG_FILES options
#---------------------------------------------------------
ifdef CONFIG_FILES

Reid Spencer's avatar
Reid Spencer committed
install-local:: $(PROJ_etcdir) $(CONFIG_FILES)
	$(Echo) Installing Configuration Files To $(PROJ_etcdir)
	$(Verb)for file in $(CONFIG_FILES); do \
Reid Spencer's avatar
Reid Spencer committed
          if test -f $(PROJ_OBJ_DIR)/$${file} ; then \
Reid Spencer's avatar
Reid Spencer committed
            $(DataInstall) $(PROJ_OBJ_DIR)/$${file} $(PROJ_etcdir) ; \
Reid Spencer's avatar
Reid Spencer committed
          elif test -f $(PROJ_SRC_DIR)/$${file} ; then \
Reid Spencer's avatar
Reid Spencer committed
            $(DataInstall) $(PROJ_SRC_DIR)/$${file} $(PROJ_etcdir) ; \
          else \
            $(ECHO) Error: cannot find config file $${file}. ; \
          fi \
Reid Spencer's avatar
Reid Spencer committed

Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Uninstalling Configuration Files From $(PROJ_etcdir)
	$(Verb)for file in $(CONFIG_FILES); do \
Reid Spencer's avatar
Reid Spencer committed
	  $(RM) -f $(PROJ_etcdir)/$${file} ; \
###############################################################################
# Set up variables for building libararies
###############################################################################

#---------------------------------------------------------
# Handle the special "JIT" value for LLVM_LIBS which is a
# shorthand for a bunch of libraries that get the correct
# JIT support for a library or a tool that runs JIT.
#---------------------------------------------------------
ifeq ($(firstword $(LLVMLIBS)),config)
LLVM_CONFIG := $(LLVM_SRC_ROOT)/utils/llvm-config/llvm-config 
Reid Spencer's avatar
Reid Spencer committed
LLVMLIBS := $(shell $(LLVM_CONFIG) --libnames $(wordlist 2,9999,$(LLVMLIBS)))
LLVMLIBS := $(patsubst lib%.a,%.a,$(LLVMLIBS))
LLVMLIBS := $(patsubst %.o,%,$(LLVMLIBS))
endif

ifeq ($(LLVMLIBS),JIT)

# Make sure we can get our own symbols in the tool
Link += -dlopen self

# Generic JIT libraries
JIT_LIBS := LLVMInterpreter LLVMJIT LLVMSelectionDAG.a LLVMCodeGen.a \
            LLVMExecutionEngine

# You can enable the X86 JIT on a non-X86 host by setting the flag
# ENABLE_X86_JIT on the make command line. If not, it will still be
# enabled automagically on an X86 host.
ifeq ($(ARCH), x86)
  ENABLE_X86_JIT = 1
endif

# What the X86 JIT requires
ifdef ENABLE_X86_JIT
  JIT_LIBS += LLVMX86 
endif

# You can enable the PowerPC JIT on a non-PowerPC host by setting the flag
# ENABLE_PPC_JIT on the make command line. If not, it will still be
# enabled automagically on an PowerPC host.
ifeq ($(ARCH), PowerPC)
  ENABLE_PPC_JIT = 1
endif

# What the PowerPC JIT requires
ifdef ENABLE_PPC_JIT
  JIT_LIBS += LLVMPowerPC 
Andrew Lenharth's avatar
Andrew Lenharth committed
# You can enable the Alpha JIT on a non-Alpha host by setting the flag
# ENABLE_ALPHA_JIT on the make command line. If not, it will still be
# enabled automagically on an Alpha host.
Andrew Lenharth's avatar
Andrew Lenharth committed
ifeq ($(ARCH), Alpha)
  ENABLE_ALPHA_JIT = 1
endif

Andrew Lenharth's avatar
Andrew Lenharth committed
ifdef ENABLE_ALPHA_JIT
  JIT_LIBS += LLVMAlpha 
Andrew Lenharth's avatar
Andrew Lenharth committed
endif

LLVMLIBS := $(JIT_LIBS) LLVMScalarOpts.a LLVMTransformUtils.a LLVMAnalysis.a \
            LLVMBCReader.a LLVMTarget.a LLVMCore.a LLVMSupport.a LLVMbzip2.a \
            LLVMSystem.a $(PLATFORMLIBDL)
endif

#---------------------------------------------------------
# Define various command line options pertaining to the
# libraries needed when linking. There are "Proj" libs 
# (defined by the user's project) and "LLVM" libs (defined 
# by the # LLVM project).
#---------------------------------------------------------
ProjLibsOptions := $(patsubst %.a.o, -l%, $(addsuffix .o, $(USEDLIBS)))
ProjLibsOptions := $(patsubst %.o, $(LibDir)/%.o,  $(ProjLibsOptions))
LLVMLibsOptions := $(patsubst %.a.o, -l%, $(addsuffix .o, $(LLVMLIBS)))
LLVMLibsOptions := $(patsubst %.o, $(LLVMLibDir)/%.o, $(LLVMLibsOptions))
ProjUsedLibs    := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(USEDLIBS)))
LLVMUsedLibs    := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(LLVMLIBS)))
ProjLibsPaths   := $(addprefix $(LibDir)/,$(ProjUsedLibs))
LLVMLibsPaths   := $(addprefix $(LLVMLibDir)/,$(LLVMUsedLibs))

Reid Spencer's avatar
Reid Spencer committed
###############################################################################
# Library Build Rules: Four ways to build a library
###############################################################################
Chris Lattner's avatar
Chris Lattner committed

#---------------------------------------------------------
# Bytecode Module Targets:
#   If the user set MODULE_NAME then they want to build a
#   bytecode module from the sources. We compile all the
#   sources and link it together into a single bytecode
#   module.
#---------------------------------------------------------

ifdef MODULE_NAME
Reid Spencer's avatar
Reid Spencer committed
ifeq ($(strip $(LLVMGCC)),)
$(warning Modules require llvm-gcc but no llvm-gcc is available ****)
Reid Spencer's avatar
Reid Spencer committed
else

Module     := $(LibDir)/$(MODULE_NAME).bc
LinkModule := $(GCCLD) -L$(CFERuntimeLibDir)

Chris Lattner's avatar
Chris Lattner committed
LinkModule += -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
endif

$(Module): $(BUILT_SOURCES) $(ObjectsBC) $(LibDir)/.dir $(GCCLD)
	$(Echo) Building $(BuildMode) Bytecode Module $(notdir $@)
	$(Verb) $(LinkModule) -o $@ $(ObjectsBC)

all-local:: $(Module)

clean-local::
ifneq ($(strip $(Module)),)
	-$(Verb) $(RM) -f $(Module)
endif

ifdef BYTECODE_DESTINATION
ModuleDestDir := $(BYTECODE_DESTINATION)
else
Reid Spencer's avatar
Reid Spencer committed
ModuleDestDir := $(PROJ_libdir)
endif

DestModule := $(ModuleDestDir)/$(MODULE_NAME).bc
install-local:: $(DestModule)

$(DestModule): $(ModuleDestDir) $(Module) 
	$(Echo) Installing $(BuildMode) Bytecode Module $(DestModule)
	$(Verb) $(DataInstall) $(Module) $(DestModule)

uninstall-local::
	$(Echo) Uninstalling $(BuildMode) Bytecode Module $(DestModule)
	-$(Verb) $(RM) -f $(DestModule)

endif
Reid Spencer's avatar
Reid Spencer committed
endif
Reid Spencer's avatar
Reid Spencer committed
# if we're building a library ...
Chris Lattner's avatar
Chris Lattner committed
ifdef LIBRARYNAME
# Make sure there isn't any extranous whitespace on the LIBRARYNAME option
LIBRARYNAME := $(strip $(LIBRARYNAME))
ifdef LOADABLE_MODULE
LibName.LA := $(LibDir)/$(LIBRARYNAME).la
else
LibName.LA := $(LibDir)/lib$(LIBRARYNAME).la
LibName.A  := $(LibDir)/lib$(LIBRARYNAME).a
LibName.O  := $(LibDir)/$(LIBRARYNAME).o
Reid Spencer's avatar
Reid Spencer committed
LibName.BCA:= $(LibDir)/lib$(LIBRARYNAME).bca
Reid Spencer's avatar
Reid Spencer committed
#---------------------------------------------------------
# Shared Library Targets:
#   If the user asked for a shared library to be built
#   with the SHARED_LIBRARY variable, then we provide
#   targets for building them.
#---------------------------------------------------------
ifdef LINK_LIBS_IN_SHARED
$(LibName.LA): $(ObjectsLO) $(LibDir)/.dir
	$(Echo) Linking $(BuildMode) Shared Library $(LIBRARYNAME)$(SHLIBEXT)
	$(Verb) $(Link) -o $@ $(ObjectsLO) \
         $(ProjLibsOptions) $(LLVMLibsOptions)
	$(Verb) $(LTInstall) $@ $(LibDir)
else
$(LibName.LA): $(ObjectsLO) $(LibDir)/.dir
	$(Echo) Linking $(BuildMode) Shared Library $(LIBRARYNAME)$(SHLIBEXT)
	$(Verb) $(Link) -o $@ $(ObjectsLO)
	$(Verb) $(LTInstall) $@ $(LibDir)
Reid Spencer's avatar
Reid Spencer committed

clean-local::
Reid Spencer's avatar
Reid Spencer committed
DestSharedLib = $(PROJ_libdir)/lib$(LIBRARYNAME)$(SHLIBEXT)
install-local:: $(DestSharedLib)
Reid Spencer's avatar
Reid Spencer committed
$(DestSharedLib): $(PROJ_libdir) $(LibName.LA)
	$(Echo) Installing $(BuildMode) Shared Library $(DestSharedLib)
	$(Verb) $(LTInstall) $(LibName.LA) $(DestSharedLib)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(LIBTOOL) --finish $(PROJ_libdir)
	$(Echo) Uninstalling $(BuildMode) Shared Library $(DestSharedLib)
Reid Spencer's avatar
Reid Spencer committed
	-$(Verb) $(RM) -f $(PROJ_libdir)/lib$(LIBRARYNAME).*
Chris Lattner's avatar
Chris Lattner committed

Reid Spencer's avatar
Reid Spencer committed
#---------------------------------------------------------
# Bytecode Library Targets:
#   If the user asked for a bytecode library to be built
#   with the BYTECODE_LIBRARY variable, then we provide 
#   targets for building them.
#---------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifeq ($(strip $(LLVMGCC)),)
$(warning Bytecode libraries require llvm-gcc which could not be found ****)
Reid Spencer's avatar
Reid Spencer committed
else
Reid Spencer's avatar
Reid Spencer committed
all-local:: $(LibName.BCA)
Reid Spencer's avatar
Reid Spencer committed
ifdef EXPORTED_SYMBOL_FILE
BCLinkLib = $(GCCLD) -L$(CFERuntimeLibDir) \
                     -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
$(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir $(GCCLD) \
                $(LLVMToolDir)/llvm-ar
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Building $(BuildMode) Bytecode Archive $(notdir $@) \
	  "(internalize)"
Chris Lattner's avatar
Chris Lattner committed
	$(Verb) $(BCLinkLib) -o $(ObjDir)/$(LIBRARYNAME).o $(ObjectsBC)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(LArchive) $@ $(ObjDir)/$(LIBRARYNAME).o
else
$(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir \
                $(LLVMToolDir)/llvm-ar
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Building $(BuildMode) Bytecode Archive $(notdir $@)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(LArchive) $@ $(ObjectsBC)

endif
Chris Lattner's avatar
Chris Lattner committed

Reid Spencer's avatar
Reid Spencer committed
clean-local::
Reid Spencer's avatar
Reid Spencer committed
ifneq ($(strip $(LibName.BCA)),)
	-$(Verb) $(RM) -f $(LibName.BCA)
ifdef BYTECODE_DESTINATION
BytecodeDestDir := $(BYTECODE_DESTINATION)
else
Reid Spencer's avatar
Reid Spencer committed
BytecodeDestDir := $(PROJ_libdir)
endif

DestBytecodeLib = $(BytecodeDestDir)/lib$(LIBRARYNAME).a
Reid Spencer's avatar
Reid Spencer committed

install-bytecode-local:: $(DestBytecodeLib)
install-local:: $(DestBytecodeLib)
$(DestBytecodeLib): $(BytecodeDestDir) $(LibName.BCA) 
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Installing $(BuildMode) Bytecode Archive $(DestBytecodeLib)
	$(Verb) $(DataInstall) $(LibName.BCA) $(DestBytecodeLib)
Chris Lattner's avatar
Chris Lattner committed

Reid Spencer's avatar
Reid Spencer committed
	$(Echo) Uninstalling $(BuildMode) Bytecode Archive $(DestBytecodeLib)
	-$(Verb) $(RM) -f $(DestBytecodeLib)
Reid Spencer's avatar
Reid Spencer committed
endif
#---------------------------------------------------------
# ReLinked Library Targets:
#   If the user explicitly requests a relinked library with
#   BUILD_RELINKED, provide it.  Otherwise, if they specify
#   neither of BUILD_ARCHIVE or DONT_BUILD_RELINKED, give
#   them one.
#---------------------------------------------------------
$(LibName.O): $(ObjectsO) $(LibDir)/.dir
	$(Echo) Linking $(BuildMode) Object Library $(notdir $@)
	$(Verb) $(Relink) -o $@ $(ObjectsO)
Reid Spencer's avatar
Reid Spencer committed
clean-local::
Reid Spencer's avatar
Reid Spencer committed
DestRelinkedLib = $(PROJ_libdir)/$(LIBRARYNAME).o
install-local:: $(DestRelinkedLib)
Reid Spencer's avatar
Reid Spencer committed
$(DestRelinkedLib): $(PROJ_libdir) $(LibName.O)
	$(Echo) Installing $(BuildMode) Object Library $(DestRelinkedLib)
	$(Verb) $(LTInstall) $(LibName.O) $(DestRelinkedLib)
	$(Echo) Uninstalling $(BuildMode) Object Library $(DestRelinkedLib)
	-$(Verb) $(RM) -f $(DestRelinkedLib)
#---------------------------------------------------------
# Archive Library Targets:
#   If the user wanted a regular archive library built, 
#   then we provide targets for building them.
#---------------------------------------------------------
$(LibName.A): $(ObjectsO) $(LibDir)/.dir
	$(Echo) Building $(BuildMode) Archive Library $(notdir $@)
	$(Verb) $(Archive) $@ $(ObjectsO)
	$(Verb) $(Ranlib) $@
Reid Spencer's avatar
Reid Spencer committed
clean-local::
Reid Spencer's avatar
Reid Spencer committed
DestArchiveLib := $(PROJ_libdir)/lib$(LIBRARYNAME).a
install-local:: $(DestArchiveLib)
Reid Spencer's avatar
Reid Spencer committed
$(DestArchiveLib): $(PROJ_libdir) $(LibName.A)
	$(Echo) Installing $(BuildMode) Archive Library $(DestArchiveLib)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(MKDIR) $(PROJ_libdir)
	$(Verb) $(LTInstall) $(LibName.A) $(DestArchiveLib)
	$(Echo) Uninstalling $(BuildMode) Archive Library $(DestArchiveLib)
Chris Lattner's avatar
Chris Lattner committed
endif

Reid Spencer's avatar
Reid Spencer committed
# endif LIBRARYNAME
###############################################################################
# Tool Build Rules: Build executable tool based on TOOLNAME option
###############################################################################

#---------------------------------------------------------
# Set up variables for building a tool.
#---------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifdef EXAMPLE_TOOL
ToolBuildPath   := $(ExmplDir)/$(strip $(TOOLNAME))$(EXEEXT)
Reid Spencer's avatar
Reid Spencer committed
else
ToolBuildPath   := $(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT)
Reid Spencer's avatar
Reid Spencer committed
endif
#---------------------------------------------------------
# Tell make that we need to rebuild subdirectories before 
# we can link the tool. This affects things like LLI which 
# has library subdirectories.
#---------------------------------------------------------
$(ToolBuildPath): $(addsuffix /.makeall, $(PARALLEL_DIRS))
#---------------------------------------------------------
# Provide targets for building the tools
#---------------------------------------------------------
all-local:: $(ToolBuildPath)
Reid Spencer's avatar
Reid Spencer committed
clean-local::
Reid Spencer's avatar
Reid Spencer committed
endif
Reid Spencer's avatar
Reid Spencer committed
ifdef EXAMPLE_TOOL
$(ToolBuildPath): $(ExmplDir)/.dir
else
$(ToolBuildPath): $(ToolDir)/.dir
endif

$(ToolBuildPath): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths)
	$(Echo) Linking $(BuildMode) executable $(TOOLNAME) $(StripWarnMsg)
	$(Verb) $(Link) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \
	$(LLVMLibsOptions) $(ExtraLibs) $(TOOLLINKOPTSB) $(LIBS)
Chris Lattner's avatar
Chris Lattner committed
	$(Echo) ======= Finished Linking $(BuildMode) Executable $(TOOLNAME) \
          $(StripWarnMsg) 
Reid Spencer's avatar
Reid Spencer committed
DestTool = $(PROJ_bindir)/$(TOOLNAME)
Reid Spencer's avatar
Reid Spencer committed
$(DestTool): $(PROJ_bindir) $(ToolBuildPath)
	$(Echo) Installing $(BuildMode) $(DestTool)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(ProgInstall) $(ToolBuildPath) $(DestTool)
	$(Echo) Uninstalling $(BuildMode) $(DestTool)
###############################################################################
# Object Build Rules: Build object files based on sources 
###############################################################################

# FIXME: This should be checking for "if not GCC or ICC", not for "if HP-UX"