mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-21 00:32:23 +00:00
86f9adb8be
This allows the (many) pseudo-instructions we have that map onto a single real instruction to have their expansion during MC lowering handled automatically instead of the current cumbersome manual expansion required. These sorts of pseudos are common when an instruction is used in situations that require different MachineInstr flags (isTerminator, isBranch, et. al.) than the generic instruction description has. For example, using a move to the PC to implement a branch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134704 91177308-0d34-0410-b5e6-96231b3b80d8
2283 lines
75 KiB
Makefile
2283 lines
75 KiB
Makefile
#===-- Makefile.rules - Common make rules for LLVM ---------*- Makefile -*--===#
|
|
#
|
|
# The LLVM Compiler Infrastructure
|
|
#
|
|
# This file 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. For details on how to use
|
|
# it properly, please see the document MakefileGuide.html in the docs directory.
|
|
#
|
|
#===-----------------------------------------------------------------------====#
|
|
|
|
################################################################################
|
|
# TARGETS: Define standard targets that can be invoked
|
|
################################################################################
|
|
|
|
#--------------------------------------------------------------------
|
|
# Define the various target sets
|
|
#--------------------------------------------------------------------
|
|
RecursiveTargets := all clean clean-all install uninstall install-bytecode \
|
|
unitcheck
|
|
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 dist-gzip dist-bzip2 \
|
|
dist-zip unittests
|
|
UserTargets := $(RecursiveTargets) $(LocalTargets) $(TopLevelTargets)
|
|
InternalTargets := preconditions distdir dist-hook
|
|
|
|
################################################################################
|
|
# INITIALIZATION: Basic things the makefile needs
|
|
################################################################################
|
|
|
|
#--------------------------------------------------------------------
|
|
# Set the VPATH so that we can find source files.
|
|
#--------------------------------------------------------------------
|
|
VPATH=$(PROJ_SRC_DIR)
|
|
|
|
#--------------------------------------------------------------------
|
|
# Reset the list of suffixes we know how to build.
|
|
#--------------------------------------------------------------------
|
|
.SUFFIXES:
|
|
.SUFFIXES: .c .cpp .cc .h .hpp .o .a .bc .td .ps .dot .ll .m .mm
|
|
.SUFFIXES: $(SHLIBEXT) $(SUFFIXES)
|
|
|
|
#--------------------------------------------------------------------
|
|
# Mark all of these targets as phony to avoid implicit rule search
|
|
#--------------------------------------------------------------------
|
|
.PHONY: $(UserTargets) $(InternalTargets)
|
|
|
|
#--------------------------------------------------------------------
|
|
# Make sure all the user-target rules are double colon rules and
|
|
# they are defined first.
|
|
#--------------------------------------------------------------------
|
|
|
|
$(UserTargets)::
|
|
|
|
################################################################################
|
|
# PRECONDITIONS: that which must be built/checked first
|
|
################################################################################
|
|
|
|
SrcMakefiles := $(filter %Makefile %Makefile.tests,\
|
|
$(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
|
|
|
|
preconditions: $(PreConditions)
|
|
|
|
#------------------------------------------------------------------------
|
|
# Make sure the BUILT_SOURCES are built first
|
|
#------------------------------------------------------------------------
|
|
$(filter-out clean clean-local,$(UserTargets)):: $(BUILT_SOURCES)
|
|
|
|
clean-all-local::
|
|
ifneq ($(strip $(BUILT_SOURCES)),)
|
|
-$(Verb) $(RM) -f $(BUILT_SOURCES)
|
|
endif
|
|
|
|
ifneq ($(PROJ_OBJ_ROOT),$(PROJ_SRC_ROOT))
|
|
spotless:
|
|
$(Verb) if test -x config.status ; then \
|
|
$(EchoCmd) Wiping out $(PROJ_OBJ_ROOT) ; \
|
|
$(MKDIR) .spotless.save ; \
|
|
$(MV) config.status .spotless.save ; \
|
|
$(MV) mklib .spotless.save ; \
|
|
$(MV) projects .spotless.save ; \
|
|
$(RM) -rf * ; \
|
|
$(MV) .spotless.save/config.status . ; \
|
|
$(MV) .spotless.save/mklib . ; \
|
|
$(MV) .spotless.save/projects . ; \
|
|
$(RM) -rf .spotless.save ; \
|
|
$(EchoCmd) Rebuilding configuration of $(PROJ_OBJ_ROOT) ; \
|
|
$(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
|
|
$(ConfigStatusScript) ; \
|
|
else \
|
|
$(EchoCmd) "make spotless" can only be run from $(PROJ_OBJ_ROOT); \
|
|
fi
|
|
else
|
|
spotless:
|
|
$(EchoCmd) "spotless target not supported for objdir == srcdir"
|
|
endif
|
|
|
|
$(BUILT_SOURCES) : $(ObjMakefiles)
|
|
|
|
#------------------------------------------------------------------------
|
|
# Make sure we're not using a stale configuration
|
|
#------------------------------------------------------------------------
|
|
reconfigure:
|
|
$(Echo) Reconfiguring $(PROJ_OBJ_ROOT)
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) && \
|
|
$(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
|
|
$(ConfigStatusScript)
|
|
|
|
.PRECIOUS: $(ConfigStatusScript)
|
|
$(ConfigStatusScript): $(ConfigureScript)
|
|
$(Echo) Reconfiguring with $<
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) && \
|
|
$(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
|
|
$(ConfigStatusScript)
|
|
|
|
#------------------------------------------------------------------------
|
|
# Make sure the configuration makefile is up to date
|
|
#------------------------------------------------------------------------
|
|
ifneq ($(MakefileConfigIn),)
|
|
$(MakefileConfig): $(MakefileConfigIn) $(ConfigStatusScript)
|
|
$(Echo) Regenerating $@
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ConfigStatusScript) Makefile.config
|
|
endif
|
|
|
|
ifneq ($(MakefileCommonIn),)
|
|
$(MakefileCommon): $(MakefileCommonIn) $(ConfigStatusScript)
|
|
$(Echo) Regenerating $@
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ConfigStatusScript) Makefile.common
|
|
endif
|
|
|
|
#------------------------------------------------------------------------
|
|
# 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
|
|
#------------------------------------------------------------------------
|
|
ifndef PROJ_MAKEFILE
|
|
PROJ_MAKEFILE := $(PROJ_SRC_DIR)/Makefile
|
|
endif
|
|
|
|
ifneq ($(PROJ_OBJ_DIR),$(PROJ_SRC_DIR))
|
|
|
|
Makefile: $(PROJ_MAKEFILE) $(ExtraMakefiles)
|
|
$(Echo) "Updating Makefile"
|
|
$(Verb) $(MKDIR) $(@D)
|
|
$(Verb) $(CP) -f $< $@
|
|
|
|
# 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.
|
|
$(PROJ_OBJ_DIR)/Makefile% : $(PROJ_MAKEFILE)%
|
|
@case '$?' in \
|
|
*Makefile.rules) ;; \
|
|
*.in) ;; \
|
|
*) $(EchoCmd) "Updating $(@F)" ; \
|
|
$(MKDIR) $(@D) ; \
|
|
$(CP) -f $< $@ ;; \
|
|
esac
|
|
|
|
endif
|
|
|
|
#------------------------------------------------------------------------
|
|
# Set up the basic dependencies
|
|
#------------------------------------------------------------------------
|
|
$(UserTargets):: $(PreConditions)
|
|
|
|
all:: all-local
|
|
clean:: clean-local
|
|
clean-all:: clean-local clean-all-local
|
|
install:: install-local
|
|
uninstall:: uninstall-local
|
|
install-local:: all-local
|
|
install-bytecode:: install-bytecode-local
|
|
|
|
###############################################################################
|
|
# LLVMC: Provide rules for compiling llvmc-based driver
|
|
###############################################################################
|
|
|
|
ifdef LLVMC_BASED_DRIVER
|
|
|
|
TOOLNAME = $(LLVMC_BASED_DRIVER)
|
|
|
|
LLVMLIBS = CompilerDriver.a
|
|
LINK_COMPONENTS = support
|
|
|
|
endif # LLVMC_BASED_DRIVER
|
|
|
|
###############################################################################
|
|
# VARIABLES: Set up various variables based on configuration data
|
|
###############################################################################
|
|
|
|
# Variable for if this make is for a "cleaning" target
|
|
ifneq ($(strip $(filter clean clean-local dist-clean,$(MAKECMDGOALS))),)
|
|
IS_CLEANING_TARGET=1
|
|
endif
|
|
|
|
#--------------------------------------------------------------------
|
|
# Variables derived from configuration we are building
|
|
#--------------------------------------------------------------------
|
|
|
|
CPP.Defines :=
|
|
ifeq ($(ENABLE_OPTIMIZED),1)
|
|
BuildMode := Release
|
|
# Don't use -fomit-frame-pointer on Darwin or FreeBSD.
|
|
ifneq ($(HOST_OS),FreeBSD)
|
|
ifneq ($(HOST_OS),Darwin)
|
|
OmitFramePointer := -fomit-frame-pointer
|
|
endif
|
|
endif
|
|
|
|
# Darwin requires -fstrict-aliasing to be explicitly enabled.
|
|
# Avoid -fstrict-aliasing on Darwin for now, there are unresolved issues
|
|
# with -fstrict-aliasing and ipa-type-escape radr://6756684
|
|
#ifeq ($(HOST_OS),Darwin)
|
|
# EXTRA_OPTIONS += -fstrict-aliasing -Wstrict-aliasing
|
|
#endif
|
|
CXX.Flags += $(OPTIMIZE_OPTION) $(OmitFramePointer)
|
|
C.Flags += $(OPTIMIZE_OPTION) $(OmitFramePointer)
|
|
LD.Flags += $(OPTIMIZE_OPTION)
|
|
ifdef DEBUG_SYMBOLS
|
|
BuildMode := $(BuildMode)+Debug
|
|
CXX.Flags += -g
|
|
C.Flags += -g
|
|
LD.Flags += -g
|
|
KEEP_SYMBOLS := 1
|
|
endif
|
|
else
|
|
ifdef NO_DEBUG_SYMBOLS
|
|
BuildMode := Unoptimized
|
|
CXX.Flags +=
|
|
C.Flags +=
|
|
LD.Flags +=
|
|
KEEP_SYMBOLS := 1
|
|
else
|
|
BuildMode := Debug
|
|
CXX.Flags += -g
|
|
C.Flags += -g
|
|
LD.Flags += -g
|
|
KEEP_SYMBOLS := 1
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ENABLE_PROFILING),1)
|
|
BuildMode := $(BuildMode)+Profile
|
|
CXX.Flags := $(filter-out -fomit-frame-pointer,$(CXX.Flags)) -pg -g
|
|
C.Flags := $(filter-out -fomit-frame-pointer,$(C.Flags)) -pg -g
|
|
LD.Flags := $(filter-out -fomit-frame-pointer,$(LD.Flags)) -pg -g
|
|
KEEP_SYMBOLS := 1
|
|
endif
|
|
|
|
#ifeq ($(ENABLE_VISIBILITY_INLINES_HIDDEN),1)
|
|
# CXX.Flags += -fvisibility-inlines-hidden
|
|
#endif
|
|
|
|
ifdef ENABLE_EXPENSIVE_CHECKS
|
|
# GNU libstdc++ uses RTTI if you define _GLIBCXX_DEBUG, which we did above.
|
|
# See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40160
|
|
REQUIRES_RTTI := 1
|
|
endif
|
|
|
|
# IF REQUIRES_EH=1 is specified then don't disable exceptions
|
|
ifndef REQUIRES_EH
|
|
CXX.Flags += -fno-exceptions
|
|
else
|
|
# If the library requires EH, it also requires RTTI.
|
|
REQUIRES_RTTI := 1
|
|
endif
|
|
|
|
ifdef REQUIRES_FRAME_POINTER
|
|
CXX.Flags := $(filter-out -fomit-frame-pointer,$(CXX.Flags))
|
|
C.Flags := $(filter-out -fomit-frame-pointer,$(C.Flags))
|
|
LD.Flags := $(filter-out -fomit-frame-pointer,$(LD.Flags))
|
|
endif
|
|
|
|
# If REQUIRES_RTTI=1 is specified then don't disable run-time type id.
|
|
ifneq ($(REQUIRES_RTTI), 1)
|
|
CXX.Flags += -fno-rtti
|
|
endif
|
|
|
|
ifeq ($(ENABLE_COVERAGE),1)
|
|
BuildMode := $(BuildMode)+Coverage
|
|
CXX.Flags += -ftest-coverage -fprofile-arcs
|
|
C.Flags += -ftest-coverage -fprofile-arcs
|
|
endif
|
|
|
|
# If DISABLE_ASSERTIONS=1 is specified (make command line or configured),
|
|
# then disable assertions by defining the appropriate preprocessor symbols.
|
|
ifeq ($(DISABLE_ASSERTIONS),1)
|
|
CPP.Defines += -DNDEBUG
|
|
else
|
|
BuildMode := $(BuildMode)+Asserts
|
|
CPP.Defines += -D_DEBUG
|
|
endif
|
|
|
|
# If ENABLE_EXPENSIVE_CHECKS=1 is specified (make command line or
|
|
# configured), then enable expensive checks by defining the
|
|
# appropriate preprocessor symbols.
|
|
ifeq ($(ENABLE_EXPENSIVE_CHECKS),1)
|
|
BuildMode := $(BuildMode)+Checks
|
|
CPP.Defines += -D_GLIBCXX_DEBUG -DXDEBUG
|
|
endif
|
|
|
|
# LOADABLE_MODULE implies several other things so we force them to be
|
|
# defined/on.
|
|
ifdef LOADABLE_MODULE
|
|
SHARED_LIBRARY := 1
|
|
LINK_LIBS_IN_SHARED := 1
|
|
endif
|
|
|
|
ifdef SHARED_LIBRARY
|
|
ENABLE_PIC := 1
|
|
PIC_FLAG = "(PIC)"
|
|
endif
|
|
|
|
ifeq ($(ENABLE_PIC),1)
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
# Nothing. Win32 defaults to PIC and warns when given -fPIC
|
|
else
|
|
ifeq ($(HOST_OS),Darwin)
|
|
# Common symbols not allowed in dylib files
|
|
CXX.Flags += -fno-common
|
|
C.Flags += -fno-common
|
|
else
|
|
# Linux and others; pass -fPIC
|
|
CXX.Flags += -fPIC
|
|
C.Flags += -fPIC
|
|
endif
|
|
endif
|
|
else
|
|
ifeq ($(HOST_OS),Darwin)
|
|
CXX.Flags += -mdynamic-no-pic
|
|
C.Flags += -mdynamic-no-pic
|
|
endif
|
|
endif
|
|
|
|
# Support makefile variable to disable any kind of timestamp/non-deterministic
|
|
# info from being used in the build.
|
|
ifeq ($(ENABLE_TIMESTAMPS),1)
|
|
DOTDIR_TIMESTAMP_COMMAND := $(DATE)
|
|
else
|
|
DOTDIR_TIMESTAMP_COMMAND := echo 'Created.'
|
|
endif
|
|
|
|
ifeq ($(HOST_OS),MingW)
|
|
# Work around PR4957
|
|
CPP.Defines += -D__NO_CTYPE_INLINE
|
|
ifeq ($(LLVM_CROSS_COMPILING),1)
|
|
# Work around http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=525016
|
|
ifdef TOOLNAME
|
|
LD.Flags += -Wl,--allow-multiple-definition
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
CXX.Flags += -Woverloaded-virtual
|
|
CPP.BaseFlags += $(CPP.Defines)
|
|
AR.Flags := cru
|
|
|
|
# Make Floating point IEEE compliant on Alpha.
|
|
ifeq ($(ARCH),Alpha)
|
|
CXX.Flags += -mieee
|
|
CPP.BaseFlags += -mieee
|
|
ifeq ($(ENABLE_PIC),0)
|
|
CXX.Flags += -fPIC
|
|
CPP.BaseFlags += -fPIC
|
|
endif
|
|
|
|
LD.Flags += -Wl,--no-relax
|
|
endif
|
|
|
|
# GNU ld/PECOFF accepts but ignores them below;
|
|
# --version-script
|
|
# --export-dynamic
|
|
# --rpath
|
|
# FIXME: autoconf should be aware of them.
|
|
ifneq (,$(filter $(HOST_OS),Cygwin MingW))
|
|
HAVE_LINK_VERSION_SCRIPT := 0
|
|
RPATH :=
|
|
RDYNAMIC := -Wl,--export-all-symbols
|
|
endif
|
|
|
|
#--------------------------------------------------------------------
|
|
# Directory locations
|
|
#--------------------------------------------------------------------
|
|
TargetMode :=
|
|
ifeq ($(LLVM_CROSS_COMPILING),1)
|
|
BuildLLVMToolDir := $(LLVM_OBJ_ROOT)/BuildTools/$(BuildMode)/bin
|
|
endif
|
|
|
|
ObjRootDir := $(PROJ_OBJ_DIR)/$(BuildMode)
|
|
ObjDir := $(ObjRootDir)
|
|
LibDir := $(PROJ_OBJ_ROOT)/$(BuildMode)/lib
|
|
ToolDir := $(PROJ_OBJ_ROOT)/$(BuildMode)/bin
|
|
ExmplDir := $(PROJ_OBJ_ROOT)/$(BuildMode)/examples
|
|
LLVMLibDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/lib
|
|
LLVMToolDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/bin
|
|
LLVMExmplDir:= $(LLVM_OBJ_ROOT)/$(BuildMode)/examples
|
|
|
|
#--------------------------------------------------------------------
|
|
# Locations of shared libraries
|
|
#--------------------------------------------------------------------
|
|
|
|
SharedPrefix := lib
|
|
SharedLibDir := $(LibDir)
|
|
LLVMSharedLibDir := $(LLVMLibDir)
|
|
|
|
# Win32.DLL prefers to be located on the "PATH" of binaries.
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
SharedLibDir := $(ToolDir)
|
|
LLVMSharedLibDir := $(LLVMToolDir)
|
|
|
|
ifeq ($(HOST_OS),Cygwin)
|
|
SharedPrefix := cyg
|
|
else
|
|
SharedPrefix :=
|
|
endif
|
|
endif
|
|
|
|
#--------------------------------------------------------------------
|
|
# LLVM Capable Compiler
|
|
#--------------------------------------------------------------------
|
|
|
|
ifneq ($(findstring llvm-gcc,$(LLVMCC_OPTION)),)
|
|
LLVMCC := $(LLVMGCC)
|
|
LLVMCXX := $(LLVMGXX)
|
|
else
|
|
ifneq ($(findstring clang,$(LLVMCC_OPTION)),)
|
|
ifneq ($(CLANGPATH),)
|
|
LLVMCC := $(CLANGPATH)
|
|
LLVMCXX := $(CLANGXXPATH)
|
|
else
|
|
ifeq ($(ENABLE_BUILT_CLANG),1)
|
|
LLVMCC := $(LLVMToolDir)/clang
|
|
LLVMCXX := $(LLVMToolDir)/clang++
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#--------------------------------------------------------------------
|
|
# Full Paths To Compiled Tools and Utilities
|
|
#--------------------------------------------------------------------
|
|
EchoCmd = $(ECHO) llvm[$(MAKELEVEL)]:
|
|
Echo = @$(EchoCmd)
|
|
ifndef LLVMAS
|
|
LLVMAS := $(LLVMToolDir)/llvm-as$(EXEEXT)
|
|
endif
|
|
ifndef TBLGEN
|
|
ifeq ($(LLVM_CROSS_COMPILING),1)
|
|
TBLGEN := $(BuildLLVMToolDir)/tblgen$(BUILD_EXEEXT)
|
|
else
|
|
TBLGEN := $(LLVMToolDir)/tblgen$(EXEEXT)
|
|
endif
|
|
endif
|
|
LLVM_CONFIG := $(LLVMToolDir)/llvm-config
|
|
ifndef LLVMLD
|
|
LLVMLD := $(LLVMToolDir)/llvm-ld$(EXEEXT)
|
|
endif
|
|
ifndef LLVMDIS
|
|
LLVMDIS := $(LLVMToolDir)/llvm-dis$(EXEEXT)
|
|
endif
|
|
ifndef LLI
|
|
LLI := $(LLVMToolDir)/lli$(EXEEXT)
|
|
endif
|
|
ifndef LLC
|
|
LLC := $(LLVMToolDir)/llc$(EXEEXT)
|
|
endif
|
|
ifndef LOPT
|
|
LOPT := $(LLVMToolDir)/opt$(EXEEXT)
|
|
endif
|
|
ifndef LBUGPOINT
|
|
LBUGPOINT := $(LLVMToolDir)/bugpoint$(EXEEXT)
|
|
endif
|
|
|
|
#--------------------------------------------------------------------
|
|
# Adjust to user's request
|
|
#--------------------------------------------------------------------
|
|
|
|
ifeq ($(HOST_OS),Darwin)
|
|
DARWIN_VERSION := `sw_vers -productVersion`
|
|
# Strip a number like 10.4.7 to 10.4
|
|
DARWIN_VERSION := $(shell echo $(DARWIN_VERSION)| sed -E 's/(10.[0-9]).*/\1/')
|
|
# Get "4" out of 10.4 for later pieces in the makefile.
|
|
DARWIN_MAJVERS := $(shell echo $(DARWIN_VERSION)| sed -E 's/10.([0-9]).*/\1/')
|
|
|
|
LoadableModuleOptions := -Wl,-flat_namespace -Wl,-undefined,suppress
|
|
SharedLinkOptions := -dynamiclib
|
|
ifneq ($(ARCH),ARM)
|
|
SharedLinkOptions += -mmacosx-version-min=$(DARWIN_VERSION)
|
|
endif
|
|
else
|
|
SharedLinkOptions=-shared
|
|
endif
|
|
|
|
ifeq ($(TARGET_OS),Darwin)
|
|
ifneq ($(ARCH),ARM)
|
|
TargetCommonOpts += -mmacosx-version-min=$(DARWIN_VERSION)
|
|
endif
|
|
endif
|
|
|
|
ifdef SHARED_LIBRARY
|
|
ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
ifneq ($(HOST_OS),Darwin)
|
|
LD.Flags += $(RPATH) -Wl,'$$ORIGIN'
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifdef TOOL_VERBOSE
|
|
C.Flags += -v
|
|
CXX.Flags += -v
|
|
LD.Flags += -v
|
|
VERBOSE := 1
|
|
endif
|
|
|
|
# Adjust settings for verbose mode
|
|
ifndef VERBOSE
|
|
Verb := @
|
|
AR.Flags += >/dev/null 2>/dev/null
|
|
ConfigureScriptFLAGS += >$(PROJ_OBJ_DIR)/configure.out 2>&1
|
|
else
|
|
ConfigureScriptFLAGS :=
|
|
endif
|
|
|
|
# By default, strip symbol information from executable
|
|
ifndef KEEP_SYMBOLS
|
|
Strip := $(PLATFORMSTRIPOPTS)
|
|
StripWarnMsg := "(without symbols)"
|
|
Install.StripFlag += -s
|
|
endif
|
|
|
|
ifdef TOOL_NO_EXPORTS
|
|
DynamicFlags :=
|
|
else
|
|
DynamicFlag := $(RDYNAMIC)
|
|
endif
|
|
|
|
# Adjust linker flags for building an executable
|
|
ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
ifneq ($(HOST_OS), Darwin)
|
|
ifdef TOOLNAME
|
|
LD.Flags += $(RPATH) -Wl,'$$ORIGIN/../lib'
|
|
ifdef EXAMPLE_TOOL
|
|
LD.Flags += $(RPATH) -Wl,$(ExmplDir) $(DynamicFlag)
|
|
else
|
|
LD.Flags += $(RPATH) -Wl,$(ToolDir) $(DynamicFlag)
|
|
endif
|
|
endif
|
|
else
|
|
ifneq ($(DARWIN_MAJVERS),4)
|
|
LD.Flags += $(RPATH) -Wl,@executable_path/../lib
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
|
|
#----------------------------------------------------------
|
|
# Options To Invoke Tools
|
|
#----------------------------------------------------------
|
|
|
|
ifdef EXTRA_LD_OPTIONS
|
|
LD.Flags += $(EXTRA_LD_OPTIONS)
|
|
endif
|
|
|
|
ifndef NO_PEDANTIC
|
|
CompileCommonOpts += -pedantic -Wno-long-long
|
|
endif
|
|
CompileCommonOpts += -Wall -W -Wno-unused-parameter -Wwrite-strings \
|
|
$(EXTRA_OPTIONS)
|
|
# Enable cast-qual for C++; the workaround is to use const_cast.
|
|
CXX.Flags += -Wcast-qual
|
|
|
|
ifeq ($(HOST_OS),HP-UX)
|
|
CompileCommonOpts := -D_REENTRANT -D_HPUX_SOURCE
|
|
endif
|
|
|
|
# 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.
|
|
ifdef UNIVERSAL
|
|
ifndef UNIVERSAL_ARCH
|
|
UNIVERSAL_ARCH := i386 ppc
|
|
endif
|
|
UNIVERSAL_ARCH_OPTIONS := $(UNIVERSAL_ARCH:%=-arch %)
|
|
CompileCommonOpts += $(UNIVERSAL_ARCH_OPTIONS)
|
|
ifdef UNIVERSAL_SDK_PATH
|
|
CompileCommonOpts += -isysroot $(UNIVERSAL_SDK_PATH)
|
|
endif
|
|
|
|
# Building universal cannot compute dependencies automatically.
|
|
DISABLE_AUTO_DEPENDENCIES=1
|
|
else
|
|
ifeq ($(TARGET_OS),Darwin)
|
|
ifeq ($(ARCH),x86_64)
|
|
TargetCommonOpts = -m64
|
|
else
|
|
ifeq ($(ARCH),x86)
|
|
TargetCommonOpts = -m32
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(HOST_OS),SunOS)
|
|
CPP.BaseFlags += -include llvm/Support/Solaris.h
|
|
endif
|
|
|
|
ifeq ($(HOST_OS),AuroraUX)
|
|
CPP.BaseFlags += -include llvm/Support/Solaris.h
|
|
endif # !HOST_OS - AuroraUX.
|
|
|
|
LD.Flags += -L$(LibDir) -L$(LLVMLibDir)
|
|
CPP.BaseFlags += -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS
|
|
# All -I flags should go here, so that they don't confuse llvm-config.
|
|
CPP.Flags += $(sort -I$(PROJ_OBJ_DIR) -I$(PROJ_SRC_DIR) \
|
|
$(patsubst %,-I%/include,\
|
|
$(PROJ_OBJ_ROOT) $(PROJ_SRC_ROOT) \
|
|
$(LLVM_OBJ_ROOT) $(LLVM_SRC_ROOT))) \
|
|
$(CPP.BaseFlags)
|
|
|
|
# SHOW_DIAGNOSTICS support.
|
|
ifeq ($(SHOW_DIAGNOSTICS),1)
|
|
Compile.Wrapper := env CC_LOG_DIAGNOSTICS=1 \
|
|
CC_LOG_DIAGNOSTICS_FILE="$(LLVM_OBJ_ROOT)/$(BuildMode)/diags"
|
|
else
|
|
Compile.Wrapper :=
|
|
endif
|
|
|
|
ifeq ($(BUILD_COMPONENT), 1)
|
|
Compile.C = $(Compile.Wrapper) \
|
|
$(BUILD_CC) $(CPP.Flags) $(C.Flags) $(CFLAGS) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) -c
|
|
Compile.CXX = $(Compile.Wrapper) \
|
|
$(BUILD_CXX) $(CPP.Flags) $(CXX.Flags) $(CXXFLAGS) \
|
|
$(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) -c
|
|
Preprocess.CXX= $(Compile.Wrapper) \
|
|
$(BUILD_CXX) $(CPP.Flags) $(CPPFLAGS) $(TargetCommonOpts) \
|
|
$(CompileCommonOpts) $(CXX.Flags) -E
|
|
Link = $(Compile.Wrapper) \
|
|
$(BUILD_CXX) $(CPP.Flags) $(CXX.Flags) $(CXXFLAGS) \
|
|
$(LD.Flags) $(LDFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) $(Strip)
|
|
else
|
|
Compile.C = $(Compile.Wrapper) \
|
|
$(CC) $(CPP.Flags) $(C.Flags) $(CFLAGS) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) -c
|
|
Compile.CXX = $(Compile.Wrapper) \
|
|
$(CXX) $(CPP.Flags) $(CXX.Flags) $(CXXFLAGS) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) -c
|
|
Preprocess.CXX= $(Compile.Wrapper) \
|
|
$(CXX) $(CPP.Flags) $(TargetCommonOpts) $(CPPFLAGS) \
|
|
$(CompileCommonOpts) $(CXX.Flags) -E
|
|
Link = $(Compile.Wrapper) \
|
|
$(CXX) $(CPP.Flags) $(CXX.Flags) $(CXXFLAGS) $(LD.Flags) \
|
|
$(LDFLAGS) $(TargetCommonOpts) $(CompileCommonOpts) $(Strip)
|
|
endif
|
|
|
|
BCCompile.C = $(LLVMCC) $(CPP.Flags) $(C.Flags) $(CFLAGS) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts)
|
|
Preprocess.C = $(CC) $(CPP.Flags) $(C.Flags) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts) -E
|
|
|
|
BCCompile.CXX = $(LLVMCXX) $(CPP.Flags) $(CXX.Flags) $(CXXFLAGS) $(CPPFLAGS) \
|
|
$(TargetCommonOpts) $(CompileCommonOpts)
|
|
|
|
ProgInstall = $(INSTALL) $(Install.StripFlag) -m 0755
|
|
ScriptInstall = $(INSTALL) -m 0755
|
|
DataInstall = $(INSTALL) -m 0644
|
|
|
|
# When compiling under Mingw/Cygwin, the tblgen tool expects Windows
|
|
# paths. In this case, the SYSPATH function (defined in
|
|
# Makefile.config) transforms Unix paths into Windows paths.
|
|
TableGen = $(TBLGEN) -I $(call SYSPATH, $(PROJ_SRC_DIR)) \
|
|
-I $(call SYSPATH, $(LLVM_SRC_ROOT)/include) \
|
|
-I $(call SYSPATH, $(PROJ_SRC_ROOT)/include) \
|
|
-I $(call SYSPATH, $(PROJ_SRC_ROOT)/lib/Target)
|
|
|
|
Archive = $(AR) $(AR.Flags)
|
|
LArchive = $(LLVMToolDir)/llvm-ar rcsf
|
|
ifdef RANLIB
|
|
Ranlib = $(RANLIB)
|
|
else
|
|
Ranlib = ranlib
|
|
endif
|
|
|
|
AliasTool = ln -s
|
|
|
|
#----------------------------------------------------------
|
|
# Get the list of source files and compute object file
|
|
# names from them.
|
|
#----------------------------------------------------------
|
|
|
|
ifndef SOURCES
|
|
Sources := $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp \
|
|
$(PROJ_SRC_DIR)/*.cc $(PROJ_SRC_DIR)/*.c))
|
|
else
|
|
Sources := $(SOURCES)
|
|
endif
|
|
|
|
ifdef BUILT_SOURCES
|
|
Sources += $(filter %.cpp %.c %.cc,$(BUILT_SOURCES))
|
|
endif
|
|
|
|
BaseNameSources := $(sort $(basename $(Sources)))
|
|
|
|
ObjectsO := $(BaseNameSources:%=$(ObjDir)/%.o)
|
|
ObjectsBC := $(BaseNameSources:%=$(ObjDir)/%.bc)
|
|
|
|
#----------------------------------------------------------
|
|
# For Mingw MSYS bash and Python/w32:
|
|
#
|
|
# $(ECHOPATH) prints DOSish pathstring.
|
|
# ex) $(ECHOPATH) /include/sys/types.h
|
|
# --> C:/mingw/include/sys/types.h
|
|
# built-in "echo" does not transform path to DOSish path.
|
|
#
|
|
# FIXME: It would not be needed when MSYS's python
|
|
# were provided.
|
|
#----------------------------------------------------------
|
|
|
|
ifeq (-mingw32,$(findstring -mingw32,$(BUILD_TRIPLE)))
|
|
ECHOPATH := $(Verb)python -u -c "import sys;print ' '.join(sys.argv[1:])"
|
|
else
|
|
ECHOPATH := $(Verb)$(ECHO)
|
|
endif
|
|
|
|
###############################################################################
|
|
# DIRECTORIES: Handle recursive descent of directory structure
|
|
###############################################################################
|
|
|
|
#---------------------------------------------------------
|
|
# Provide rules to make install dirs. This must be early
|
|
# in the file so they get built before dependencies
|
|
#---------------------------------------------------------
|
|
|
|
$(DESTDIR)$(PROJ_bindir) $(DESTDIR)$(PROJ_libdir) $(DESTDIR)$(PROJ_includedir) $(DESTDIR)$(PROJ_etcdir)::
|
|
$(Verb) $(MKDIR) $@
|
|
|
|
# To create other directories, as needed, and timestamp their creation
|
|
%/.dir:
|
|
$(Verb) $(MKDIR) $* > /dev/null
|
|
$(Verb) $(DOTDIR_TIMESTAMP_COMMAND) > $@
|
|
|
|
.PRECIOUS: $(ObjDir)/.dir $(LibDir)/.dir $(ToolDir)/.dir $(ExmplDir)/.dir
|
|
.PRECIOUS: $(LLVMLibDir)/.dir $(LLVMToolDir)/.dir $(LLVMExmplDir)/.dir
|
|
|
|
#---------------------------------------------------------
|
|
# Handle the DIRS options for sequential construction
|
|
#---------------------------------------------------------
|
|
|
|
SubDirs :=
|
|
ifdef DIRS
|
|
SubDirs += $(DIRS)
|
|
|
|
ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
|
|
$(RecursiveTargets)::
|
|
$(Verb) for dir in $(DIRS); do \
|
|
if ([ ! -f $$dir/Makefile ] || \
|
|
command test $$dir/Makefile -ot $(PROJ_SRC_DIR)/$$dir/Makefile ); then \
|
|
$(MKDIR) $$dir; \
|
|
$(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
|
|
fi; \
|
|
($(MAKE) -C $$dir $@ ) || exit 1; \
|
|
done
|
|
else
|
|
$(RecursiveTargets)::
|
|
$(Verb) for dir in $(DIRS); do \
|
|
($(MAKE) -C $$dir $@ ) || exit 1; \
|
|
done
|
|
endif
|
|
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Handle the EXPERIMENTAL_DIRS options ensuring success
|
|
# after each directory is built.
|
|
#---------------------------------------------------------
|
|
ifdef EXPERIMENTAL_DIRS
|
|
$(RecursiveTargets)::
|
|
$(Verb) for dir in $(EXPERIMENTAL_DIRS); do \
|
|
if ([ ! -f $$dir/Makefile ] || \
|
|
command test $$dir/Makefile -ot $(PROJ_SRC_DIR)/$$dir/Makefile ); then \
|
|
$(MKDIR) $$dir; \
|
|
$(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
|
|
fi; \
|
|
($(MAKE) -C $$dir $@ ) || exit 0; \
|
|
done
|
|
endif
|
|
|
|
#-----------------------------------------------------------
|
|
# Handle the OPTIONAL_PARALLEL_DIRS options for optional parallel construction
|
|
#-----------------------------------------------------------
|
|
ifdef OPTIONAL_PARALLEL_DIRS
|
|
PARALLEL_DIRS += $(foreach T,$(OPTIONAL_PARALLEL_DIRS),$(shell test -d $(PROJ_SRC_DIR)/$(T) && echo "$(T)"))
|
|
endif
|
|
|
|
#-----------------------------------------------------------
|
|
# Handle the PARALLEL_DIRS options for parallel construction
|
|
#-----------------------------------------------------------
|
|
ifdef PARALLEL_DIRS
|
|
|
|
SubDirs += $(PARALLEL_DIRS)
|
|
|
|
# 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))
|
|
uninstall:: $(addsuffix /.makeuninstall,$(PARALLEL_DIRS))
|
|
install-bytecode :: $(addsuffix /.makeinstall-bytecode,$(PARALLEL_DIRS))
|
|
unitcheck:: $(addsuffix /.makeunitcheck,$(PARALLEL_DIRS))
|
|
|
|
ParallelTargets := $(foreach T,$(RecursiveTargets),%/.make$(T))
|
|
|
|
$(ParallelTargets) :
|
|
$(Verb) if ([ ! -f $(@D)/Makefile ] || \
|
|
command test $(@D)/Makefile -ot \
|
|
$(PROJ_SRC_DIR)/$(@D)/Makefile ); then \
|
|
$(MKDIR) $(@D); \
|
|
$(CP) $(PROJ_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \
|
|
fi; \
|
|
$(MAKE) -C $(@D) $(subst $(@D)/.make,,$@)
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Handle the OPTIONAL_DIRS options for directores that may
|
|
# or may not exist.
|
|
#---------------------------------------------------------
|
|
ifdef OPTIONAL_DIRS
|
|
|
|
SubDirs += $(OPTIONAL_DIRS)
|
|
|
|
ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
|
|
$(RecursiveTargets)::
|
|
$(Verb) for dir in $(OPTIONAL_DIRS); do \
|
|
if [ -d $(PROJ_SRC_DIR)/$$dir ]; then\
|
|
if ([ ! -f $$dir/Makefile ] || \
|
|
command test $$dir/Makefile -ot $(PROJ_SRC_DIR)/$$dir/Makefile ); then \
|
|
$(MKDIR) $$dir; \
|
|
$(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
|
|
fi; \
|
|
($(MAKE) -C$$dir $@ ) || exit 1; \
|
|
fi \
|
|
done
|
|
else
|
|
$(RecursiveTargets)::
|
|
$(Verb) for dir in $(OPTIONAL_DIRS); do \
|
|
if [ -d $(PROJ_SRC_DIR)/$$dir ]; then\
|
|
($(MAKE) -C$$dir $@ ) || exit 1; \
|
|
fi \
|
|
done
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Handle the CONFIG_FILES options
|
|
#---------------------------------------------------------
|
|
ifdef CONFIG_FILES
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) UnInstall circumvented with NO_INSTALL
|
|
else
|
|
install-local:: $(DESTDIR)$(PROJ_etcdir) $(CONFIG_FILES)
|
|
$(Echo) Installing Configuration Files To $(DESTDIR)$(PROJ_etcdir)
|
|
$(Verb)for file in $(CONFIG_FILES); do \
|
|
if test -f $(PROJ_OBJ_DIR)/$${file} ; then \
|
|
$(DataInstall) $(PROJ_OBJ_DIR)/$${file} $(DESTDIR)$(PROJ_etcdir) ; \
|
|
elif test -f $(PROJ_SRC_DIR)/$${file} ; then \
|
|
$(DataInstall) $(PROJ_SRC_DIR)/$${file} $(DESTDIR)$(PROJ_etcdir) ; \
|
|
else \
|
|
$(ECHO) Error: cannot find config file $${file}. ; \
|
|
fi \
|
|
done
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling Configuration Files From $(DESTDIR)$(PROJ_etcdir)
|
|
$(Verb)for file in $(CONFIG_FILES); do \
|
|
$(RM) -f $(DESTDIR)$(PROJ_etcdir)/$${file} ; \
|
|
done
|
|
endif
|
|
|
|
endif
|
|
|
|
###############################################################################
|
|
# Set up variables for building libraries
|
|
###############################################################################
|
|
|
|
#---------------------------------------------------------
|
|
# 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).
|
|
#---------------------------------------------------------
|
|
|
|
ifdef USEDLIBS
|
|
ProjLibsOptions := $(patsubst %.a.o, -l%, $(addsuffix .o, $(USEDLIBS)))
|
|
ProjLibsOptions := $(patsubst %.o, $(LibDir)/%.o, $(ProjLibsOptions))
|
|
ProjUsedLibs := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(USEDLIBS)))
|
|
ProjLibsPaths := $(addprefix $(LibDir)/,$(ProjUsedLibs))
|
|
endif
|
|
|
|
ifdef LLVMLIBS
|
|
LLVMLibsOptions := $(patsubst %.a.o, -l%, $(addsuffix .o, $(LLVMLIBS)))
|
|
LLVMLibsOptions := $(patsubst %.o, $(LLVMLibDir)/%.o, $(LLVMLibsOptions))
|
|
LLVMUsedLibs := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(LLVMLIBS)))
|
|
LLVMLibsPaths := $(addprefix $(LLVMLibDir)/,$(LLVMUsedLibs))
|
|
endif
|
|
|
|
# Loadable module for Win32 requires all symbols resolved for linking.
|
|
# Then all symbols in LLVM.dll will be available.
|
|
ifeq ($(ENABLE_SHARED),1)
|
|
ifdef LOADABLE_MODULE
|
|
ifneq (,$(filter $(HOST_OS),Cygwin MingW))
|
|
LINK_COMPONENTS += all
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifndef IS_CLEANING_TARGET
|
|
ifdef LINK_COMPONENTS
|
|
|
|
# If LLVM_CONFIG doesn't exist, build it. This can happen if you do a make
|
|
# clean in tools, then do a make in tools (instead of at the top level).
|
|
$(LLVM_CONFIG):
|
|
@echo "*** llvm-config doesn't exist - rebuilding it."
|
|
@$(MAKE) -C $(PROJ_OBJ_ROOT)/tools/llvm-config
|
|
|
|
$(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT): $(LLVM_CONFIG)
|
|
|
|
ifeq ($(ENABLE_SHARED), 1)
|
|
# We can take the "auto-import" feature to get rid of using dllimport.
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
LLVMLibsOptions += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc \
|
|
-L $(SharedLibDir)
|
|
endif
|
|
LLVMLibsOptions += -lLLVM-$(LLVMVersion)
|
|
LLVMLibsPaths += $(SharedLibDir)/$(SharedPrefix)LLVM-$(LLVMVersion)$(SHLIBEXT)
|
|
else
|
|
|
|
ifndef NO_LLVM_CONFIG
|
|
LLVMConfigLibs := $(shell $(LLVM_CONFIG) --libs $(LINK_COMPONENTS) || echo Error)
|
|
ifeq ($(LLVMConfigLibs),Error)
|
|
$(error llvm-config --libs failed)
|
|
endif
|
|
LLVMLibsOptions += $(LLVMConfigLibs)
|
|
LLVMConfigLibfiles := $(shell $(LLVM_CONFIG) --libfiles $(LINK_COMPONENTS) || echo Error)
|
|
ifeq ($(LLVMConfigLibfiles),Error)
|
|
$(error llvm-config --libfiles failed)
|
|
endif
|
|
LLVMLibsPaths += $(LLVM_CONFIG) $(LLVMConfigLibfiles)
|
|
endif
|
|
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# Set up the library exports file.
|
|
ifdef EXPORTED_SYMBOL_FILE
|
|
|
|
# First, set up the native export file, which may differ from the source
|
|
# export file.
|
|
|
|
ifeq ($(HOST_OS),Darwin)
|
|
# Darwin convention prefixes symbols with underscores.
|
|
NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE)).sed
|
|
$(NativeExportsFile): $(EXPORTED_SYMBOL_FILE) $(ObjDir)/.dir
|
|
$(Verb) sed -e 's/^/_/' < $< > $@
|
|
clean-local::
|
|
-$(Verb) $(RM) -f $(NativeExportsFile)
|
|
else
|
|
ifeq ($(HAVE_LINK_VERSION_SCRIPT),1)
|
|
# Gold and BFD ld require a version script rather than a plain list.
|
|
NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE)).map
|
|
$(NativeExportsFile): $(EXPORTED_SYMBOL_FILE) $(ObjDir)/.dir
|
|
$(Verb) echo "{" > $@
|
|
$(Verb) grep -q "\<" $< && echo " global:" >> $@ || :
|
|
$(Verb) sed -e 's/$$/;/' -e 's/^/ /' < $< >> $@
|
|
ifneq ($(HOST_OS),OpenBSD)
|
|
$(Verb) echo " local: *;" >> $@
|
|
endif
|
|
$(Verb) echo "};" >> $@
|
|
clean-local::
|
|
-$(Verb) $(RM) -f $(NativeExportsFile)
|
|
else
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
# GNU ld Win32 accepts .DEF files that contain "DATA" entries.
|
|
NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE:.exports=.def))
|
|
$(NativeExportsFile): $(EXPORTED_SYMBOL_FILE) $(ObjDir)/.dir
|
|
$(Echo) Generating $(notdir $@)
|
|
$(Verb) $(ECHO) "EXPORTS" > $@
|
|
$(Verb) $(CAT) $< >> $@
|
|
clean-local::
|
|
-$(Verb) $(RM) -f $(NativeExportsFile)
|
|
else
|
|
# Default behavior: just use the exports file verbatim.
|
|
NativeExportsFile := $(EXPORTED_SYMBOL_FILE)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# Now add the linker command-line options to use the native export file.
|
|
|
|
# Darwin
|
|
ifeq ($(HOST_OS),Darwin)
|
|
LLVMLibsOptions += -Wl,-exported_symbols_list,$(NativeExportsFile)
|
|
endif
|
|
|
|
# gold, bfd ld, etc.
|
|
ifeq ($(HAVE_LINK_VERSION_SCRIPT),1)
|
|
LLVMLibsOptions += -Wl,--version-script,$(NativeExportsFile)
|
|
endif
|
|
|
|
# Windows
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
# LLVMLibsOptions is invalidated at processing tools/llvm-shlib.
|
|
SharedLinkOptions += $(NativeExportsFile)
|
|
endif
|
|
|
|
endif
|
|
|
|
###############################################################################
|
|
# Library Build Rules: Four ways to build a library
|
|
###############################################################################
|
|
|
|
#---------------------------------------------------------
|
|
# 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
|
|
ifeq ($(strip $(LLVMCC)),)
|
|
$(warning Modules require LLVM capable compiler but none is available ****)
|
|
else
|
|
|
|
Module := $(LibDir)/$(MODULE_NAME).bc
|
|
LinkModule := $(LLVMLD) -r
|
|
|
|
|
|
ifdef EXPORTED_SYMBOL_FILE
|
|
LinkModule += -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
|
|
endif
|
|
|
|
$(Module): $(BUILT_SOURCES) $(ObjectsBC) $(LibDir)/.dir $(LLVMLD)
|
|
$(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
|
|
ModuleDestDir := $(DESTDIR)$(PROJ_libdir)
|
|
endif
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
DestModule := $(ModuleDestDir)/$(MODULE_NAME).bc
|
|
|
|
install-module:: $(DestModule)
|
|
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
|
|
|
|
endif
|
|
endif
|
|
|
|
# if we're building a library ...
|
|
ifdef LIBRARYNAME
|
|
|
|
# Make sure there isn't any extraneous whitespace on the LIBRARYNAME option
|
|
LIBRARYNAME := $(strip $(LIBRARYNAME))
|
|
ifdef LOADABLE_MODULE
|
|
BaseLibName.A := $(LIBRARYNAME).a
|
|
BaseLibName.SO := $(LIBRARYNAME)$(SHLIBEXT)
|
|
else
|
|
BaseLibName.A := lib$(LIBRARYNAME).a
|
|
BaseLibName.SO := $(SharedPrefix)$(LIBRARYNAME)$(SHLIBEXT)
|
|
endif
|
|
LibName.A := $(LibDir)/$(BaseLibName.A)
|
|
LibName.SO := $(SharedLibDir)/$(BaseLibName.SO)
|
|
LibName.O := $(LibDir)/$(LIBRARYNAME).o
|
|
LibName.BCA:= $(LibDir)/lib$(LIBRARYNAME).bca
|
|
|
|
#---------------------------------------------------------
|
|
# 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 SHARED_LIBRARY
|
|
|
|
all-local:: $(LibName.SO)
|
|
|
|
ifdef EXPORTED_SYMBOL_FILE
|
|
$(LibName.SO): $(NativeExportsFile)
|
|
endif
|
|
|
|
ifdef LINK_LIBS_IN_SHARED
|
|
ifdef LOADABLE_MODULE
|
|
SharedLibKindMessage := "Loadable Module"
|
|
SharedLinkOptions := $(LoadableModuleOptions) $(SharedLinkOptions)
|
|
else
|
|
SharedLibKindMessage := "Shared Library"
|
|
endif
|
|
$(LibName.SO): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) $(SharedLibDir)/.dir
|
|
$(Echo) Linking $(BuildMode) $(SharedLibKindMessage) \
|
|
$(notdir $@)
|
|
$(Verb) $(Link) $(SharedLinkOptions) -o $@ $(ObjectsO) \
|
|
$(ProjLibsOptions) $(LLVMLibsOptions) $(LIBS)
|
|
else
|
|
$(LibName.SO): $(ObjectsO) $(SharedLibDir)/.dir
|
|
$(Echo) Linking $(BuildMode) Shared Library $(notdir $@)
|
|
$(Verb) $(Link) $(SharedLinkOptions) -o $@ $(ObjectsO)
|
|
endif
|
|
|
|
clean-local::
|
|
ifneq ($(strip $(LibName.SO)),)
|
|
-$(Verb) $(RM) -f $(LibName.SO)
|
|
endif
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
|
|
# Win32.DLL prefers to be located on the "PATH" of binaries.
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
|
|
DestSharedLibDir := $(DESTDIR)$(PROJ_bindir)
|
|
else
|
|
DestSharedLibDir := $(DESTDIR)$(PROJ_libdir)
|
|
endif
|
|
DestSharedLib := $(DestSharedLibDir)/$(BaseLibName.SO)
|
|
|
|
install-local:: $(DestSharedLib)
|
|
|
|
$(DestSharedLib): $(LibName.SO) $(DestSharedLibDir)
|
|
$(Echo) Installing $(BuildMode) Shared Library $(DestSharedLib)
|
|
$(Verb) $(INSTALL) $(LibName.SO) $(DestSharedLib)
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling $(BuildMode) Shared Library $(DestSharedLib)
|
|
-$(Verb) $(RM) -f $(DestSharedLibDir)/$(SharedPrefix)$(LIBRARYNAME).*
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# 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.
|
|
#---------------------------------------------------------
|
|
ifdef BYTECODE_LIBRARY
|
|
ifeq ($(strip $(LLVMCC)),)
|
|
$(warning Bytecode libraries require LLVM capable compiler but none is available ****)
|
|
else
|
|
|
|
all-local:: $(LibName.BCA)
|
|
|
|
ifdef EXPORTED_SYMBOL_FILE
|
|
BCLinkLib = $(LLVMLD) -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
|
|
|
|
$(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir $(LLVMLD) \
|
|
$(LLVMToolDir)/llvm-ar
|
|
$(Echo) Building $(BuildMode) Bytecode Archive $(notdir $@) \
|
|
"(internalize)"
|
|
$(Verb) $(BCLinkLib) -o $(ObjDir)/$(LIBRARYNAME).internalize $(ObjectsBC)
|
|
$(Verb) $(RM) -f $@
|
|
$(Verb) $(LArchive) $@ $(ObjDir)/$(LIBRARYNAME).internalize.bc
|
|
else
|
|
$(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir \
|
|
$(LLVMToolDir)/llvm-ar
|
|
$(Echo) Building $(BuildMode) Bytecode Archive $(notdir $@)
|
|
$(Verb) $(RM) -f $@
|
|
$(Verb) $(LArchive) $@ $(ObjectsBC)
|
|
|
|
endif
|
|
|
|
clean-local::
|
|
ifneq ($(strip $(LibName.BCA)),)
|
|
-$(Verb) $(RM) -f $(LibName.BCA)
|
|
endif
|
|
|
|
ifdef BYTECODE_DESTINATION
|
|
BytecodeDestDir := $(BYTECODE_DESTINATION)
|
|
else
|
|
BytecodeDestDir := $(DESTDIR)$(PROJ_libdir)
|
|
endif
|
|
|
|
DestBytecodeLib = $(BytecodeDestDir)/lib$(LIBRARYNAME).bca
|
|
|
|
install-bytecode-local:: $(DestBytecodeLib)
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
install-local:: $(DestBytecodeLib)
|
|
|
|
$(DestBytecodeLib): $(LibName.BCA) $(BytecodeDestDir)
|
|
$(Echo) Installing $(BuildMode) Bytecode Archive $(DestBytecodeLib)
|
|
$(Verb) $(DataInstall) $(LibName.BCA) $(DestBytecodeLib)
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling $(BuildMode) Bytecode Archive $(DestBytecodeLib)
|
|
-$(Verb) $(RM) -f $(DestBytecodeLib)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Library Targets:
|
|
# If neither BUILD_ARCHIVE or LOADABLE_MODULE are specified, default to
|
|
# building an archive.
|
|
#---------------------------------------------------------
|
|
ifndef NO_BUILD_ARCHIVE
|
|
ifndef BUILD_ARCHIVE
|
|
ifndef LOADABLE_MODULE
|
|
BUILD_ARCHIVE = 1
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Archive Library Targets:
|
|
# If the user wanted a regular archive library built,
|
|
# then we provide targets for building them.
|
|
#---------------------------------------------------------
|
|
ifdef BUILD_ARCHIVE
|
|
|
|
all-local:: $(LibName.A)
|
|
|
|
$(LibName.A): $(ObjectsO) $(LibDir)/.dir
|
|
$(Echo) Building $(BuildMode) Archive Library $(notdir $@)
|
|
-$(Verb) $(RM) -f $@
|
|
$(Verb) $(Archive) $@ $(ObjectsO)
|
|
$(Verb) $(Ranlib) $@
|
|
|
|
clean-local::
|
|
ifneq ($(strip $(LibName.A)),)
|
|
-$(Verb) $(RM) -f $(LibName.A)
|
|
endif
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
ifdef NO_INSTALL_ARCHIVES
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
DestArchiveLib := $(DESTDIR)$(PROJ_libdir)/lib$(LIBRARYNAME).a
|
|
|
|
install-local:: $(DestArchiveLib)
|
|
|
|
$(DestArchiveLib): $(LibName.A) $(DESTDIR)$(PROJ_libdir)
|
|
$(Echo) Installing $(BuildMode) Archive Library $(DestArchiveLib)
|
|
$(Verb) $(MKDIR) $(DESTDIR)$(PROJ_libdir)
|
|
$(Verb) $(INSTALL) $(LibName.A) $(DestArchiveLib)
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling $(BuildMode) Archive Library $(DestArchiveLib)
|
|
-$(Verb) $(RM) -f $(DestArchiveLib)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# endif LIBRARYNAME
|
|
endif
|
|
|
|
###############################################################################
|
|
# Tool Build Rules: Build executable tool based on TOOLNAME option
|
|
###############################################################################
|
|
|
|
ifdef TOOLNAME
|
|
|
|
#---------------------------------------------------------
|
|
# Set up variables for building a tool.
|
|
#---------------------------------------------------------
|
|
TOOLEXENAME := $(strip $(TOOLNAME))$(EXEEXT)
|
|
ifdef EXAMPLE_TOOL
|
|
ToolBuildPath := $(ExmplDir)/$(TOOLEXENAME)
|
|
else
|
|
ToolBuildPath := $(ToolDir)/$(TOOLEXENAME)
|
|
endif
|
|
|
|
# TOOLALIAS is a name to symlink (or copy) the tool to.
|
|
ifdef TOOLALIAS
|
|
ifdef EXAMPLE_TOOL
|
|
ToolAliasBuildPath := $(ExmplDir)/$(strip $(TOOLALIAS))$(EXEEXT)
|
|
else
|
|
ToolAliasBuildPath := $(ToolDir)/$(strip $(TOOLALIAS))$(EXEEXT)
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Prune Exports
|
|
#---------------------------------------------------------
|
|
|
|
# If the tool opts in with TOOL_NO_EXPORTS, optimize startup time of the app by
|
|
# not exporting all of the weak symbols from the binary. This reduces dyld
|
|
# startup time by 4x on darwin in some cases.
|
|
ifdef TOOL_NO_EXPORTS
|
|
ifeq ($(HOST_OS),Darwin)
|
|
|
|
# Tiger tools don't support this.
|
|
ifneq ($(DARWIN_MAJVERS),4)
|
|
LD.Flags += -Wl,-exported_symbol,_main
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux NetBSD FreeBSD))
|
|
ifneq ($(ARCH), Mips)
|
|
LD.Flags += -Wl,--version-script=$(LLVM_SRC_ROOT)/autoconf/ExportMap.map
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Tool Order File Support
|
|
#---------------------------------------------------------
|
|
|
|
ifeq ($(HOST_OS),Darwin)
|
|
ifdef TOOL_ORDER_FILE
|
|
|
|
LD.Flags += -Wl,-order_file,$(TOOL_ORDER_FILE)
|
|
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Tool Version Info Support
|
|
#---------------------------------------------------------
|
|
|
|
ifeq ($(HOST_OS),Darwin)
|
|
ifdef TOOL_INFO_PLIST
|
|
|
|
LD.Flags += -Wl,-sectcreate,__TEXT,__info_plist,$(ObjDir)/$(TOOL_INFO_PLIST)
|
|
|
|
$(ToolBuildPath): $(ObjDir)/$(TOOL_INFO_PLIST)
|
|
|
|
$(ObjDir)/$(TOOL_INFO_PLIST): $(PROJ_SRC_DIR)/$(TOOL_INFO_PLIST).in $(ObjDir)/.dir
|
|
$(Echo) "Creating $(TOOLNAME) '$(TOOL_INFO_PLIST)' file..."
|
|
$(Verb)sed -e "s#@TOOL_INFO_UTI@#$(TOOL_INFO_UTI)#g" \
|
|
-e "s#@TOOL_INFO_NAME@#$(TOOL_INFO_NAME)#g" \
|
|
-e "s#@TOOL_INFO_VERSION@#$(TOOL_INFO_VERSION)#g" \
|
|
-e "s#@TOOL_INFO_BUILD_VERSION@#$(TOOL_INFO_BUILD_VERSION)#g" \
|
|
$< > $@
|
|
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Provide targets for building the tools
|
|
#---------------------------------------------------------
|
|
all-local:: $(ToolBuildPath) $(ToolAliasBuildPath)
|
|
|
|
clean-local::
|
|
ifneq ($(strip $(ToolBuildPath)),)
|
|
-$(Verb) $(RM) -f $(ToolBuildPath)
|
|
endif
|
|
ifneq ($(strip $(ToolAliasBuildPath)),)
|
|
-$(Verb) $(RM) -f $(ToolAliasBuildPath)
|
|
endif
|
|
|
|
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)
|
|
$(Echo) ======= Finished Linking $(BuildMode) Executable $(TOOLNAME) \
|
|
$(StripWarnMsg)
|
|
|
|
ifneq ($(strip $(ToolAliasBuildPath)),)
|
|
$(ToolAliasBuildPath): $(ToolBuildPath)
|
|
$(Echo) Creating $(BuildMode) Alias $(TOOLALIAS) $(StripWarnMsg)
|
|
$(Verb) $(RM) -f $(ToolAliasBuildPath)
|
|
$(Verb) $(AliasTool) $(TOOLEXENAME) $(ToolAliasBuildPath)
|
|
$(Echo) ======= Finished Creating $(BuildMode) Alias $(TOOLALIAS) \
|
|
$(StripWarnMsg)
|
|
endif
|
|
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
DestTool = $(DESTDIR)$(PROJ_bindir)/$(TOOLEXENAME)
|
|
|
|
install-local:: $(DestTool)
|
|
|
|
$(DestTool): $(ToolBuildPath) $(DESTDIR)$(PROJ_bindir)
|
|
$(Echo) Installing $(BuildMode) $(DestTool)
|
|
$(Verb) $(ProgInstall) $(ToolBuildPath) $(DestTool)
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling $(BuildMode) $(DestTool)
|
|
-$(Verb) $(RM) -f $(DestTool)
|
|
|
|
# TOOLALIAS install.
|
|
ifdef TOOLALIAS
|
|
DestToolAlias = $(DESTDIR)$(PROJ_bindir)/$(TOOLALIAS)$(EXEEXT)
|
|
|
|
install-local:: $(DestToolAlias)
|
|
|
|
$(DestToolAlias): $(DestTool)
|
|
$(Echo) Installing $(BuildMode) $(DestToolAlias)
|
|
$(Verb) $(RM) -f $(DestToolAlias)
|
|
$(Verb) $(AliasTool) $(TOOLEXENAME) $(DestToolAlias)
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling $(BuildMode) $(DestToolAlias)
|
|
-$(Verb) $(RM) -f $(DestToolAlias)
|
|
endif
|
|
|
|
endif
|
|
endif
|
|
|
|
###############################################################################
|
|
# 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"
|
|
ifeq ($(HOST_OS),HP-UX)
|
|
DISABLE_AUTO_DEPENDENCIES=1
|
|
endif
|
|
|
|
# Provide rule sets for when dependency generation is enabled
|
|
ifndef DISABLE_AUTO_DEPENDENCIES
|
|
|
|
#---------------------------------------------------------
|
|
# Create .o files in the ObjDir directory from the .cpp and .c files...
|
|
#---------------------------------------------------------
|
|
|
|
DEPEND_OPTIONS = -MMD -MP -MF "$(ObjDir)/$*.d.tmp" \
|
|
-MT "$(ObjDir)/$*.o" -MT "$(ObjDir)/$*.d"
|
|
|
|
# If the build succeeded, move the dependency file over, otherwise
|
|
# remove it.
|
|
DEPEND_MOVEFILE = then $(MV) -f "$(ObjDir)/$*.d.tmp" "$(ObjDir)/$*.d"; \
|
|
else $(RM) "$(ObjDir)/$*.d.tmp"; exit 1; fi
|
|
|
|
$(ObjDir)/%.o: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES) $(PROJ_MAKEFILE)
|
|
$(Echo) "Compiling $*.cpp for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Verb) if $(Compile.CXX) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o ; \
|
|
$(DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.o: %.mm $(ObjDir)/.dir $(BUILT_SOURCES) $(PROJ_MAKEFILE)
|
|
$(Echo) "Compiling $*.mm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Verb) if $(Compile.CXX) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o ; \
|
|
$(DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.o: %.cc $(ObjDir)/.dir $(BUILT_SOURCES) $(PROJ_MAKEFILE)
|
|
$(Echo) "Compiling $*.cc for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Verb) if $(Compile.CXX) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o ; \
|
|
$(DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES) $(PROJ_MAKEFILE)
|
|
$(Echo) "Compiling $*.c for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Verb) if $(Compile.C) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o ; \
|
|
$(DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.o: %.m $(ObjDir)/.dir $(BUILT_SOURCES) $(PROJ_MAKEFILE)
|
|
$(Echo) "Compiling $*.m for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Verb) if $(Compile.C) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o ; \
|
|
$(DEPEND_MOVEFILE)
|
|
|
|
#---------------------------------------------------------
|
|
# Create .bc files in the ObjDir directory from .cpp .cc and .c files...
|
|
#---------------------------------------------------------
|
|
|
|
BC_DEPEND_OPTIONS = -MMD -MP -MF "$(ObjDir)/$*.bc.d.tmp" \
|
|
-MT "$(ObjDir)/$*.ll" -MT "$(ObjDir)/$*.bc.d"
|
|
|
|
# If the build succeeded, move the dependency file over, otherwise
|
|
# remove it.
|
|
BC_DEPEND_MOVEFILE = then $(MV) -f "$(ObjDir)/$*.bc.d.tmp" "$(ObjDir)/$*.bc.d"; \
|
|
else $(RM) "$(ObjDir)/$*.bc.d.tmp"; exit 1; fi
|
|
|
|
$(ObjDir)/%.ll: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.cpp for $(BuildMode) build (bytecode)"
|
|
$(Verb) if $(BCCompile.CXX) $(BC_DEPEND_OPTIONS) \
|
|
$< -o $(ObjDir)/$*.ll -S $(LLVMCC_EMITIR_FLAG) ; \
|
|
$(BC_DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.ll: %.mm $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.mm for $(BuildMode) build (bytecode)"
|
|
$(Verb) if $(BCCompile.CXX) $(BC_DEPEND_OPTIONS) \
|
|
$< -o $(ObjDir)/$*.ll -S $(LLVMCC_EMITIR_FLAG) ; \
|
|
$(BC_DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.ll: %.cc $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.cc for $(BuildMode) build (bytecode)"
|
|
$(Verb) if $(BCCompile.CXX) $(BC_DEPEND_OPTIONS) \
|
|
$< -o $(ObjDir)/$*.ll -S $(LLVMCC_EMITIR_FLAG) ; \
|
|
$(BC_DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.ll: %.c $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCC)
|
|
$(Echo) "Compiling $*.c for $(BuildMode) build (bytecode)"
|
|
$(Verb) if $(BCCompile.C) $(BC_DEPEND_OPTIONS) \
|
|
$< -o $(ObjDir)/$*.ll -S $(LLVMCC_EMITIR_FLAG) ; \
|
|
$(BC_DEPEND_MOVEFILE)
|
|
|
|
$(ObjDir)/%.ll: %.m $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCC)
|
|
$(Echo) "Compiling $*.m for $(BuildMode) build (bytecode)"
|
|
$(Verb) if $(BCCompile.C) $(BC_DEPEND_OPTIONS) \
|
|
$< -o $(ObjDir)/$*.ll -S $(LLVMCC_EMITIR_FLAG) ; \
|
|
$(BC_DEPEND_MOVEFILE)
|
|
|
|
# Provide alternate rule sets if dependencies are disabled
|
|
else
|
|
|
|
$(ObjDir)/%.o: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cpp for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@
|
|
|
|
$(ObjDir)/%.o: %.mm $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.mm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@
|
|
|
|
$(ObjDir)/%.o: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cc for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@
|
|
|
|
$(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.c for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.C) $< -o $@
|
|
|
|
$(ObjDir)/%.o: %.m $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.m for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.C) $< -o $@
|
|
|
|
$(ObjDir)/%.ll: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.cpp for $(BuildMode) build (bytecode)"
|
|
$(BCCompile.CXX) $< -o $@ -S $(LLVMCC_EMITIR_FLAG)
|
|
|
|
$(ObjDir)/%.ll: %.mm $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.mm for $(BuildMode) build (bytecode)"
|
|
$(BCCompile.CXX) $< -o $@ -S $(LLVMCC_EMITIR_FLAG)
|
|
|
|
$(ObjDir)/%.ll: %.cc $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCXX)
|
|
$(Echo) "Compiling $*.cc for $(BuildMode) build (bytecode)"
|
|
$(BCCompile.CXX) $< -o $@ -S $(LLVMCC_EMITIR_FLAG)
|
|
|
|
$(ObjDir)/%.ll: %.c $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCC)
|
|
$(Echo) "Compiling $*.c for $(BuildMode) build (bytecode)"
|
|
$(BCCompile.C) $< -o $@ -S $(LLVMCC_EMITIR_FLAG)
|
|
|
|
$(ObjDir)/%.ll: %.m $(ObjDir)/.dir $(BUILT_SOURCES) $(LLVMCC)
|
|
$(Echo) "Compiling $*.m for $(BuildMode) build (bytecode)"
|
|
$(BCCompile.C) $< -o $@ -S $(LLVMCC_EMITIR_FLAG)
|
|
|
|
endif
|
|
|
|
|
|
## Rules for building preprocessed (.i/.ii) outputs.
|
|
$(BuildMode)/%.ii: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cpp for $(BuildMode) build to .ii file"
|
|
$(Verb) $(Preprocess.CXX) $< -o $@
|
|
|
|
$(BuildMode)/%.ii: %.mm $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.mm for $(BuildMode) build to .ii file"
|
|
$(Verb) $(Preprocess.CXX) $< -o $@
|
|
|
|
$(BuildMode)/%.ii: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cc for $(BuildMode) build to .ii file"
|
|
$(Verb) $(Preprocess.CXX) $< -o $@
|
|
|
|
$(BuildMode)/%.i: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.c for $(BuildMode) build to .i file"
|
|
$(Verb) $(Preprocess.C) $< -o $@
|
|
|
|
$(BuildMode)/%.i: %.m $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.m for $(BuildMode) build to .i file"
|
|
$(Verb) $(Preprocess.C) $< -o $@
|
|
|
|
|
|
$(ObjDir)/%.s: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cpp to asm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@ -S
|
|
|
|
$(ObjDir)/%.s: %.mm $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.mm to asm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@ -S
|
|
|
|
$(ObjDir)/%.s: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.cc to asm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.CXX) $< -o $@ -S
|
|
|
|
$(ObjDir)/%.s: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.c to asm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.C) $< -o $@ -S
|
|
|
|
$(ObjDir)/%.s: %.m $(ObjDir)/.dir $(BUILT_SOURCES)
|
|
$(Echo) "Compiling $*.m to asm for $(BuildMode) build" $(PIC_FLAG)
|
|
$(Compile.C) $< -o $@ -S
|
|
|
|
|
|
# make the C and C++ compilers strip debug info out of bytecode libraries.
|
|
ifdef DEBUG_RUNTIME
|
|
$(ObjectsBC): $(ObjDir)/%.bc: $(ObjDir)/%.ll $(LOPT)
|
|
$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
|
|
$(Verb) $(LOPT) $< -std-compile-opts -o $@
|
|
else
|
|
$(ObjectsBC): $(ObjDir)/%.bc: $(ObjDir)/%.ll $(LOPT)
|
|
$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
|
|
$(Verb) $(LOPT) $< -std-compile-opts -strip-debug -o $@
|
|
endif
|
|
|
|
|
|
#---------------------------------------------------------
|
|
# Provide rule to build .bc files from .ll sources,
|
|
# regardless of dependencies
|
|
#---------------------------------------------------------
|
|
$(ObjDir)/%.bc: %.ll $(ObjDir)/.dir $(LLVMAS)
|
|
$(Echo) "Compiling $*.ll for $(BuildMode) build"
|
|
$(Verb) $(LLVMAS) $< -f -o $@
|
|
|
|
###############################################################################
|
|
# TABLEGEN: Provide rules for running tblgen to produce *.inc files
|
|
###############################################################################
|
|
|
|
ifdef TARGET
|
|
TABLEGEN_INC_FILES_COMMON = 1
|
|
endif
|
|
|
|
ifdef LLVMC_BASED_DRIVER
|
|
TABLEGEN_INC_FILES_COMMON = 1
|
|
endif
|
|
|
|
ifdef TABLEGEN_INC_FILES_COMMON
|
|
|
|
INCFiles := $(filter %.inc,$(BUILT_SOURCES))
|
|
INCTMPFiles := $(INCFiles:%=$(ObjDir)/%.tmp)
|
|
.PRECIOUS: $(INCTMPFiles) $(INCFiles)
|
|
|
|
# INCFiles rule: All of the tblgen generated files are emitted to
|
|
# $(ObjDir)/%.inc.tmp, instead of emitting them directly to %.inc. This allows
|
|
# us to only "touch" the real file if the contents of it change. IOW, if
|
|
# tblgen is modified, all of the .inc.tmp files are regenerated, but no
|
|
# dependencies of the .inc files are, unless the contents of the .inc file
|
|
# changes.
|
|
$(INCFiles) : %.inc : $(ObjDir)/%.inc.tmp
|
|
$(Verb) $(CMP) -s $@ $< || $(CP) $< $@
|
|
|
|
endif # TABLEGEN_INC_FILES_COMMON
|
|
|
|
ifdef TARGET
|
|
|
|
TDFiles := $(strip $(wildcard $(PROJ_SRC_DIR)/*.td) \
|
|
$(LLVM_SRC_ROOT)/include/llvm/Target/Target.td \
|
|
$(LLVM_SRC_ROOT)/include/llvm/Target/TargetCallingConv.td \
|
|
$(LLVM_SRC_ROOT)/include/llvm/Target/TargetSchedule.td \
|
|
$(LLVM_SRC_ROOT)/include/llvm/Target/TargetSelectionDAG.td \
|
|
$(LLVM_SRC_ROOT)/include/llvm/CodeGen/ValueTypes.td) \
|
|
$(wildcard $(LLVM_SRC_ROOT)/include/llvm/Intrinsics*.td)
|
|
|
|
# All of these files depend on tblgen and the .td files.
|
|
$(INCTMPFiles) : $(TBLGEN) $(TDFiles)
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenRegisterInfo.inc.tmp): \
|
|
$(ObjDir)/%GenRegisterInfo.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) register info implementation with tblgen"
|
|
$(Verb) $(TableGen) -gen-register-info -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenInstrInfo.inc.tmp): \
|
|
$(ObjDir)/%GenInstrInfo.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) instruction information with tblgen"
|
|
$(Verb) $(TableGen) -gen-instr-info -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenAsmWriter.inc.tmp): \
|
|
$(ObjDir)/%GenAsmWriter.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) assembly writer with tblgen"
|
|
$(Verb) $(TableGen) -gen-asm-writer -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenAsmWriter1.inc.tmp): \
|
|
$(ObjDir)/%GenAsmWriter1.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) assembly writer #1 with tblgen"
|
|
$(Verb) $(TableGen) -gen-asm-writer -asmwriternum=1 -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenAsmMatcher.inc.tmp): \
|
|
$(ObjDir)/%GenAsmMatcher.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) assembly matcher with tblgen"
|
|
$(Verb) $(TableGen) -gen-asm-matcher -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenMCCodeEmitter.inc.tmp): \
|
|
$(ObjDir)/%GenMCCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) MC code emitter with tblgen"
|
|
$(Verb) $(TableGen) -gen-emitter -mc-emitter -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenMCPseudoLowering.inc.tmp): \
|
|
$(ObjDir)/%GenMCPseudoLowering.inc.tmp: %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) MC Pseudo instruction expander with tblgen"
|
|
$(Verb) $(TableGen) -gen-pseudo-lowering -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenCodeEmitter.inc.tmp): \
|
|
$(ObjDir)/%GenCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) code emitter with tblgen"
|
|
$(Verb) $(TableGen) -gen-emitter -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenDAGISel.inc.tmp): \
|
|
$(ObjDir)/%GenDAGISel.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) DAG instruction selector implementation with tblgen"
|
|
$(Verb) $(TableGen) -gen-dag-isel -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenDisassemblerTables.inc.tmp): \
|
|
$(ObjDir)/%GenDisassemblerTables.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) disassembly tables with tblgen"
|
|
$(Verb) $(TableGen) -gen-disassembler -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenEDInfo.inc.tmp): \
|
|
$(ObjDir)/%GenEDInfo.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) enhanced disassembly information with tblgen"
|
|
$(Verb) $(TableGen) -gen-enhanced-disassembly-info -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenFastISel.inc.tmp): \
|
|
$(ObjDir)/%GenFastISel.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) \"fast\" instruction selector implementation with tblgen"
|
|
$(Verb) $(TableGen) -gen-fast-isel -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenSubtargetInfo.inc.tmp): \
|
|
$(ObjDir)/%GenSubtargetInfo.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) subtarget information with tblgen"
|
|
$(Verb) $(TableGen) -gen-subtarget -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenCallingConv.inc.tmp): \
|
|
$(ObjDir)/%GenCallingConv.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) calling convention information with tblgen"
|
|
$(Verb) $(TableGen) -gen-callingconv -o $(call SYSPATH, $@) $<
|
|
|
|
$(TARGET:%=$(ObjDir)/%GenIntrinsics.inc.tmp): \
|
|
$(ObjDir)/%GenIntrinsics.inc.tmp : %.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) intrinsics information with tblgen"
|
|
$(Verb) $(TableGen) -gen-tgt-intrinsic -o $(call SYSPATH, $@) $<
|
|
|
|
$(ObjDir)/ARMGenDecoderTables.inc.tmp : ARM.td $(ObjDir)/.dir
|
|
$(Echo) "Building $(<F) decoder tables with tblgen"
|
|
$(Verb) $(TableGen) -gen-arm-decoder -o $(call SYSPATH, $@) $<
|
|
|
|
|
|
clean-local::
|
|
-$(Verb) $(RM) -f $(INCFiles)
|
|
|
|
endif # TARGET
|
|
|
|
ifdef LLVMC_BASED_DRIVER
|
|
|
|
TDSrc := $(sort $(strip $(wildcard $(PROJ_SRC_DIR)/*.td)) \
|
|
$(strip $(wildcard $(PROJ_OBJ_DIR)/*.td)))
|
|
|
|
TDCommon := $(strip $(wildcard \
|
|
$(LLVM_SRC_ROOT)/include/llvm/CompilerDriver/*.td))
|
|
|
|
TDFiles := $(TDSrc) $(TDCommon)
|
|
|
|
$(INCTMPFiles) : $(TBLGEN) $(TDFiles)
|
|
|
|
$(ObjDir)/%.inc.tmp: %.td $(ObjDir)/.dir
|
|
$(Echo) "Building LLVMC compilation graph description with tblgen"
|
|
$(Verb) $(TableGen) -gen-llvmc -o $(call SYSPATH, $@) $<
|
|
|
|
clean-local::
|
|
-$(Verb) $(RM) -f $(INCFiles)
|
|
|
|
endif # LLVMC_BASED_DRIVER
|
|
|
|
###############################################################################
|
|
# OTHER RULES: Other rules needed
|
|
###############################################################################
|
|
|
|
# To create postscript files from dot files...
|
|
ifneq ($(DOT),false)
|
|
%.ps: %.dot
|
|
$(DOT) -Tps < $< > $@
|
|
else
|
|
%.ps: %.dot
|
|
$(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:: ;
|
|
%.hpp:: ;
|
|
|
|
# Define clean-local to clean the current directory. Note that this uses a
|
|
# very conservative approach ensuring that empty variables do not cause
|
|
# errors or disastrous removal.
|
|
clean-local::
|
|
ifneq ($(strip $(ObjRootDir)),)
|
|
-$(Verb) $(RM) -rf $(ObjRootDir)
|
|
endif
|
|
-$(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
|
|
|
|
clean-all-local::
|
|
-$(Verb) $(RM) -rf Debug Release Profile
|
|
|
|
|
|
###############################################################################
|
|
# DEPENDENCIES: Include the dependency files if we should
|
|
###############################################################################
|
|
ifndef DISABLE_AUTO_DEPENDENCIES
|
|
|
|
# If its not one of the cleaning targets
|
|
ifndef IS_CLEANING_TARGET
|
|
|
|
# Get the list of dependency files
|
|
DependSourceFiles := $(basename $(filter %.cpp %.c %.cc %.m %.mm, $(Sources)))
|
|
DependFiles := $(DependSourceFiles:%=$(PROJ_OBJ_DIR)/$(BuildMode)/%.d)
|
|
|
|
# Include bitcode dependency files if using bitcode libraries
|
|
ifdef BYTECODE_LIBRARY
|
|
DependFiles += $(DependSourceFiles:%=$(PROJ_OBJ_DIR)/$(BuildMode)/%.bc.d)
|
|
endif
|
|
|
|
-include $(DependFiles) ""
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
###############################################################################
|
|
# CHECK: Running the test suite
|
|
###############################################################################
|
|
|
|
check::
|
|
$(Verb) if test -d "$(PROJ_OBJ_ROOT)/test" ; then \
|
|
if test -f "$(PROJ_OBJ_ROOT)/test/Makefile" ; then \
|
|
$(EchoCmd) Running test suite ; \
|
|
$(MAKE) -C $(PROJ_OBJ_ROOT)/test check-local \
|
|
TESTSUITE=$(TESTSUITE) ; \
|
|
else \
|
|
$(EchoCmd) No Makefile in test directory ; \
|
|
fi ; \
|
|
else \
|
|
$(EchoCmd) No test directory ; \
|
|
fi
|
|
|
|
check-lit:: check
|
|
|
|
check-dg::
|
|
$(Verb) if test -d "$(PROJ_OBJ_ROOT)/test" ; then \
|
|
if test -f "$(PROJ_OBJ_ROOT)/test/Makefile" ; then \
|
|
$(EchoCmd) Running test suite ; \
|
|
$(MAKE) -C $(PROJ_OBJ_ROOT)/test check-local-dg ; \
|
|
else \
|
|
$(EchoCmd) No Makefile in test directory ; \
|
|
fi ; \
|
|
else \
|
|
$(EchoCmd) No test directory ; \
|
|
fi
|
|
|
|
check-all::
|
|
$(Verb) if test -d "$(PROJ_OBJ_ROOT)/test" ; then \
|
|
if test -f "$(PROJ_OBJ_ROOT)/test/Makefile" ; then \
|
|
$(EchoCmd) Running test suite ; \
|
|
$(MAKE) -C $(PROJ_OBJ_ROOT)/test check-local-all ; \
|
|
else \
|
|
$(EchoCmd) No Makefile in test directory ; \
|
|
fi ; \
|
|
else \
|
|
$(EchoCmd) No test directory ; \
|
|
fi
|
|
|
|
###############################################################################
|
|
# UNITTESTS: Running the unittests test suite
|
|
###############################################################################
|
|
|
|
unittests::
|
|
$(Verb) if test -d "$(PROJ_OBJ_ROOT)/unittests" ; then \
|
|
if test -f "$(PROJ_OBJ_ROOT)/unittests/Makefile" ; then \
|
|
$(EchoCmd) Running unittests test suite ; \
|
|
$(MAKE) -C $(PROJ_OBJ_ROOT)/unittests unitcheck; \
|
|
else \
|
|
$(EchoCmd) No Makefile in unittests directory ; \
|
|
fi ; \
|
|
else \
|
|
$(EchoCmd) No unittests directory ; \
|
|
fi
|
|
|
|
###############################################################################
|
|
# DISTRIBUTION: Handle construction of a distribution tarball
|
|
###############################################################################
|
|
|
|
#------------------------------------------------------------------------
|
|
# Define distribution related variables
|
|
#------------------------------------------------------------------------
|
|
DistName := $(PROJECT_NAME)-$(PROJ_VERSION)
|
|
DistDir := $(PROJ_OBJ_ROOT)/$(DistName)
|
|
TopDistDir := $(PROJ_OBJ_ROOT)/$(DistName)
|
|
DistTarGZip := $(PROJ_OBJ_ROOT)/$(DistName).tar.gz
|
|
DistZip := $(PROJ_OBJ_ROOT)/$(DistName).zip
|
|
DistTarBZ2 := $(PROJ_OBJ_ROOT)/$(DistName).tar.bz2
|
|
DistAlways := CREDITS.TXT LICENSE.TXT README.txt README AUTHORS COPYING \
|
|
ChangeLog INSTALL NEWS Makefile Makefile.common Makefile.rules \
|
|
Makefile.config.in configure autoconf
|
|
DistOther := $(notdir $(wildcard \
|
|
$(PROJ_SRC_DIR)/*.h \
|
|
$(PROJ_SRC_DIR)/*.td \
|
|
$(PROJ_SRC_DIR)/*.def \
|
|
$(PROJ_SRC_DIR)/*.ll \
|
|
$(PROJ_SRC_DIR)/*.in))
|
|
DistSubDirs := $(SubDirs)
|
|
DistSources = $(Sources) $(EXTRA_DIST)
|
|
DistFiles = $(DistAlways) $(DistSources) $(DistOther)
|
|
|
|
#------------------------------------------------------------------------
|
|
# We MUST build distribution with OBJ_DIR != SRC_DIR
|
|
#------------------------------------------------------------------------
|
|
ifeq ($(PROJ_SRC_DIR),$(PROJ_OBJ_DIR))
|
|
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
|
|
$(Echo) ERROR: Target $@ only available with OBJ_DIR != SRC_DIR
|
|
|
|
else
|
|
|
|
#------------------------------------------------------------------------
|
|
# Prevent attempt to run dist targets from anywhere but the top level
|
|
#------------------------------------------------------------------------
|
|
ifneq ($(LEVEL),.)
|
|
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
|
|
$(Echo) ERROR: You must run $@ from $(PROJ_OBJ_ROOT)
|
|
else
|
|
|
|
#------------------------------------------------------------------------
|
|
# Provide the top level targets
|
|
#------------------------------------------------------------------------
|
|
|
|
dist-gzip:: $(DistTarGZip)
|
|
|
|
$(DistTarGZip) : $(TopDistDir)/.makedistdir
|
|
$(Echo) Packing gzipped distribution tar file.
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) ; $(TAR) chf - "$(DistName)" | \
|
|
$(GZIP) -c > "$(DistTarGZip)"
|
|
|
|
dist-bzip2:: $(DistTarBZ2)
|
|
|
|
$(DistTarBZ2) : $(TopDistDir)/.makedistdir
|
|
$(Echo) Packing bzipped distribution tar file.
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) ; $(TAR) chf - $(DistName) | \
|
|
$(BZIP2) -c >$(DistTarBZ2)
|
|
|
|
dist-zip:: $(DistZip)
|
|
|
|
$(DistZip) : $(TopDistDir)/.makedistdir
|
|
$(Echo) Packing zipped distribution file.
|
|
$(Verb) rm -f $(DistZip)
|
|
$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ZIP) -rq $(DistZip) $(DistName)
|
|
|
|
dist :: $(DistTarGZip) $(DistTarBZ2) $(DistZip)
|
|
$(Echo) ===== DISTRIBUTION PACKAGING SUCCESSFUL =====
|
|
|
|
DistCheckDir := $(PROJ_OBJ_ROOT)/_distcheckdir
|
|
|
|
dist-check:: $(DistTarGZip)
|
|
$(Echo) Checking distribution tar file.
|
|
$(Verb) if test -d $(DistCheckDir) ; then \
|
|
$(RM) -rf $(DistCheckDir) ; \
|
|
fi
|
|
$(Verb) $(MKDIR) $(DistCheckDir)
|
|
$(Verb) cd $(DistCheckDir) && \
|
|
$(MKDIR) $(DistCheckDir)/build && \
|
|
$(MKDIR) $(DistCheckDir)/install && \
|
|
gunzip -c $(DistTarGZip) | $(TAR) xf - && \
|
|
cd build && \
|
|
../$(DistName)/configure --prefix="$(DistCheckDir)/install" \
|
|
--srcdir=../$(DistName) $(DIST_CHECK_CONFIG_OPTIONS) && \
|
|
$(MAKE) all && \
|
|
$(MAKE) check && \
|
|
$(MAKE) unittests && \
|
|
$(MAKE) install && \
|
|
$(MAKE) uninstall && \
|
|
$(MAKE) dist-clean && \
|
|
$(EchoCmd) ===== $(DistTarGZip) Ready For Distribution =====
|
|
|
|
dist-clean::
|
|
$(Echo) Cleaning distribution files
|
|
-$(Verb) $(RM) -rf $(DistTarGZip) $(DistTarBZ2) $(DistZip) $(DistName) \
|
|
$(DistCheckDir)
|
|
|
|
endif
|
|
|
|
#------------------------------------------------------------------------
|
|
# Provide the recursive distdir target for building the distribution directory
|
|
#------------------------------------------------------------------------
|
|
distdir: $(DistDir)/.makedistdir
|
|
$(DistDir)/.makedistdir: $(DistSources)
|
|
$(Verb) if test "$(DistDir)" = "$(TopDistDir)" ; then \
|
|
if test -d "$(DistDir)" ; then \
|
|
find $(DistDir) -type d ! -perm -200 -exec chmod u+w {} ';' || \
|
|
exit 1 ; \
|
|
fi ; \
|
|
$(EchoCmd) Removing old $(DistDir) ; \
|
|
$(RM) -rf $(DistDir); \
|
|
$(EchoCmd) Making 'all' to verify build ; \
|
|
$(MAKE) ENABLE_OPTIMIZED=1 all ; \
|
|
fi
|
|
$(Echo) Building Distribution Directory $(DistDir)
|
|
$(Verb) $(MKDIR) $(DistDir)
|
|
$(Verb) srcdirstrip=`echo "$(PROJ_SRC_DIR)" | sed 's|.|.|g'`; \
|
|
srcrootstrip=`echo "$(PROJ_SRC_ROOT)" | sed 's|.|.|g'`; \
|
|
for file in $(DistFiles) ; do \
|
|
case "$$file" in \
|
|
$(PROJ_SRC_DIR)/*) \
|
|
file=`echo "$$file" | sed "s#^$$srcdirstrip/##"` \
|
|
;; \
|
|
$(PROJ_SRC_ROOT)/*) \
|
|
file=`echo "$$file" | \
|
|
sed "s#^$$srcrootstrip/##"` \
|
|
;; \
|
|
esac; \
|
|
if test -f "$(PROJ_SRC_DIR)/$$file" || \
|
|
test -d "$(PROJ_SRC_DIR)/$$file" ; then \
|
|
from_dir="$(PROJ_SRC_DIR)" ; \
|
|
elif test -f "$$file" || test -d "$$file" ; then \
|
|
from_dir=. ; \
|
|
fi ; \
|
|
to_dir=`echo "$$file" | sed -e 's#/[^/]*$$##'` ; \
|
|
if test "$$to_dir" != "$$file" && test "$$to_dir" != "."; then \
|
|
to_dir="$(DistDir)/$$dir"; \
|
|
$(MKDIR) "$$to_dir" ; \
|
|
else \
|
|
to_dir="$(DistDir)"; \
|
|
fi; \
|
|
mid_dir=`echo "$$file" | sed -n -e 's#^\(.*\)/[^/]*$$#\1#p'`; \
|
|
if test -n "$$mid_dir" ; then \
|
|
$(MKDIR) "$$to_dir/$$mid_dir" || exit 1; \
|
|
fi ; \
|
|
if test -d "$$from_dir/$$file"; then \
|
|
if test -d "$(PROJ_SRC_DIR)/$$file" && \
|
|
test "$$from_dir" != "$(PROJ_SRC_DIR)" ; then \
|
|
cd $(PROJ_SRC_DIR) ; \
|
|
$(TAR) cf - $$file --exclude .svn --exclude CVS | \
|
|
( cd $$to_dir ; $(TAR) xf - ) ; \
|
|
cd $(PROJ_OBJ_DIR) ; \
|
|
else \
|
|
cd $$from_dir ; \
|
|
$(TAR) cf - $$file --exclude .svn --exclude CVS | \
|
|
( cd $$to_dir ; $(TAR) xf - ) ; \
|
|
cd $(PROJ_OBJ_DIR) ; \
|
|
fi; \
|
|
elif test -f "$$from_dir/$$file" ; then \
|
|
$(CP) -p "$$from_dir/$$file" "$(DistDir)/$$file" || exit 1; \
|
|
elif test -L "$$from_dir/$$file" ; then \
|
|
$(CP) -pd "$$from_dir/$$file" $(DistDir)/$$file || exit 1; \
|
|
elif echo "$(DistAlways)" | grep -v "$$file" >/dev/null ; then \
|
|
$(EchoCmd) "===== WARNING: Distribution Source " \
|
|
"$$from_dir/$$file Not Found!" ; \
|
|
elif test "$(Verb)" != '@' ; then \
|
|
$(EchoCmd) "Skipping non-existent $$from_dir/$$file" ; \
|
|
fi; \
|
|
done
|
|
$(Verb) for subdir in $(DistSubDirs) ; do \
|
|
if test "$$subdir" \!= "." ; then \
|
|
new_distdir="$(DistDir)/$$subdir" ; \
|
|
test -d "$$new_distdir" || $(MKDIR) "$$new_distdir" || exit 1; \
|
|
( cd $$subdir && $(MAKE) ENABLE_OPTIMIZED=1 \
|
|
DistDir="$$new_distdir" distdir ) || exit 1; \
|
|
fi; \
|
|
done
|
|
$(Verb) if test "$(DistDir)" = "$(TopDistDir)" ; then \
|
|
$(EchoCmd) Eliminating CVS/.svn directories from distribution ; \
|
|
$(RM) -rf `find $(TopDistDir) -type d \( -name CVS -o \
|
|
-name .svn \) -print` ;\
|
|
$(MAKE) dist-hook ; \
|
|
$(FIND) $(TopDistDir) -type d ! -perm -777 -exec chmod a+rwx {} \; \
|
|
-o ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; \
|
|
-o ! -type d ! -perm -400 -exec chmod a+r {} \; \
|
|
-o ! -type d ! -perm -444 -exec \
|
|
$(SHELL) $(INSTALL_SH) -c -m a+r {} {} \; \
|
|
|| chmod -R a+r $(DistDir) ; \
|
|
fi
|
|
|
|
# This is invoked by distdir target, define it as a no-op to avoid errors if not
|
|
# defined by user.
|
|
dist-hook::
|
|
|
|
endif
|
|
|
|
###############################################################################
|
|
# TOP LEVEL - targets only to apply at the top level directory
|
|
###############################################################################
|
|
|
|
ifeq ($(LEVEL),.)
|
|
|
|
#------------------------------------------------------------------------
|
|
# Install support for the project's include files:
|
|
#------------------------------------------------------------------------
|
|
ifdef NO_INSTALL
|
|
install-local::
|
|
$(Echo) Install circumvented with NO_INSTALL
|
|
uninstall-local::
|
|
$(Echo) Uninstall circumvented with NO_INSTALL
|
|
else
|
|
install-local::
|
|
$(Echo) Installing include files
|
|
$(Verb) $(MKDIR) $(DESTDIR)$(PROJ_includedir)
|
|
$(Verb) if test -d "$(PROJ_SRC_ROOT)/include" ; then \
|
|
cd $(PROJ_SRC_ROOT)/include && \
|
|
for hdr in `find . -type f \
|
|
'(' -name LICENSE.TXT \
|
|
-o -name '*.def' \
|
|
-o -name '*.h' \
|
|
-o -name '*.inc' \
|
|
-o -name '*.td' \
|
|
')' -print | grep -v CVS | \
|
|
grep -v .svn` ; do \
|
|
instdir=`dirname "$(DESTDIR)$(PROJ_includedir)/$$hdr"` ; \
|
|
if test \! -d "$$instdir" ; then \
|
|
$(EchoCmd) Making install directory $$instdir ; \
|
|
$(MKDIR) $$instdir ;\
|
|
fi ; \
|
|
$(DataInstall) $$hdr $(DESTDIR)$(PROJ_includedir)/$$hdr ; \
|
|
done ; \
|
|
fi
|
|
ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
|
|
$(Verb) if test -d "$(PROJ_OBJ_ROOT)/include" ; then \
|
|
cd $(PROJ_OBJ_ROOT)/include && \
|
|
for hdr in `find . -type f \
|
|
'(' -name LICENSE.TXT \
|
|
-o -name '*.def' \
|
|
-o -name '*.h' \
|
|
-o -name '*.inc' \
|
|
-o -name '*.td' \
|
|
')' -print | grep -v CVS | \
|
|
grep -v .svn` ; do \
|
|
instdir=`dirname "$(DESTDIR)$(PROJ_includedir)/$$hdr"` ; \
|
|
if test \! -d "$$instdir" ; then \
|
|
$(EchoCmd) Making install directory $$instdir ; \
|
|
$(MKDIR) $$instdir ;\
|
|
fi ; \
|
|
$(DataInstall) $$hdr $(DESTDIR)$(PROJ_includedir)/$$hdr ; \
|
|
done ; \
|
|
fi
|
|
endif
|
|
|
|
uninstall-local::
|
|
$(Echo) Uninstalling include files
|
|
$(Verb) if [ -d "$(PROJ_SRC_ROOT)/include" ] ; then \
|
|
cd $(PROJ_SRC_ROOT)/include && \
|
|
$(RM) -f `find . -path '*/Internal' -prune -o '(' -type f \
|
|
'!' '(' -name '*~' -o -name '.#*' \
|
|
-o -name '*.in' ')' -print ')' | \
|
|
grep -v CVS | sed 's#^#$(DESTDIR)$(PROJ_includedir)/#'` ; \
|
|
cd $(PROJ_SRC_ROOT)/include && \
|
|
$(RM) -f `find . -path '*/Internal' -prune -o '(' -type f -name '*.in' \
|
|
-print ')' | sed 's#\.in$$##;s#^#$(DESTDIR)$(PROJ_includedir)/#'` ; \
|
|
fi
|
|
endif
|
|
endif
|
|
|
|
check-line-length:
|
|
@echo searching for overlength lines in files: $(Sources)
|
|
@echo
|
|
@echo
|
|
egrep -n '.{81}' $(Sources) /dev/null
|
|
|
|
check-for-tabs:
|
|
@echo searching for tabs in files: $(Sources)
|
|
@echo
|
|
@echo
|
|
egrep -n ' ' $(Sources) /dev/null
|
|
|
|
check-footprint:
|
|
@ls -l $(LibDir) | awk '\
|
|
BEGIN { sum = 0; } \
|
|
{ sum += $$5; } \
|
|
END { printf("Libraries: %6.3f MBytes\n", sum/(1024.0*1024.0)); }'
|
|
@ls -l $(ToolDir) | awk '\
|
|
BEGIN { sum = 0; } \
|
|
{ sum += $$5; } \
|
|
END { printf("Programs: %6.3f MBytes\n", sum/(1024.0*1024.0)); }'
|
|
#------------------------------------------------------------------------
|
|
# Print out the directories used for building
|
|
#------------------------------------------------------------------------
|
|
printvars::
|
|
$(Echo) "BuildMode : " '$(BuildMode)'
|
|
$(Echo) "PROJ_SRC_ROOT: " '$(PROJ_SRC_ROOT)'
|
|
$(Echo) "PROJ_SRC_DIR : " '$(PROJ_SRC_DIR)'
|
|
$(Echo) "PROJ_OBJ_ROOT: " '$(PROJ_OBJ_ROOT)'
|
|
$(Echo) "PROJ_OBJ_DIR : " '$(PROJ_OBJ_DIR)'
|
|
$(Echo) "LLVM_SRC_ROOT: " '$(LLVM_SRC_ROOT)'
|
|
$(Echo) "LLVM_OBJ_ROOT: " '$(LLVM_OBJ_ROOT)'
|
|
$(Echo) "PROJ_prefix : " '$(PROJ_prefix)'
|
|
$(Echo) "PROJ_bindir : " '$(PROJ_bindir)'
|
|
$(Echo) "PROJ_libdir : " '$(PROJ_libdir)'
|
|
$(Echo) "PROJ_etcdir : " '$(PROJ_etcdir)'
|
|
$(Echo) "PROJ_includedir : " '$(PROJ_includedir)'
|
|
$(Echo) "UserTargets : " '$(UserTargets)'
|
|
$(Echo) "ObjMakefiles : " '$(ObjMakefiles)'
|
|
$(Echo) "SrcMakefiles : " '$(SrcMakefiles)'
|
|
$(Echo) "ObjDir : " '$(ObjDir)'
|
|
$(Echo) "LibDir : " '$(LibDir)'
|
|
$(Echo) "ToolDir : " '$(ToolDir)'
|
|
$(Echo) "ExmplDir : " '$(ExmplDir)'
|
|
$(Echo) "Sources : " '$(Sources)'
|
|
$(Echo) "TDFiles : " '$(TDFiles)'
|
|
$(Echo) "INCFiles : " '$(INCFiles)'
|
|
$(Echo) "INCTMPFiles : " '$(INCTMPFiles)'
|
|
$(Echo) "PreConditions: " '$(PreConditions)'
|
|
$(Echo) "Compile.CXX : " '$(Compile.CXX)'
|
|
$(Echo) "Compile.C : " '$(Compile.C)'
|
|
$(Echo) "Archive : " '$(Archive)'
|
|
$(Echo) "YaccFiles : " '$(YaccFiles)'
|
|
$(Echo) "LexFiles : " '$(LexFiles)'
|
|
$(Echo) "Module : " '$(Module)'
|
|
$(Echo) "FilesToConfig: " '$(FilesToConfigPATH)'
|
|
$(Echo) "SubDirs : " '$(SubDirs)'
|
|
$(Echo) "ProjLibsPaths: " '$(ProjLibsPaths)'
|
|
$(Echo) "ProjLibsOptions: " '$(ProjLibsOptions)'
|
|
|
|
###
|
|
# Debugging
|
|
|
|
# General debugging rule, use 'make dbg-print-XXX' to print the
|
|
# definition, value and origin of XXX.
|
|
make-print-%:
|
|
$(error PRINT: $(value $*) = "$($*)" (from $(origin $*)))
|