summary refs log tree commit diff
path: root/src/comp/driver
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-03-01 15:57:55 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-03-01 15:57:55 -0800
commit348c77c31b7dcd5be85438dfcf4292f7e0951dd6 (patch)
treeaae201cf042a02a7c3dba3fa9dfc508ac881c6c0 /src/comp/driver
parent0761c5f4626153eba8478c66f93ba27e021f4dc2 (diff)
downloadrust-348c77c31b7dcd5be85438dfcf4292f7e0951dd6.tar.gz
rust-348c77c31b7dcd5be85438dfcf4292f7e0951dd6.zip
Populate default compilation environment as in rustboot.
Diffstat (limited to 'src/comp/driver')
-rw-r--r--src/comp/driver/rustc.rs38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 278b687326f..69e61aa0494 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -2,6 +2,7 @@
 
 import front.parser;
 import front.token;
+import front.eval;
 import middle.trans;
 import middle.resolve;
 import middle.typeck;
@@ -13,6 +14,30 @@ import std.option.none;
 import std._str;
 import std._vec;
 
+fn default_environment(session.session sess,
+                       str argv0,
+                       str input) -> eval.env {
+
+    auto libc = "libc.so";
+    alt (sess.get_targ_cfg().os) {
+        case (session.os_win32) { libc = "msvcrt.dll"; }
+        case (session.os_macos) { libc = "libc.dylib"; }
+        case (session.os_linux) { libc = "libc.so.6"; }
+    }
+
+    ret
+        vec(
+            // Target bindings.
+            tup("target_os", eval.val_str(std.os.target_os())),
+            tup("target_arch", eval.val_str("x86")),
+            tup("target_libc", eval.val_str(libc)),
+
+            // Build bindings.
+            tup("build_compiler", eval.val_str(argv0)),
+            tup("build_input", eval.val_str(input))
+            );
+}
+
 impure fn parse_input(session.session sess,
                       parser.parser p,
                       str input) -> @front.ast.crate {
@@ -25,9 +50,11 @@ impure fn parse_input(session.session sess,
     fail;
 }
 
-impure fn compile_input(session.session sess, str input, str output,
+impure fn compile_input(session.session sess,
+                        eval.env env,
+                        str input, str output,
                         bool shared) {
-    auto p = parser.new_parser(sess, 0, input);
+    auto p = parser.new_parser(sess, env, 0, input);
     auto crate = parse_input(sess, p, input);
     crate = resolve.resolve_crate(sess, crate);
     crate = typeck.check_crate(sess, crate);
@@ -131,16 +158,19 @@ impure fn main(vec[str] args) {
             sess.err("no input filename");
         }
         case (some[str](?ifile)) {
+
+            auto env = default_environment(sess, args.(0), ifile);
+
             alt (output_file) {
                 case (none[str]) {
                     let vec[str] parts = _str.split(ifile, '.' as u8);
                     parts = _vec.pop[str](parts);
                     parts += ".bc";
                     auto ofile = _str.concat(parts);
-                    compile_input(sess, ifile, ofile, shared);
+                    compile_input(sess, env, ifile, ofile, shared);
                 }
                 case (some[str](?ofile)) {
-                    compile_input(sess, ifile, ofile, shared);
+                    compile_input(sess, env, ifile, ofile, shared);
                 }
             }
         }