SrcMakefiles := $(filter %Makefile %Makefile.tests,\
$(wildcard $(BUILD_SRC_DIR)/Makefile*))
ObjMakefiles := $(subst $(BUILD_SRC_DIR),$(BUILD_OBJ_DIR),$(SrcMakefiles))
-ConfigureScript := $(LLVM_SRC_ROOT)/configure
-ConfigStatusScript := $(LLVM_OBJ_ROOT)/config.status
+ConfigureScript := $(BUILD_SRC_ROOT)/configure
+ConfigStatusScript := $(BUILD_OBJ_ROOT)/config.status
+LConfigStatusScript:= $(LLVM_OBJ_ROOT)/config.status
MakefileConfigIn := $(LLVM_SRC_ROOT)/Makefile.config.in
MakefileConfig := $(LLVM_OBJ_ROOT)/Makefile.config
PreConditions := $(ConfigStatusScript) $(MakefileConfig) $(ObjMakefiles)
ifneq ($(BUILD_OBJ_ROOT),$(BUILD_SRC_ROOT))
spotless:
- $(Echo) Wiping out $(BUILD_OBJ_ROOT) and rebuilding configuration.
$(Verb) if test -x config.status ; then \
- $(MV) config.status .. ; \
- $(MV) mklib .. ; \
+ $(EchoCmd) Wiping out $(BUILD_OBJ_ROOT) ; \
+ $(MKDIR) .spotless.save ; \
+ $(MV) config.status .spotless.save ; \
+ $(MV) mklib .spotless.save ; \
+ $(MV) projects .spotless.save ; \
$(RM) -rf * ; \
- $(MV) ../config.status . ; \
- $(MV) ../mklib . ; \
- ./config.status ; \
+ $(MV) .spotless.save/config.status . ; \
+ $(MV) .spotless.save/mklib . ; \
+ $(MV) .spotless.save/projects . ; \
+ $(RM) -rf .spotless.save ; \
+ $(EchoCmd) Rebuilding configuration of $(BUILD_OBJ_ROOT) ; \
+ $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
+ $(ConfigStatusScript) ; \
else \
$(EchoCmd) "make spotless" can only be run from $(BUILD_OBJ_ROOT); \
fi
#------------------------------------------------------------------------
# Make sure we're not using a stale configuration
#------------------------------------------------------------------------
+reconfigure:
+ $(Echo) Reconfiguring $(BUILD_OBJ_ROOT)
+ $(Verb) cd $(BUILD_OBJ_ROOT) && \
+ if test -w $(BUILD_OBJ_ROOT)/config.cache ; then \
+ $(RM) $(BUILD_OBJ_ROOT)/config.cache ; \
+ fi ; \
+ $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
+ $(ConfigStatusScript)
+
.PRECIOUS: $(ConfigStatusScript)
$(ConfigStatusScript): $(ConfigureScript)
$(Echo) Reconfiguring with $<
$(Verb) cd $(BUILD_OBJ_ROOT) && \
+ if test -w $(BUILD_OBJ_ROOT)/config.cache ; then \
+ $(RM) $(BUILD_OBJ_ROOT)/config.cache ; \
+ fi ; \
$(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \
$(ConfigStatusScript)
#------------------------------------------------------------------------
# Make sure the configuration makefile is up to date
#------------------------------------------------------------------------
-$(MakefileConfig): $(MakefileConfigIn) $(ConfigStatusScript)
+$(MakefileConfig): $(MakefileConfigIn) $(LConfigStatusScript)
$(Echo) Regenerating $@
- $(Verb) cd $(LLVM_OBJ_ROOT) ; $(ConfigStatusScript) Makefile.config
+ $(Verb) cd $(LLVM_OBJ_ROOT) ; $(LConfigStatusScript) Makefile.config
#------------------------------------------------------------------------
# If the Makefile in the source tree has been updated, copy it over into the
Makefile: $(BUILD_SRC_DIR)/Makefile
$(Echo) "Updating Makefile"
$(Verb) $(MKDIR) $(@D)
- $(Verb) cp -f $< $@
+ $(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
*.in) ;; \
*) $(Echo) "Updating $(@F)" ; \
$(MKDIR) $(@D) ; \
- cp -f $< $@ ;; \
+ $(CP) -f $< $@ ;; \
esac
endif
# Variables derived from configuration we are building
#--------------------------------------------------------------------
+
ifdef ENABLE_PROFILING
BuildMode := Profile
CXX.Flags := -O3 -DNDEBUG -felide-constructors -finline-functions -pg
else
ifdef ENABLE_OPTIMIZED
BuildMode := Release
- CXX.Flags := -O3 -DNDEBUG -finline-functions \
- -felide-constructors -fomit-frame-pointer
- C.Flags := -O3 -DNDEBUG -fomit-frame-pointer
+ # Don't use -fomit-frame-pointer on FreeBSD
+ ifneq ($(OS),FreeBSD)
+ OmitFramePointer := -fomit-frame-pointer
+ endif
+ CXX.Flags := -O3 -DNDEBUG -finline-functions -felide-constructors \
+ $(OmitFramePointer)
+ C.Flags := -O3 -DNDEBUG $(OmitFramePointer)
LD.Flags := -O3 -DNDEBUG
else
BuildMode := Debug
ExmplDir := $(BUILD_OBJ_ROOT)/$(BuildMode)/examples
LLVMLibDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/lib
LLVMToolDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/bin
-LExmplDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/examples
+LLVMExmplDir:= $(LLVM_OBJ_ROOT)/$(BuildMode)/examples
+CFERuntimeLibDir := $(LLVMGCCDIR)/lib
#--------------------------------------------------------------------
# Full Paths To Compiled Tools and Utilities
ifndef GCCLD
GCCLD := $(LLVMToolDir)/gccld$(EXEEXT)
endif
-ifndef LLVMGCC
-LLVMGCC := PATH=$(LLVMToolDir):$(PATH) $(LLVMGCCDIR)/bin/gcc
-endif
-ifndef LLVMGXX
-LLVMGXX := PATH=$(LLVMToolDir):$(PATH) $(LLVMGCCDIR)/bin/g++
-endif
ifndef LDIS
LLVMDIS := $(LLVMToolDir)/llvm-dis$(EXEEXT)
endif
ifndef LOPT
LOPT := $(LLVMToolDir)/opt$(EXEEXT)
endif
+LLVMGCCWITHPATH := PATH="$(LLVMToolDir):$(PATH)" $(LLVMGCC)
+LLVMGXXWITHPATH := PATH="$(LLVMToolDir):$(PATH)" $(LLVMGXX)
#--------------------------------------------------------------------
# Adjust to user's request
Compile.C = $(CC) $(CPP.Flags) $(CompileCommonOpts) -c $(C.Flags)
LTCompile.C = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.C)
-BCCompile.C = $(LLVMGCC) $(CPP.Flags) $(CompileCommonOpts) $(C.Flags) -c
+BCCompile.C = $(LLVMGCCWITHPATH) $(CPP.Flags) $(CompileCommonOpts) \
+ $(C.Flags) -c
Compile.CXX = $(CXX) $(CPP.Flags) $(CompileCommonOpts) $(CXX.Flags) -c
LTCompile.CXX = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.CXX)
-BCCompile.CXX = $(LLVMGXX) $(CPP.Flags) $(CompileCommonOpts) $(CXX.Flags) -c
+BCCompile.CXX = $(LLVMGXXWITHPATH) $(CPP.Flags) $(CompileCommonOpts) \
+ $(CXX.Flags) -c
Link = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \
$(CompileCommonOpts) $(LD.Flags) $(Strip)
Relink = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \
$(Verb) for dir in $(DIRS); do \
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
- cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
+ $(CP) $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
if [ ! -f $$dir/LLVM_DO_NOT_BUILD ]; then \
($(MAKE) -C $$dir $@ ) || exit 1; \
$(Verb) for dir in $(EXPERIMENTAL_DIRS); do \
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
- cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
+ $(CP) $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
if [ ! -f $$dir/LLVM_DO_NOT_BUILD ]; then \
($(MAKE) -C $$dir $@ ) || exit 0; \
$(ParallelTargets) :
$(Verb) if [ ! -f $(@D)/Makefile ]; then \
$(MKDIR) $(@D); \
- cp $(BUILD_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \
+ $(CP) $(BUILD_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \
fi; \
if [ ! -f $$dir/LLVM_DO_NOT_BUILD ]; then \
$(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) ; \
if [ -d $(BUILD_SRC_DIR)/$$dir ]; then\
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
- cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
+ $(CP) $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
if [ ! -f $$dir/LLVM_DO_NOT_BUILD ]; then \
($(MAKE) -C$$dir $@ ) || exit 1; \
ifdef MODULE_NAME
Module := $(LibDir)/$(MODULE_NAME).bc
-LinkModule := $(LLVMGCC) -shared -nostdlib
+LinkModule := $(LLVMGCCWITHPATH) -shared -nostdlib
ifdef EXPORTED_SYMBOL_FILE
LinkMOdule += -Xlinker -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
all-local:: $(LibName.BCA)
ifdef EXPORTED_SYMBOL_FILE
-BCLinkLib = $(LLVMGCC) -shared -nostdlib -Xlinker \
+BCLinkLib = $(LLVMGCCWITHPATH) -shared -nostdlib -Xlinker \
-internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
$(LibName.BCA): $(ObjectsBC) $(LibDir)/.dir $(GCCLD) \
$(LTCompile.CXX) $< -o $@
$(ObjDir)/%.lo $(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
- $(Echo) "Compiling $*.cpp for $(BuildMode) build (PIC)"
+ $(Echo) "Compiling $*.c for $(BuildMode) build (PIC)"
$(LTCompile.C) $< -o $@
else
$(Compile.CXX) $< -o $@
$(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
- $(Echo) "Compiling $*.cpp for $(BuildMode) build"
+ $(Echo) "Compiling $*.c for $(BuildMode) build"
$(Compile.C) $< -o $@
endif
# All of these files depend on tblgen and the .td files.
$(INCTMPFiles) : $(TBLGEN) $(TDFiles)
+# 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 regereated, 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) $< $@
$(TARGET:%=$(ObjDir)/%GenRegisterNames.inc.tmp): \
$(ObjDir)/%GenRegisterNames.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) register names with tblgen"
$(Verb) $(TableGen) -gen-register-enums -o $@ $<
-$(TARGET:%=%GenRegisterNames.inc): \
-%GenRegisterNames.inc : $(ObjDir)/%GenRegisterNames.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenRegisterInfo.h.inc.tmp): \
$(ObjDir)/%GenRegisterInfo.h.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) register information header with tblgen"
$(Verb) $(TableGen) -gen-register-desc-header -o $@ $<
-$(TARGET:%=%GenRegisterInfo.h.inc): \
-%GenRegisterInfo.h.inc : $(ObjDir)/%GenRegisterInfo.h.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenRegisterInfo.inc.tmp): \
$(ObjDir)/%GenRegisterInfo.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) register info implementation with tblgen"
$(Verb) $(TableGen) -gen-register-desc -o $@ $<
-$(TARGET:%=%GenRegisterInfo.inc): \
-%GenRegisterInfo.inc : $(ObjDir)/%GenRegisterInfo.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenInstrNames.inc.tmp): \
$(ObjDir)/%GenInstrNames.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) instruction names with tblgen"
$(Verb) $(TableGen) -gen-instr-enums -o $@ $<
-$(TARGET:%=%GenInstrNames.inc): \
-%GenInstrNames.inc : $(ObjDir)/%GenInstrNames.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenInstrInfo.inc.tmp): \
$(ObjDir)/%GenInstrInfo.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) instruction information with tblgen"
$(Verb) $(TableGen) -gen-instr-desc -o $@ $<
-$(TARGET:%=%GenInstrInfo.inc): \
-%GenInstrInfo.inc : $(ObjDir)/%GenInstrInfo.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenAsmWriter.inc.tmp): \
$(ObjDir)/%GenAsmWriter.inc.tmp : %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) assembly writer with tblgen"
$(Verb) $(TableGen) -gen-asm-writer -o $@ $<
-$(TARGET:%=%GenAsmWriter.inc): \
-%GenAsmWriter.inc : $(ObjDir)/%GenAsmWriter.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
-$(TARGET:%=$(ObjDir)/%GenATTAsmWriter.inc.tmp): \
-$(ObjDir)/%GenATTAsmWriter.inc.tmp : %.td $(ObjDir)/.dir
- $(Echo) "Building $(<F) AT&T assembly writer with tblgen"
- $(Verb) $(TableGen) -gen-asm-writer -o $@ $<
-
-$(TARGET:%=%GenATTAsmWriter.inc): \
-%GenATTAsmWriter.inc : $(ObjDir)/%GenATTAsmWriter.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
-$(TARGET:%=$(ObjDir)/%GenIntelAsmWriter.inc.tmp): \
-$(ObjDir)/%GenIntelAsmWriter.inc.tmp : %.td $(ObjDir)/.dir
- $(Echo) "Building $(<F) Intel assembly writer with tblgen"
+$(TARGET:%=$(ObjDir)/%GenAsmWriter1.inc.tmp): \
+$(ObjDir)/%GenAsmWriter1.inc.tmp : %.td $(ObjDir)/.dir
+ $(Echo) "Building $(<F) assembly writer #1 with tblgen"
$(Verb) $(TableGen) -gen-asm-writer -asmwriternum=1 -o $@ $<
-$(TARGET:%=%GenIntelAsmWriter.inc): \
-%GenIntelAsmWriter.inc : $(ObjDir)/%GenIntelAsmWriter.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
-$(TARGET:%=$(ObjDir)/%GenInstrSelector.inc.tmp): \
-$(ObjDir)/%GenInstrSelector.inc.tmp: %.td $(ObjDir)/.dir
- $(Echo) "Building $(<F) instruction selector with tblgen"
- $(Verb) $(TableGen) -gen-instr-selector -o $@ $<
-
-$(TARGET:%=%GenInstrSelector.inc): \
-%GenInstrSelector.inc : $(ObjDir)/%GenInstrSelector.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
$(TARGET:%=$(ObjDir)/%GenCodeEmitter.inc.tmp): \
$(ObjDir)/%GenCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir
$(Echo) "Building $(<F) code emitter with tblgen"
$(Verb) $(TableGen) -gen-emitter -o $@ $<
-$(TARGET:%=%GenCodeEmitter.inc): \
-%GenCodeEmitter.inc : $(ObjDir)/%GenCodeEmitter.inc.tmp
- $(Verb) cmp -s $@ $< || cp $< $@
-
clean-local::
-$(Verb) $(RM) -f $(INCFiles)
gunzip -c $(DistTarGZip) | $(TAR) xf - && \
cd build && \
../$(DistName)/configure --prefix="$(DistCheckDir)/install" \
- --srcdir=../$(DistName) --with-llvmgccdir="$(LLVMGCCDIR)" && \
+ --srcdir=../$(DistName) && \
$(MAKE) all && \
$(MAKE) check && \
$(MAKE) install && \
if test -d "$$from_dir/$$file"; then \
if test -d "$(BUILD_SRC_DIR)/$$file" && \
test "$$from_dir" != "$(BUILD_SRC_DIR)" ; then \
- cp -pR "$(BUILD_SRC_DIR)/$$file" "$$to_dir" || exit 1; \
+ $(CP) -pR "$(BUILD_SRC_DIR)/$$file" "$$to_dir" || exit 1; \
fi; \
- cp -pR $$from_dir/$$file $$to_dir || exit 1; \
+ $(CP) -pR $$from_dir/$$file $$to_dir || exit 1; \
elif test -f "$$from_dir/$$file" ; then \
- cp -p "$$from_dir/$$file" "$(DistDir)/$$file" || exit 1; \
+ $(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; \
+ $(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!" ; \