about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-09-23 10:50:06 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-09-23 10:50:16 -0700
commit18c6cc63717bde7095c2e093e5dcff9661aefe79 (patch)
tree0d9ab57a0adae1e1b306248da41ea9f8ad6f035c
parent5310cf4f302fd47b8fde4d0bfe156554b17bd905 (diff)
downloadrust-18c6cc63717bde7095c2e093e5dcff9661aefe79.tar.gz
rust-18c6cc63717bde7095c2e093e5dcff9661aefe79.zip
More steps to arch-specific target libs (#474)
-rw-r--r--Makefile.in1
-rwxr-xr-xconfigure46
-rw-r--r--mk/stage0.mk13
-rw-r--r--mk/stageN.mk126
-rw-r--r--src/comp/driver/rustc.rs2
5 files changed, 139 insertions, 49 deletions
diff --git a/Makefile.in b/Makefile.in
index e74b4cb29e5..503a4a6d9f4 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -13,6 +13,7 @@ endif
 
 CFG_INFO := $(info cfg: shell host triple $(CFG_HOST_TRIPLE))
 CFG_INFO := $(info cfg: llvm host triple $(CFG_LLVM_TRIPLE))
+CFG_INFO := $(info cfg: llvm target triples $(CFG_LLVM_TRIPLES))
 
 ifdef CFG_DISABLE_OPTIMIZE
   $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
diff --git a/configure b/configure
index c4516c85a31..881874abd70 100755
--- a/configure
+++ b/configure
@@ -10,6 +10,10 @@ step_msg() {
     msg
 }
 
+warn() {
+    echo "configure: WARNING: $1"
+}
+
 err() {
     echo "configure: error: $1"
     exit 1
@@ -228,7 +232,6 @@ putvar CFG_SRC_DIR
 putvar CFG_BUILD_DIR
 putvar CFG_OSTYPE
 putvar CFG_CPUTYPE
-putvar CFG_HOST_TRIPLE
 putvar CFG_CONFIGURE_ARGS
 
 step_msg "looking for build programs"
@@ -335,6 +338,26 @@ then
 else
     CFG_C_COMPILER="gcc"
 fi
+
+if [ ! -z "$CFG_LLVM_TRIPLE" ]
+then
+    if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ]
+    then
+        warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from"
+        warn "detected host triple $CFG_HOST_TRIPLE"
+        warn "choosing LLVM host-triple instead"
+        msg ""
+        CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE
+    fi
+fi
+
+# FIXME: add support for extending the target-triples list
+CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
+
+putvar CFG_HOST_TRIPLE
+putvar CFG_TARGET_TRIPLES
+
+
 putvar CFG_C_COMPILER
 
 putvar CFG_LLVM_ROOT
@@ -356,14 +379,31 @@ for i in \
     doc \
     rt rt/isaac rt/bigint rt/sync rt/test rt/arch/i386 \
     rt/libuv rt/libuv/src/ares rt/libuv/src/eio rt/libuv/src/ev \
-    rustllvm \
-    dl stage{0,1,2,3}{,/lib,/lib/$CFG_LLVM_TRIPLE} \
+    rustllvm dl \
     test/run-pass test/run-fail test/compile-fail \
     test/bench test/perf test/pretty
 do
     make_dir $i
 done
 
+for t in $CFG_TARGET_TRIPLES
+do
+    for i in 0 1 2 3
+    do
+        # old-style "bin" dir
+        make_dir stage$i
+
+        # new-style bin dir, not yet used
+        make_dir stage$i/bin
+
+        # old-style non-arch libs
+        make_dir stage$i/lib
+
+        # new-style arch-prefixed libs, not yet used
+        make_dir stage$i/lib/rustc/$t
+    done
+done
+
 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
 
 copy ${CFG_SRC_DIR}src/rt/libuv/Makefile rt/libuv/Makefile
diff --git a/mk/stage0.mk b/mk/stage0.mk
index c35fbfa3352..9098c39d17c 100644
--- a/mk/stage0.mk
+++ b/mk/stage0.mk
@@ -17,16 +17,9 @@ stage0/$(CFG_STDLIB): stage0/rustc$(X)
 stage0/$(CFG_RUSTLLVM): stage0/rustc$(X)
 	$(Q)touch $@
 
-# Target libs will be made in the process of making rustc above.
-
-stage0/lib/glue.o: stage0/rustc$(X)
-	$(Q)touch $@
-
-stage0/lib/main.o: stage0/rustc$(X)
-	$(Q)touch $@
-
 # Instantiate template (in stageN.mk) for building
-# stage0/lib/$(CFG_STDLIB) and stage0/lib/libstd.rlib.
+# target libraries.
+
 SREQpre = stage0/lib/main.o $(MKFILES)
-$(eval $(call LIBGEN,pre,0))
+$(eval $(call TARGET_LIBS,pre,0,$(CFG_HOST_TRIPLE)))
 
diff --git a/mk/stageN.mk b/mk/stageN.mk
index 868ac84e1fe..cd83192129c 100644
--- a/mk/stageN.mk
+++ b/mk/stageN.mk
@@ -1,38 +1,15 @@
-# StageN template: arg 1 is the N we're building *from*, arg 2 is N+1.
+# STAGE_N template: arg 1 is the N we're building *from*, arg 2 is N+1, arg 3
+# is the target triple we're building for. You have to invoke this for each
+# target triple.
 #
 # The easiest way to read this template is to assume we're building stage2
 # using stage1, and mentally gloss $(1) as 1, $(2) as 2.
 #
-# LIBGEN is pulled out seperately because we need to specially invoke
+# TARGET_LIBS is pulled out seperately because we need to specially invoke
 # it to build stage0/lib/libstd using stage0/rustc and to use the
 # new rustrt in stage0/lib/.
 
-define LIBGEN
-stage$(2)/lib/$$(CFG_STDLIB): $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
-                              stage$(2)/rustc$$(X)               \
-                              stage$(2)/$$(CFG_RUNTIME)          \
-                              stage$(2)/$$(CFG_RUSTLLVM)         \
-                              stage$(2)/lib/glue.o               \
-                              $$(SREQ$(1))
-	@$$(call E, compile_and_link: $$@)
-	$$(STAGE$(2))  --lib -o $$@ $$<
-
-stage$(2)/lib/libstd.rlib: $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
-                           stage$(2)/rustc$$(X)               \
-                           stage$(2)/$$(CFG_RUNTIME)          \
-                           stage$(2)/$$(CFG_RUSTLLVM)         \
-                           stage$(2)/lib/glue.o               \
-                           $$(SREQ$(1))
-	@$$(call E, compile_and_link: $$@)
-	$$(STAGE$(2)) --lib --static -o $$@ $$<
-
-stage$(2)/lib/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
-	@$$(call E, cp: $$@)
-	$$(Q)cp $$< $$@
-
-endef
-
-define STAGEN
+define STAGE_N
 
 # Host libraries and executables (stage$(2)/rustc and its runtime needs)
 #
@@ -74,9 +51,14 @@ stage$(2)/$$(CFG_RUSTLLVM): rustllvm/$$(CFG_RUSTLLVM)
 	@$$(call E, cp: $$@)
 	$$(Q)cp $$< $$@
 
+# Expand out target libraries
 
-# Target libraries (for binaries generated by stage$(2)/rustc)
+$(eval $(call TARGET_LIBS,$(1),$(2),$(3)))
 
+endef
+
+
+define TARGET_LIBS
 stage$(2)/lib/intrinsics.bc: $$(INTRINSICS_BC)
 	@$$(call E, cp: $$@)
 	$$(Q)cp $$< $$@
@@ -89,8 +71,6 @@ stage$(2)/lib/glue.o: stage$(2)/rustc$$(X)        \
 	@$$(call E, generate: $$@)
 	$$(STAGE$(2)) -c -o $$@ --glue
 
-$(eval $(call LIBGEN,$(1),$(2)))
-
 stage$(2)/lib/main.o: rt/main.o
 	@$$(call E, cp: $$@)
 	$$(Q)cp $$< $$@
@@ -100,10 +80,86 @@ stage$(2)/lib/$$(CFG_LIBRUSTC): $$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
 	@$$(call E, compile_and_link: $$@)
 	$$(STAGE$(2)) --lib -o $$@ $$<
 
+stage$(2)/lib/$$(CFG_STDLIB): $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
+                              stage$(2)/rustc$$(X)               \
+                              stage$(2)/$$(CFG_RUNTIME)          \
+                              stage$(2)/$$(CFG_RUSTLLVM)         \
+                              stage$(2)/lib/glue.o               \
+                              $$(SREQ$(1))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(2))  --lib -o $$@ $$<
+
+stage$(2)/lib/libstd.rlib: $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
+                           stage$(2)/rustc$$(X)               \
+                           stage$(2)/$$(CFG_RUNTIME)          \
+                           stage$(2)/$$(CFG_RUSTLLVM)         \
+                           stage$(2)/lib/glue.o               \
+                           $$(SREQ$(1))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(2)) --lib --static -o $$@ $$<
+
+stage$(2)/lib/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
+	@$$(call E, cp: $$@)
+	$$(Q)cp $$< $$@
+
+
+# New per-target-arch target libraries; when we've transitioned to
+# using these exclusively, you should delete the non-arch-prefixed
+# rules above. They're duplicates, redundant.
+
+stage$(2)/lib/rustc/$(3)/intrinsics.bc: $$(INTRINSICS_BC)
+	@$$(call E, cp: $$@)
+	$$(Q)cp $$< $$@
+
+stage$(2)/lib/rustc/$(3)/glue.o: \
+         stage$(2)/rustc$$(X)        \
+         stage$(2)/$$(CFG_RUNTIME)   \
+         stage$(2)/$$(CFG_RUSTLLVM)  \
+         stage$(2)/lib/intrinsics.bc \
+         $$(SREQ$(1))
+	@$$(call E, generate: $$@)
+	$$(STAGE$(2)) -c -o $$@ --glue
+
+stage$(2)/lib/rustc/$(3)/main.o: rt/main.o
+	@$$(call E, cp: $$@)
+	$$(Q)cp $$< $$@
+
+stage$(2)/lib/rustc/$(3)/$$(CFG_LIBRUSTC): \
+          $$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
+          $$(SREQ$(2))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(2)) --lib -o $$@ $$<
+
+stage$(2)/lib/rustc/$(3)/$$(CFG_STDLIB): \
+        $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
+        stage$(2)/rustc$$(X)               \
+        stage$(2)/$$(CFG_RUNTIME)          \
+        stage$(2)/$$(CFG_RUSTLLVM)         \
+        stage$(2)/lib/rustc/$(3)/glue.o     \
+        $$(SREQ$(1))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(2))  --lib -o $$@ $$<
+
+stage$(2)/lib/rustc/$(3)/libstd.rlib: \
+        $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
+        stage$(2)/rustc$$(X)               \
+        stage$(2)/$$(CFG_RUNTIME)          \
+        stage$(2)/$$(CFG_RUSTLLVM)         \
+        stage$(2)/lib/rustc/$(3)/glue.o     \
+        $$(SREQ$(1))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(2)) --lib --static -o $$@ $$<
+
+stage$(2)/lib/rustc/$(3)/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
+	@$$(call E, cp: $$@)
+	$$(Q)cp $$< $$@
+
 endef
 
-# Instantiate template for 0->1, 1->2, 2->3 build dirs
 
-$(eval $(call STAGEN,0,1))
-$(eval $(call STAGEN,1,2))
-$(eval $(call STAGEN,2,3))
+
+# Instantiate template for 0->1, 1->2, 2->3 build dirs
+$(foreach target,$(CFG_TARGET_TRIPLES), \
+ $(eval $(call STAGE_N,0,1,$(target)))   \
+ $(eval $(call STAGE_N,1,2,$(target)))   \
+ $(eval $(call STAGE_N,2,3,$(target))))
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 9ed221953f0..b1f7fa84f42 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -372,7 +372,7 @@ fn build_session_options(binary: str, match: getopts::match, binary_dir: str)
         };
 
     let library_search_paths = [binary_dir + "/lib", // FIXME: legacy
-                                binary_dir + "/lib/" + target ];
+                                binary_dir + "/lib/rustc/" + target ];
     let lsp_vec = getopts::opt_strs(match, "L");
     for lsp: str in lsp_vec { library_search_paths += [lsp]; }