Skip to content
Makefile.rules 56.1 KiB
Newer Older
	else $(RM) -f "$(ObjDir)/$*.Cd"; exit 1; fi
Reid Spencer's avatar
Reid Spencer committed

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: %.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 $@


#---------------------------------------------------------
# Create .bc files in the ObjDir directory from .cpp .cc and .c files...
#---------------------------------------------------------
Chris Lattner's avatar
Chris Lattner committed

$(ObjDir)/%.ll: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cpp for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(Verb) if $(BCCompile.CXX) -MD -MT $@ -MP -MF "$(ObjDir)/$*.BCCXXd" \
                              $< -o $@ -S -emit-llvm ; \
	then $(MV) -f "$(ObjDir)/$*.BCCXXd" "$(ObjDir)/$*.d"; \
	else $(RM) -f "$(ObjDir)/$*.BCCXXd"; exit 1; fi

Chris Lattner's avatar
Chris Lattner committed
$(ObjDir)/%.ll: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cc for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(Verb) if $(BCCompile.CXX) -MD -MT $@ -MP -MF "$(ObjDir)/$*.BCCXXd" \
                              $< -o $@ -S -emit-llvm ; \
	then $(MV) -f "$(ObjDir)/$*.BCCXXd" "$(ObjDir)/$*.d"; \
	else $(RM) -f "$(ObjDir)/$*.BCCXXd"; exit 1; fi

Chris Lattner's avatar
Chris Lattner committed
$(ObjDir)/%.ll: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.c for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(Verb) if $(BCCompile.C) -MD -MT $@ -MP -MF "$(ObjDir)/$*.BCCd" \
                            $< -o $@ -S -emit-llvm ; \
	then $(MV) -f "$(ObjDir)/$*.BCCd" "$(ObjDir)/$*.d"; \
	else $(RM) -f "$(ObjDir)/$*.BCCd"; exit 1; fi

# Provide alternate rule sets if dependencies are disabled
Reid Spencer's avatar
Reid Spencer committed
ifdef SHARED_LIBRARY

$(ObjDir)/%.lo $(ObjDir)/%.o: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cpp for $(BuildMode) build (PIC)"
Reid Spencer's avatar
Reid Spencer committed
	$(LTCompile.CXX) $< -o $@ 

$(ObjDir)/%.lo $(ObjDir)/%.o: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cc for $(BuildMode) build (PIC)"
	$(LTCompile.CXX) $< -o $@ 

$(ObjDir)/%.lo $(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) "Compiling $*.c for $(BuildMode) build (PIC)"
Reid Spencer's avatar
Reid Spencer committed
	$(LTCompile.C) $< -o $@ 

else
$(ObjDir)/%.o: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cpp for $(BuildMode) build"
Reid Spencer's avatar
Reid Spencer committed
	$(Compile.CXX) $< -o $@ 
$(ObjDir)/%.o: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cc for $(BuildMode) build"
	$(Compile.CXX) $< -o $@ 

$(ObjDir)/%.o: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) "Compiling $*.c for $(BuildMode) build"
Reid Spencer's avatar
Reid Spencer committed
	$(Compile.C) $< -o $@ 
endif
Chris Lattner's avatar
Chris Lattner committed
$(ObjDir)/%.ll: %.cpp $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cpp for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(BCCompile.CXX) $< -o $@ -S -emit-llvm
Chris Lattner's avatar
Chris Lattner committed
$(ObjDir)/%.ll: %.cc $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.cc for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(BCCompile.CXX) $< -o $@ -S -emit-llvm
Chris Lattner's avatar
Chris Lattner committed
$(ObjDir)/%.ll: %.c $(ObjDir)/.dir $(BUILT_SOURCES)
	$(Echo) "Compiling $*.c for $(BuildMode) build (bytecode)"
Chris Lattner's avatar
Chris Lattner committed
	$(BCCompile.C) $< -o $@ -S -emit-llvm

endif
Chris Lattner's avatar
Chris Lattner committed
# make the C and C++ compilers strip debug info out of bytecode libraries.
ifdef DEBUG_RUNTIME
$(ObjectsBC): $(ObjDir)/%.bc: $(ObjDir)/%.ll $(GCCAS)
	$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
        @$(GCCAS) $< -o $@
