Proper way of doing llvm canadian-cross compilation.
authorAnton Korobeynikov <asl@math.spbu.ru>
Mon, 10 Nov 2008 07:33:13 +0000 (07:33 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Mon, 10 Nov 2008 07:33:13 +0000 (07:33 +0000)
Patch by Jim Grosbach!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58981 91177308-0d34-0410-b5e6-96231b3b80d8

Makefile
Makefile.rules

index 58a5fe5e1833fe732055baca8fae2db89a276060..cfb4c1258ed4c750a896121646ae1c3600074f48 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,20 +17,21 @@ LEVEL := .
 #   5. Build llvm-config, which determines inter-lib dependencies for tools.
 #   6. Build tools, runtime, docs.
 #
-DIRS := lib/System lib/Support utils lib/VMCore lib tools/llvm-config \
-        tools runtime docs
+# When cross-compiling, there are some things (tablegen) that need to
+# be build for the build system first.
+ifeq ($(BUILD_DIRS_ONLY),1)
+  DIRS := lib/System lib/Support utils
+  OPTIONAL_DIRS :=
+else
+  DIRS := lib/System lib/Support utils lib/VMCore lib tools/llvm-config \
+          tools runtime docs
+  OPTIONAL_DIRS := examples projects bindings
+endif
 
-OPTIONAL_DIRS := examples projects bindings
 EXTRA_DIST := test llvm.spec include win32 Xcode
 
 include $(LEVEL)/Makefile.config 
 
-# When cross-compiling, there are some things (tablegen) that need to
-# be build for the build system.
-ifeq ($(LLVM_CROSS_COMPILING),1)
-  BUILD_TARGET_DIRS := lib/System lib/Support utils
-endif
-
 # llvm-gcc4 doesn't need runtime libs.  llvm-gcc4 is the only supported one.
 # FIXME: Remove runtime entirely once we have an understanding of where
 # libprofile etc should go.
@@ -60,6 +61,23 @@ ifeq ($(MAKECMDGOALS),install)
   OPTIONAL_DIRS := $(filter bindings, $(OPTIONAL_DIRS))
 endif
 
+# If we're cross-compiling, build the build-hosted tools first
+ifeq ($(LLVM_CROSS_COMPILING),1)
+all:: cross-compile-build-tools
+
+clean::
+       $(Verb) rm -rf BuildTools
+
+cross-compile-build-tools:
+       $(Verb) if [ ! -f BuildTools/Makefile ]; then \
+          $(MKDIR) BuildTools; \
+         cd BuildTools ; \
+         $(PROJ_SRC_DIR)/configure ; \
+         cd .. ; \
+       fi; \
+        ($(MAKE) -C BuildTools BUILD_DIRS_ONLY=1 ) || exit 1;
+endif
+
 # Include the main makefile machinery.
 include $(LLVM_SRC_ROOT)/Makefile.rules
 
@@ -114,6 +132,7 @@ $(FilesToConfigPATH) : $(LLVM_OBJ_ROOT)/% : $(LLVM_SRC_ROOT)/%.in
 
 # NOTE: This needs to remain as the last target definition in this file so
 # that it gets executed last.
+ifneq ($(BUILD_DIRS_ONLY),1)
 all:: 
        $(Echo) '*****' Completed $(BuildMode)$(AssertMode) Build
 ifeq ($(BuildMode),Debug)
@@ -122,6 +141,7 @@ ifeq ($(BuildMode),Debug)
        $(Echo) '*****' make an optimized build. Alternatively you can
        $(Echo) '*****' configure with --enable-optimized.
 endif
+endif
 
 check-llvm2cpp:
        $(Verb)$(MAKE) check TESTSUITE=Feature RUNLLVM2CPP=1
index 3fdae66c413e716c6242cc68ae049e94e091eabe..849c70bc04c1d0621be5abffae2e9f9846c4e81f 100644 (file)
@@ -184,7 +184,7 @@ endif
 $(UserTargets):: $(PreConditions)
 
 all:: all-local
-clean:: clean-local 
+clean:: clean-local
 clean-all:: clean-local clean-all-local
 install:: install-local
 uninstall:: uninstall-local
@@ -309,29 +309,17 @@ endif
 #--------------------------------------------------------------------
 TargetMode :=
 ifeq ($(LLVM_CROSS_COMPILING),1)
-  ifeq ($(BUILD_COMPONENT),1)
-    TargetMode := Build
-  else
-    TargetMode := Host
-  endif
-  BuildLLVMToolDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/Build/bin
+  BuildLLVMToolDir := $(LLVM_OBJ_ROOT)/BuildTools/$(BuildMode)/bin
 endif
 
 ObjRootDir  := $(PROJ_OBJ_DIR)/$(BuildMode)
-# It is very important that ObjDir not have an extra trailing
-# slash. This ends up changing the rules so that dependency file (.d)
-# information is not used at all!
-ifeq ($(TargetMode),)
-  ObjDir      := $(ObjRootDir)
-else
-  ObjDir      := $(ObjRootDir)/$(TargetMode)
-endif
-LibDir      := $(PROJ_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/lib
-ToolDir     := $(PROJ_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/bin
-ExmplDir    := $(PROJ_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/examples
-LLVMLibDir  := $(LLVM_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/lib
-LLVMToolDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/bin
-LLVMExmplDir:= $(LLVM_OBJ_ROOT)/$(BuildMode)/$(TargetMode)/examples
+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
 CFERuntimeLibDir := $(LLVMGCCDIR)/lib
 
 #--------------------------------------------------------------------
@@ -347,7 +335,7 @@ LLVMAS   := $(LLVMToolDir)/llvm-as$(EXEEXT)
 endif
 ifndef TBLGEN
   ifeq ($(LLVM_CROSS_COMPILING),1)
-    TBLGEN   := $(BuildLLVMToolDir)/tblgen$(EXEEXT)
+    TBLGEN   := $(BuildLLVMToolDir)/tblgen$(BUILD_EXEEXT)
   else
     TBLGEN   := $(LLVMToolDir)/tblgen$(EXEEXT)
   endif
@@ -594,16 +582,6 @@ ifdef DIRS
 SubDirs += $(DIRS)
 
 ifneq ($(PROJ_SRC_ROOT),$(PROJ_OBJ_ROOT))
-ifdef BUILD_TARGET_DIRS
-$(RecursiveTargets)::
-       $(Verb) for dir in $(BUILD_TARGET_DIRS); do \
-           if [ ! -f $$dir/Makefile ]; then \
-            $(MKDIR) $$dir; \
-              $(CP) $(PROJ_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
-           fi; \
-            ($(MAKE) -C $$dir $@ BUILD_COMPONENT=1 NO_INSTALL=1 ) || exit 1; \
-          done
-endif
 $(RecursiveTargets)::
        $(Verb) for dir in $(DIRS); do \
          if [ ! -f $$dir/Makefile ]; then \
@@ -613,12 +591,6 @@ $(RecursiveTargets)::
          ($(MAKE) -C $$dir $@ ) || exit 1; \
        done
 else
-ifdef BUILD_TARGET_DIRS
-$(RecursiveTargets)::
-       $(Verb) for dir in $(BUILD_TARGET_DIRS); do \
-            ($(MAKE) -C $$dir $@ BUILD_COMPONENT=1 NO_INSTALL=1 ) || exit 1; \
-          done
-endif
 $(RecursiveTargets)::
        $(Verb) for dir in $(DIRS); do \
          ($(MAKE) -C $$dir $@ ) || exit 1; \