|  | #===-- 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):: | 
|  |  | 
|  | #------------------------------------------------------------------------ | 
|  | # LLVMBuild Integration | 
|  | #------------------------------------------------------------------------ | 
|  | # | 
|  | # We use llvm-build to generate all the data required by the Makefile based | 
|  | # build system in one swoop: | 
|  | # | 
|  | #  - We generate a file (a Makefile fragment) in the object root which contains | 
|  | #    all the definitions that are required by Makefiles across the entire | 
|  | #    project. | 
|  | # | 
|  | #  - We generate the library table used by llvm-config. | 
|  | # | 
|  | #  - We generate the dependencies for the Makefile fragment, so that we will | 
|  | #    automatically reconfigure outselves. | 
|  |  | 
|  | # The path to the llvm-build tool itself. | 
|  | LLVMBuildTool	:= $(PROJ_SRC_ROOT)/utils/llvm-build/llvm-build | 
|  |  | 
|  | # The files we are going to generate using llvm-build. | 
|  | LLVMBuildMakeFrag := $(PROJ_OBJ_ROOT)/Makefile.llvmbuild | 
|  | LLVMConfigLibraryDependenciesInc := \ | 
|  | $(PROJ_OBJ_ROOT)/tools/llvm-config/LibraryDependencies.inc | 
|  |  | 
|  | # This is for temporary backwards compatibility. | 
|  | ifndef TARGET_NATIVE_ARCH | 
|  | TARGET_NATIVE_ARCH := $(ARCH) | 
|  | endif | 
|  |  | 
|  | # The rule to create the LLVMBuild Makefile fragment as well as the llvm-config | 
|  | # library table. | 
|  | # | 
|  | # Note that this target gets its real dependencies generated for us by | 
|  | # llvm-build. | 
|  | # | 
|  | # We include a dependency on this Makefile to ensure that changes to the | 
|  | # generation command get picked up. | 
|  | $(LLVMBuildMakeFrag): $(PROJ_SRC_ROOT)/Makefile.rules \ | 
|  | $(PROJ_OBJ_ROOT)/Makefile.config | 
|  | $(Echo) Constructing LLVMBuild project information. | 
|  | $(Verb) $(LLVMBuildTool) \ | 
|  | --native-target "$(TARGET_NATIVE_ARCH)" \ | 
|  | --enable-targets "$(TARGETS_TO_BUILD)" \ | 
|  | --enable-optional-components "$(OPTIONAL_COMPONENTS)" \ | 
|  | --write-library-table $(LLVMConfigLibraryDependenciesInc) \ | 
|  | --write-make-fragment $(LLVMBuildMakeFrag) | 
|  |  | 
|  | # For completeness, let Make know how the extra files are generated. | 
|  | $(LLVMConfigLibraryDependenciesInc): $(LLVMBuildMakeFrag) | 
|  |  | 
|  | # Include the generated Makefile fragment. | 
|  | # | 
|  | # We currently only include the dependencies for the fragment itself if we are | 
|  | # at the top-level. Otherwise, recursive invocations would ends up doing | 
|  | # substantially more redundant stat'ing. | 
|  | # | 
|  | # This means that we won't properly regenerate things for developers used to | 
|  | # building from a subdirectory, but that is always somewhat unreliable. | 
|  | ifeq ($(LEVEL),.) | 
|  | LLVMBUILD_INCLUDE_DEPENDENCIES := 1 | 
|  |  | 
|  | # Clean the generated makefile fragment at the top-level. | 
|  | clean-local:: | 
|  | -$(Verb) $(RM) -f $(LLVMBuildMakeFrag) | 
|  | endif | 
|  | -include $(LLVMBuildMakeFrag) | 
|  |  | 
|  | ################################################################################ | 
|  | # 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 | 
|  |  | 
|  | ############################################################################### | 
|  | # 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_LIBCPP),1) | 
|  | CXX.Flags +=  -stdlib=libc++ | 
|  | LD.Flags +=  -stdlib=libc++ | 
|  | endif | 
|  |  | 
|  | ifeq ($(ENABLE_CXX11),1) | 
|  | CXX.Flags += -std=c++11 | 
|  | endif | 
|  |  | 
|  | ifeq ($(ENABLE_WERROR),1) | 
|  | CXX.Flags += -Werror | 
|  | C.Flags += -Werror | 
|  | 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)]: | 
|  | ifdef BUILD_DIRS_ONLY | 
|  | EchoCmd  := $(EchoCmd) "(build tools)": | 
|  | endif | 
|  |  | 
|  | Echo     := @$(EchoCmd) | 
|  | ifndef LLVMAS | 
|  | LLVMAS   := $(LLVMToolDir)/llvm-as$(EXEEXT) | 
|  | endif | 
|  | ifndef LLVM_TBLGEN | 
|  | ifeq ($(LLVM_CROSS_COMPILING),1) | 
|  | LLVM_TBLGEN   := $(BuildLLVMToolDir)/llvm-tblgen$(BUILD_EXEEXT) | 
|  | else | 
|  | LLVM_TBLGEN   := $(LLVMToolDir)/llvm-tblgen$(EXEEXT) | 
|  | endif | 
|  | endif | 
|  | ifeq ($(LLVM_CROSS_COMPILING),1) | 
|  | LLVM_CONFIG := $(BuildLLVMToolDir)/llvm-config$(BUILD_EXEEXT) | 
|  | else | 
|  | LLVM_CONFIG := $(LLVMToolDir)/llvm-config$(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 | 
|  | ifndef LLVMLINK | 
|  | LLVMLINK      := $(LLVMToolDir)/llvm-link$(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) $(COVERED_SWITCH_DEFAULT) | 
|  | # 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. | 
|  |  | 
|  | # On Windows, SharedLibDir != LibDir. The order is important. | 
|  | ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW)) | 
|  | LD.Flags    += -L$(SharedLibDir) -L$(LibDir) -L$(LLVMToolDir) -L$(LLVMLibDir) | 
|  | else | 
|  | LD.Flags    += -L$(LibDir) -L$(LLVMLibDir) | 
|  | endif | 
|  |  | 
|  | CPP.BaseFlags += -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_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) | 
|  |  | 
|  | ifeq ($(INCLUDE_BUILD_DIR),1) | 
|  | CPP.Flags   += -I$(ObjDir) | 
|  | endif | 
|  |  | 
|  | # 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 | 
|  |  | 
|  | 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) | 
|  |  | 
|  | 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.Flags= -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) | 
|  | LLVMTableGen  = $(LLVM_TBLGEN) $(TableGen.Flags) | 
|  |  | 
|  | 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) -o -f $(T)/Makefile && 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) \ | 
|  | SD=$(PROJ_SRC_DIR)/$(@D); \ | 
|  | DD=$(@D); \ | 
|  | if [ ! -f $$SD/Makefile ]; then \ | 
|  | SD=$(@D); \ | 
|  | DD=$(notdir $(@D)); \ | 
|  | fi; \ | 
|  | if ([ ! -f $$DD/Makefile ] || \ | 
|  | command test $$DD/Makefile -ot \ | 
|  | $$SD/Makefile ); then \ | 
|  | $(MKDIR) $$DD; \ | 
|  | $(CP) $$SD/Makefile $$DD/Makefile; \ | 
|  | fi; \ | 
|  | $(MAKE) -C $$DD $(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 '[[:alnum:]_]' $< && 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 := $(LLVMLINK) | 
|  |  | 
|  |  | 
|  | ifdef EXPORTED_SYMBOL_FILE | 
|  | LinkModule += -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE) | 
|  | endif | 
|  |  | 
|  | $(Module): $(BUILT_SOURCES) $(ObjectsBC) $(LibDir)/.dir $(LLVMLINK) | 
|  | $(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 = $(LLVMLINK) -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE) | 
|  |  | 
|  | $(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir $(LLVMLINK) \ | 
|  | $(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 GNU)) | 
|  | 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 | 
|  |  | 
|  | ifdef CODESIGN_TOOLS | 
|  | $(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) | 
|  | $(Echo) ======= Code-Signing $(BuildMode) Executable $(TOOLNAME) | 
|  | $(Verb) codesign -s - $@ | 
|  | else | 
|  | $(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) | 
|  | endif | 
|  |  | 
|  | 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 | 
|  |  | 
|  | ifdef INTERNAL_TOOL | 
|  | ToolBinDir = $(DESTDIR)$(PROJ_internal_prefix)/bin | 
|  | else | 
|  | ToolBinDir = $(DESTDIR)$(PROJ_bindir) | 
|  | endif | 
|  | DestTool = $(ToolBinDir)/$(TOOLEXENAME) | 
|  |  | 
|  | install-local:: $(DestTool) | 
|  |  | 
|  | $(DestTool): $(ToolBuildPath) | 
|  | $(Echo) Installing $(BuildMode) $(DestTool) | 
|  | $(Verb) $(MKDIR) $(ToolBinDir) | 
|  | $(Verb) $(ProgInstall) $(ToolBuildPath) $(DestTool) | 
|  |  | 
|  | uninstall-local:: | 
|  | $(Echo) Uninstalling $(BuildMode) $(DestTool) | 
|  | -$(Verb) $(RM) -f $(DestTool) | 
|  |  | 
|  | # TOOLALIAS install. | 
|  | ifdef TOOLALIAS | 
|  | DestToolAlias = $(ToolBinDir)/$(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 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 .inc.tmp files depend on the .td files. | 
|  | $(INCTMPFiles) : $(TDFiles) | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenRegisterInfo.inc.tmp): \ | 
|  | $(ObjDir)/%GenRegisterInfo.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) register info implementation with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-register-info -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenInstrInfo.inc.tmp): \ | 
|  | $(ObjDir)/%GenInstrInfo.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) instruction information with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-instr-info -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenAsmWriter.inc.tmp): \ | 
|  | $(ObjDir)/%GenAsmWriter.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) assembly writer with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-asm-writer -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenAsmWriter1.inc.tmp): \ | 
|  | $(ObjDir)/%GenAsmWriter1.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) assembly writer #1 with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-asm-writer -asmwriternum=1 -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenAsmMatcher.inc.tmp): \ | 
|  | $(ObjDir)/%GenAsmMatcher.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) assembly matcher with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-asm-matcher -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenMCCodeEmitter.inc.tmp): \ | 
|  | $(ObjDir)/%GenMCCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) MC code emitter with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-emitter -mc-emitter -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenMCPseudoLowering.inc.tmp): \ | 
|  | $(ObjDir)/%GenMCPseudoLowering.inc.tmp: %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) MC Pseudo instruction expander with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-pseudo-lowering -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenCodeEmitter.inc.tmp): \ | 
|  | $(ObjDir)/%GenCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) code emitter with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-emitter -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenDAGISel.inc.tmp): \ | 
|  | $(ObjDir)/%GenDAGISel.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) DAG instruction selector implementation with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-dag-isel -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenDisassemblerTables.inc.tmp): \ | 
|  | $(ObjDir)/%GenDisassemblerTables.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) disassembly tables with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-disassembler -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenEDInfo.inc.tmp): \ | 
|  | $(ObjDir)/%GenEDInfo.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) enhanced disassembly information with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-enhanced-disassembly-info -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenFastISel.inc.tmp): \ | 
|  | $(ObjDir)/%GenFastISel.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) \"fast\" instruction selector implementation with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-fast-isel -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenSubtargetInfo.inc.tmp): \ | 
|  | $(ObjDir)/%GenSubtargetInfo.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) subtarget information with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-subtarget -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenCallingConv.inc.tmp): \ | 
|  | $(ObjDir)/%GenCallingConv.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) calling convention information with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-callingconv -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(TARGET:%=$(ObjDir)/%GenIntrinsics.inc.tmp): \ | 
|  | $(ObjDir)/%GenIntrinsics.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) intrinsics information with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-tgt-intrinsic -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(ObjDir)/ARMGenDecoderTables.inc.tmp : ARM.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) decoder tables with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-arm-decoder -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | $(ObjDir)/%GenDFAPacketizer.inc.tmp : %.td $(ObjDir)/.dir $(LLVM_TBLGEN) | 
|  | $(Echo) "Building $(<F) DFA packetizer tables with tblgen" | 
|  | $(Verb) $(LLVMTableGen) -gen-dfa-packetizer -o $(call SYSPATH, $@) $< | 
|  |  | 
|  | clean-local:: | 
|  | -$(Verb) $(RM) -f $(INCFiles) | 
|  |  | 
|  | endif # TARGET | 
|  |  | 
|  | ############################################################################### | 
|  | # 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 | 
|  | 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 | 
|  |  | 
|  | # An alias dating from when both lit and DejaGNU test runners were used. | 
|  | check-lit:: check | 
|  |  | 
|  | 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_internal_prefix  : " '$(PROJ_internal_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 $*))) |