else
$(ObjectsBC): $(ObjDir)/%.bc: $(ObjDir)/%.ll $(GCCAS)
	$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
	@$(GCCAS) -strip-debug $< -o $@
#---------------------------------------------------------
# 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
###############################################################################
Chris Lattner's avatar
Chris Lattner committed

Chris Lattner's avatar
Chris Lattner committed
TDFiles := $(strip $(wildcard $(PROJ_SRC_DIR)/*.td) \
           $(LLVM_SRC_ROOT)/lib/Target/Target.td \
           $(LLVM_SRC_ROOT)/lib/Target/TargetSelectionDAG.td)
INCFiles := $(filter %.inc,$(BUILT_SOURCES))
INCTMPFiles := $(INCFiles:%=$(ObjDir)/%.tmp)
.PRECIOUS: $(INCTMPFiles) $(INCFiles)
Chris Lattner's avatar
Chris Lattner committed

# All of these files depend on tblgen and the .td files.
$(INCTMPFiles) : $(TBLGEN) $(TDFiles)
Chris Lattner's avatar
Chris Lattner committed

# 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
Reid Spencer's avatar
Reid Spencer committed
	$(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:%=$(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:%=$(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:%=$(ObjDir)/%GenInstrNames.inc.tmp): \
$(ObjDir)/%GenInstrNames.inc.tmp : %.td $(ObjDir)/.dir
	$(Echo) "Building $(<F) instruction names with tblgen"
	$(Verb) $(TableGen) -gen-instr-enums -o $@ $<
Chris Lattner's avatar
Chris Lattner committed

$(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:%=$(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:%=$(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:%=$(ObjDir)/%GenCodeEmitter.inc.tmp): \
$(ObjDir)/%GenCodeEmitter.inc.tmp: %.td $(ObjDir)/.dir
	$(Echo) "Building $(<F) code emitter with tblgen"
	$(Verb) $(TableGen) -gen-emitter -o $@ $<
$(TARGET:%=$(ObjDir)/%GenDAGISel.inc.tmp): \
$(ObjDir)/%GenDAGISel.inc.tmp : %.td $(ObjDir)/.dir
	$(Echo) "Building $(<F) instruction selector implementation with tblgen"
	$(Verb) $(TableGen) -gen-dag-isel -o $@ $<

$(TARGET:%=$(ObjDir)/%GenSubtarget.inc.tmp): \
$(ObjDir)/%GenSubtarget.inc.tmp : %.td $(ObjDir)/.dir
	$(Echo) "Building $(<F) subtarget information with tblgen"
	$(Verb) $(TableGen) -gen-subtarget -o $@ $<
Reid Spencer's avatar
Reid Spencer committed
clean-local::
###############################################################################
# LEX AND YACC: Provide rules for generating sources with lex and yacc
###############################################################################

#---------------------------------------------------------
# Provide rules for generating a .cpp source file from 
# (f)lex input sources. 
#---------------------------------------------------------

LexFiles  := $(filter %.l,$(Sources))
ifneq ($(LexFiles),)

Reid Spencer's avatar
Reid Spencer committed
# Cancel built-in rules for lex
%.c: %.l
%.cpp: %.l

# Note the extra sed filtering here, used to cut down on the warnings emited 
# by GCC.  The last line is a gross hack to work around flex aparently not 
# being able to resize the buffer on a large token input.  Currently, for 
# uninitialized string buffers in LLVM we can generate very long tokens, so 
# this is a hack around it.
# FIXME.  (f.e. char Buffer[10000] )
Reid Spencer's avatar
Reid Spencer committed
$(PROJ_SRC_DIR)/%.cpp: $(PROJ_SRC_DIR)/%.l
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(FLEX) -t $(PROJ_SRC_DIR)/$*.l | \
	$(SED) 's/void yyunput/inline void yyunput/' | \
	$(SED) 's/void \*yy_flex_realloc/inline void *yy_flex_realloc/' | \
	$(SED) 's/#define YY_BUF_SIZE 16384/#define YY_BUF_SIZE (16384*64)/' \
Reid Spencer's avatar
Reid Spencer committed
	  > $(PROJ_SRC_DIR)/$*.cpp
	$(Echo) "*** DON'T FORGET TO CHECK IN $*.cpp (generated file)"

LexObjs := $(patsubst %.l,$(ObjDir)/%.o,$(LexFiles))
$(LexObjs): $(ObjDir)/%.o : $(PROJ_SRC_DIR)/%.cpp
Chris Lattner's avatar
Chris Lattner committed

endif

#---------------------------------------------------------
# Provide rules for generating a .cpp and .h source files 
# from yacc (bison) input sources.
#---------------------------------------------------------

YaccFiles  := $(filter %.y,$(Sources))
ifneq ($(YaccFiles),)

.PRECIOUS: $(YaccOutput)

# Cancel built-in rules for yacc
%.c: %.y 
%.cpp: %.y
%.h: %.y

Reid Spencer's avatar
Reid Spencer committed
# Rule for building the bison based parsers...
Reid Spencer's avatar
Reid Spencer committed
$(PROJ_SRC_DIR)/%.cpp $(PROJ_SRC_DIR)/%.h : $(PROJ_SRC_DIR)/%.y
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(BISON) -v -d -p $(<F:%Parser.y=%) -o $*.tab.c $<
	$(Verb) $(MV) -f $*.tab.c $(PROJ_SRC_DIR)/$*.cpp
	$(Verb) $(MV) -f $*.tab.h $(PROJ_SRC_DIR)/$*.h
	$(Echo) "*** DON'T FORGET TO CHECK IN $*.cpp and $*.h (generated files)"
Chris Lattner's avatar
Chris Lattner committed

Reid Spencer's avatar
Reid Spencer committed
YaccObjs   := $(patsubst %.y,$(ObjDir)/%.o,$(YaccFiles))
$(YaccObjs): $(ObjDir)/%.o : $(PROJ_SRC_DIR)/%.cpp

YaccOutput := $(addprefix $(patsubst %.y,%,$(YaccFiles)),.output)

Reid Spencer's avatar
Reid Spencer committed
	-$(Verb) $(RM) -f $(YaccOutput)
Chris Lattner's avatar
Chris Lattner committed

###############################################################################
# OTHER RULES: Other rules needed
###############################################################################
Chris Lattner's avatar
Chris Lattner committed
# To create postscript files from dot files...
Chris Lattner's avatar
Chris Lattner committed
%.ps: %.dot
	$(Echo) "Cannot build $@: The program dot is not installed"
Chris Lattner's avatar
Chris Lattner committed

# 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.
# 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.
Reid Spencer's avatar
Reid Spencer committed
clean-local::
Reid Spencer's avatar
Reid Spencer committed
endif
	-$(Verb) $(RM) -f core core.[0-9][0-9]* *.o *.d *~ *.flc
ifneq ($(strip $(SHLIBEXT)),) # Extra paranoia - make real sure SHLIBEXT is set
clean-all-local::
	-$(Verb) $(RM) -rf Debug Release Profile
# Build tags database for Emacs/Xemacs:
Reid Spencer's avatar
Reid Spencer committed
	find $(PROJ_SRC_ROOT)/include $(PROJ_SRC_ROOT)/lib \
          $(PROJ_SRC_ROOT)/tools $(PROJ_SRC_ROOT)/examples \
          $(PROJ_OBJ_ROOT)/include $(PROJ_OBJ_ROOT)/lib \
          $(PROJ_OBJ_ROOT)/tools $(PROJ_OBJ_ROOT)/examples \
        -name '*.cpp' -o -name '*.h' | \
Reid Spencer's avatar
Reid Spencer committed
	find $(PROJ_SRC_ROOT)/include $(PROJ_SRC_ROOT)/lib \
          $(PROJ_SRC_ROOT)/tools $(PROJ_SRC_ROOT)/examples \
          $(PROJ_OBJ_ROOT)/include $(PROJ_OBJ_ROOT)/lib \
          $(PROJ_OBJ_ROOT)/tools $(PROJ_OBJ_ROOT)/examples \
          \( -name '*.cpp' -o -name '*.h' \) -print | \
Reid Spencer's avatar
Reid Spencer committed
          ctags -ImtT -o $(PROJ_OBJ_ROOT)/CTAGS -L -
Reid Spencer's avatar
Reid Spencer committed
###############################################################################
# DEPENDENCIES: Include the dependency files if we should
###############################################################################
ifndef DISABLE_AUTO_DEPENDENCIES

Reid Spencer's avatar
Reid Spencer committed
# If its not one of the cleaning targets
ifneq ($strip($(filter-out clean clean-local dist-clean,$(MAKECMDGOALS))),)
Reid Spencer's avatar
Reid Spencer committed
# Get the list of dependency files
DependFiles := $(basename $(filter %.cpp %.c %.cc, $(Sources)))
Reid Spencer's avatar
Reid Spencer committed
DependFiles := $(patsubst %,$(PROJ_OBJ_DIR)/$(BuildMode)/%.d,$(DependFiles))
Reid Spencer's avatar
Reid Spencer committed

-include /dev/null $(DependFiles)
###############################################################################
# CHECK: Running the test suite
###############################################################################

check::
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) if test -d "$(PROJ_OBJ_ROOT)/test" ; then \
	  if test -f "$(PROJ_OBJ_ROOT)/test/Makefile" ; then \
	    $(EchoCmd) Running test suite ; \
Reid Spencer's avatar
Reid Spencer committed
	    $(MAKE) -C $(PROJ_OBJ_ROOT)/test check-local \
	      TESTSUITE=$(TESTSUITE) ; \
	  else \
	    $(EchoCmd) No Makefile in test directory ; \
	  fi ; \
	else \
	  $(EchoCmd) No test directory ; \
	fi

Reid Spencer's avatar
Reid Spencer committed
###############################################################################
# DISTRIBUTION: Handle construction of a distribution tarball
Reid Spencer's avatar
Reid Spencer committed
###############################################################################

#------------------------------------------------------------------------
# Define distribution related variables
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
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 \
Reid Spencer's avatar
Reid Spencer committed
               $(PROJ_SRC_DIR)/*.h \
               $(PROJ_SRC_DIR)/*.td \
               $(PROJ_SRC_DIR)/*.def \
               $(PROJ_SRC_DIR)/*.ll \
               $(PROJ_SRC_DIR)/*.in))
DistSources  = $(Sources) $(EXTRA_DIST)
DistFiles    = $(DistAlways) $(DistSources) $(DistOther)
#------------------------------------------------------------------------
# We MUST build distribution with OBJ_DIR != SRC_DIR
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifeq ($(PROJ_SRC_DIR),$(PROJ_OBJ_DIR))
Reid Spencer's avatar
Reid Spencer committed
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
	$(Echo) ERROR: Target $@ only available with OBJ_DIR != SRC_DIR
#------------------------------------------------------------------------
# Prevent attempt to run dist targets from anywhere but the top level
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
ifneq ($(LEVEL),.)
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) ERROR: You must run $@ from $(PROJ_OBJ_ROOT)
#------------------------------------------------------------------------
# Provide the top level targets
#------------------------------------------------------------------------

$(DistTarGZip) : $(TopDistDir)/.makedistdir
	$(Echo) Packing gzipped distribution tar file.
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) cd $(PROJ_OBJ_ROOT) ; $(TAR) chf - "$(DistName)" | \
	  $(GZIP) -c > "$(DistTarGZip)"
$(DistTarBZ2) : $(TopDistDir)/.makedistdir
	$(Echo) Packing bzipped distribution tar file.
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) cd $(PROJ_OBJ_ROOT) ; $(TAR) chf - $(DistName) | \
	  $(BZIP2) -c >$(DistTarBZ2)
$(DistZip) : $(TopDistDir)/.makedistdir
	$(Echo) Packing zipped distribution file.
	$(Verb) rm -f $(DistZip)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) cd $(PROJ_OBJ_ROOT) ; $(ZIP) -rq $(DistZip) $(DistName)

dist :: $(DistTarGZip) $(DistTarBZ2) $(DistZip) 
	$(Echo) ===== DISTRIBUTION PACKAGING SUCESSFUL =====
DistCheckDir := $(PROJ_OBJ_ROOT)/_distcheckdir
dist-check:: $(DistTarGZip)
	$(Echo) Checking distribution tar file.
	$(Verb) if test -d $(DistCheckDir) ; then \
	$(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) install && \
	  $(MAKE) uninstall && \
	  $(MAKE) dist && \
	  $(MAKE) clean && \
	  $(MAKE) dist-clean && \
	  $(EchoCmd) ===== $(DistTarGZip) Ready For Distribution =====
Reid Spencer's avatar
Reid Spencer committed

dist-clean::
	$(Echo) Cleaning distribution files
	-$(Verb) $(RM) -rf $(DistTarGZip) $(DistTarBZ2) $(DistZip) $(DistName) \
	  $(DistCheckDir)
#------------------------------------------------------------------------
# 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) ; \
	  $(EchoCmd) Making 'all' to verify build ; \
	  $(MAKE) all ; \
	$(Echo) Building Distribution Directory $(DistDir)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) srcdirstrip=`echo "$(PROJ_SRC_DIR)" | sed 's|.|.|g'`; \
	srcrootstrip=`echo "$(PROJ_SRC_ROOT)" | sed 's|.|.|g'`; \
Reid Spencer's avatar
Reid Spencer committed
	for file in $(DistFiles) ; do \
	  case "$$file" in \
Reid Spencer's avatar
Reid Spencer committed
	    $(PROJ_SRC_DIR)/*) \
	      file=`echo "$$file" | sed "s#^$$srcdirstrip/##"` \
	      ;; \
Reid Spencer's avatar
Reid Spencer committed
	    $(PROJ_SRC_ROOT)/*) \
	      file=`echo "$$file" | \
		sed "s#^$$srcrootstrip/##"` \
	      ;; \
Reid Spencer's avatar
Reid Spencer committed
	  esac; \
Reid Spencer's avatar
Reid Spencer committed
	  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 \
Reid Spencer's avatar
Reid Spencer committed
	    from_dir=. ; \
	  fi ; \
	  to_dir=`echo "$$file" | sed -e 's#/[^/]*$$##'` ; \
Reid Spencer's avatar
Reid Spencer committed
	  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; \
Reid Spencer's avatar
Reid Spencer committed
          fi ; \
	  if test -d "$$from_dir/$$file"; then \
Reid Spencer's avatar
Reid Spencer committed
	    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) ; \
Reid Spencer's avatar
Reid Spencer committed
	    fi; \
	  elif test -f "$$from_dir/$$file" ; then \
Reid Spencer's avatar
Reid Spencer committed
	    $(CP) -p "$$from_dir/$$file" "$(DistDir)/$$file" || exit 1; \
Reid Spencer's avatar
Reid Spencer committed
	  elif test -L "$$from_dir/$$file" ; then \
Reid Spencer's avatar
Reid Spencer committed
	    $(CP) -pd "$$from_dir/$$file" $(DistDir)/$$file || exit 1; \
Reid Spencer's avatar
Reid Spencer committed
	  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" ; \
Reid Spencer's avatar
Reid Spencer committed
	  fi; \
	done
	$(Verb) for subdir in $(DistSubDirs) ; do \
Reid Spencer's avatar
Reid Spencer committed
	  if test "$$subdir" \!= "." ; then \
	    new_distdir="$(DistDir)/$$subdir" ; \
	    test -d "$$new_distdir" || $(MKDIR) "$$new_distdir" || exit 1; \
	    ( cd $$subdir && $(MAKE) DistDir="$$new_distdir" distdir ) || \
	    exit 1; \
Reid Spencer's avatar
Reid Spencer committed
	  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.
Reid Spencer's avatar
Reid Spencer committed
dist-hook::

endif

###############################################################################
# TOP LEVEL - targets only to apply at the top level directory
###############################################################################

ifeq ($(LEVEL),.)
Reid Spencer's avatar
Reid Spencer committed

#------------------------------------------------------------------------
# Install support for the project's include files:
Reid Spencer's avatar
Reid Spencer committed
#------------------------------------------------------------------------
install-local::
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) $(MKDIR) $(PROJ_includedir)
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) if test -d "$(PROJ_SRC_ROOT)/include" ; then \
Reid Spencer's avatar
Reid Spencer committed
	  cd $(PROJ_SRC_ROOT)/include && \
	  for  hdr in `find . -type f '!' '(' -name '*~' -o -name '.cvsignore' \
	      -o -name '.#*' -o -name '*.in' ')' -print | grep -v CVS ` ; do \
Reid Spencer's avatar
Reid Spencer committed
	    instdir=`dirname "$(PROJ_includedir)/$$hdr"` ; \
	    if test \! -d "$$instdir" ; then \
	      $(EchoCmd) Making install directory $$instdir ; \
	      $(MKDIR) $$instdir ;\
	    fi ; \
	    $(DataInstall) $$hdr $(PROJ_includedir)/$$hdr ; \
Reid Spencer's avatar
Reid Spencer committed
ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) if test -d "$(PROJ_OBJ_ROOT)/include" ; then \
Reid Spencer's avatar
Reid Spencer committed
	  for hdr in `find . -type f -print | grep -v CVS` ; do \
Reid Spencer's avatar
Reid Spencer committed
	    $(DataInstall) $$hdr $(PROJ_includedir)/$$hdr ; \
Reid Spencer's avatar
Reid Spencer committed
endif
Reid Spencer's avatar
Reid Spencer committed

uninstall-local::
Reid Spencer's avatar
Reid Spencer committed
	$(Verb) if [ -d "$(PROJ_SRC_ROOT)/include" ] ; then \
	  cd $(PROJ_SRC_ROOT)/include && \
Reid Spencer's avatar
Reid Spencer committed
	    $(RM) -f `find . -path '*/Internal' -prune -o '(' -type f \
Chris Lattner's avatar
Chris Lattner committed
	      '!' '(' -name '*~' -o -name '.cvsignore' -o -name '.#*' \
        -o -name '*.in' ')' -print ')' | \
        grep -v CVS | sed 's#^#$(PROJ_includedir)/#'` ; \
	  cd $(PROJ_SRC_ROOT)/include && \
Chris Lattner's avatar
Chris Lattner committed
	    $(RM) -f `find . -path '*/Internal' -prune -o '(' -type f -name '*.in' \
      -print ')' | sed 's#\.in$$##;s#^#$(PROJ_includedir)/#'` ; \
#------------------------------------------------------------------------
# Print out the directories used for building
#------------------------------------------------------------------------
Reid Spencer's avatar
Reid Spencer committed
printvars::
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) "BuildMode    : " '$(BuildMode)'
	$(Echo) "PROJ_SRC_ROOT: " '$(PROJ_SRC_ROOT)'
	$(Echo) "PROJ_SRC_DIR : " '$(PROJ_SRC_DIR)'
	$(Echo) "PROJ_OBJ_ROOT: " '$(PROJ_OBJ_ROOT)'
	$(Echo) "PROJ_OBJ_DIR : " '$(PROJ_OBJ_DIR)'
	$(Echo) "LLVM_SRC_ROOT: " '$(LLVM_SRC_ROOT)'
	$(Echo) "LLVM_OBJ_ROOT: " '$(LLVM_OBJ_ROOT)'
	$(Echo) "PROJ_prefix  : " '$(PROJ_prefix)'
	$(Echo) "PROJ_bindir  : " '$(PROJ_bindir)'
	$(Echo) "PROJ_libdir  : " '$(PROJ_libdir)'
	$(Echo) "PROJ_etcdir  : " '$(PROJ_etcdir)'
	$(Echo) "PROJ_includedir  : " '$(PROJ_includedir)'
Reid Spencer's avatar
Reid Spencer committed
	$(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)'
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) "Compile.CXX  : " '$(Compile.CXX)'
	$(Echo) "Compile.C    : " '$(Compile.C)'
	$(Echo) "Archive      : " '$(Archive)'
	$(Echo) "YaccFiles    : " '$(YaccFiles)'
	$(Echo) "LexFiles     : " '$(LexFiles)'
	$(Echo) "Module       : " '$(Module)'
Reid Spencer's avatar
Reid Spencer committed
	$(Echo) "FilesToConfig: " '$(FilesToConfigPATH)'