Skip to content

Commit 348c77c

Browse files
committed
Populate default compilation environment as in rustboot.
1 parent 0761c5f commit 348c77c

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

src/comp/driver/rustc.rs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import front.parser;
44
import front.token;
5+
import front.eval;
56
import middle.trans;
67
import middle.resolve;
78
import middle.typeck;
@@ -13,6 +14,30 @@ import std.option.none;
1314
import std._str;
1415
import std._vec;
1516

17+
fn default_environment(session.session sess,
18+
str argv0,
19+
str input) -> eval.env {
20+
21+
auto libc = "libc.so";
22+
alt (sess.get_targ_cfg().os) {
23+
case (session.os_win32) { libc = "msvcrt.dll"; }
24+
case (session.os_macos) { libc = "libc.dylib"; }
25+
case (session.os_linux) { libc = "libc.so.6"; }
26+
}
27+
28+
ret
29+
vec(
30+
// Target bindings.
31+
tup("target_os", eval.val_str(std.os.target_os())),
32+
tup("target_arch", eval.val_str("x86")),
33+
tup("target_libc", eval.val_str(libc)),
34+
35+
// Build bindings.
36+
tup("build_compiler", eval.val_str(argv0)),
37+
tup("build_input", eval.val_str(input))
38+
);
39+
}
40+
1641
impure fn parse_input(session.session sess,
1742
parser.parser p,
1843
str input) -> @front.ast.crate {
@@ -25,9 +50,11 @@ impure fn parse_input(session.session sess,
2550
fail;
2651
}
2752

28-
impure fn compile_input(session.session sess, str input, str output,
53+
impure fn compile_input(session.session sess,
54+
eval.env env,
55+
str input, str output,
2956
bool shared) {
30-
auto p = parser.new_parser(sess, 0, input);
57+
auto p = parser.new_parser(sess, env, 0, input);
3158
auto crate = parse_input(sess, p, input);
3259
crate = resolve.resolve_crate(sess, crate);
3360
crate = typeck.check_crate(sess, crate);
@@ -131,16 +158,19 @@ impure fn main(vec[str] args) {
131158
sess.err("no input filename");
132159
}
133160
case (some[str](?ifile)) {
161+
162+
auto env = default_environment(sess, args.(0), ifile);
163+
134164
alt (output_file) {
135165
case (none[str]) {
136166
let vec[str] parts = _str.split(ifile, '.' as u8);
137167
parts = _vec.pop[str](parts);
138168
parts += ".bc";
139169
auto ofile = _str.concat(parts);
140-
compile_input(sess, ifile, ofile, shared);
170+
compile_input(sess, env, ifile, ofile, shared);
141171
}
142172
case (some[str](?ofile)) {
143-
compile_input(sess, ifile, ofile, shared);
173+
compile_input(sess, env, ifile, ofile, shared);
144174
}
145175
}
146176
}

src/comp/front/eval.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ impure fn eval_crate_directive(parser p,
393393

394394
auto full_path = prefix + std.os.path_sep() + file_path;
395395

396-
auto p0 = new_parser(p.get_session(), 0, full_path);
396+
auto p0 = new_parser(p.get_session(), e, 0, full_path);
397397
auto m0 = parse_mod_items(p0, token.EOF);
398398
auto im = ast.item_mod(id, m0, p.next_def_id());
399399
auto i = @spanned(cdir.span, cdir.span, im);

src/comp/front/parser.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,18 @@ state type parser =
3131
impure fn restrict(restriction r);
3232
fn get_restriction() -> restriction;
3333
fn get_file_type() -> file_type;
34+
fn get_env() -> eval.env;
3435
fn get_session() -> session.session;
3536
fn get_span() -> common.span;
3637
fn next_def_id() -> ast.def_id;
3738
};
3839

3940
impure fn new_parser(session.session sess,
41+
eval.env env,
4042
ast.crate_num crate,
4143
str path) -> parser {
4244
state obj stdio_parser(session.session sess,
45+
eval.env env,
4346
file_type ftype,
4447
mutable token.token tok,
4548
mutable common.pos lo,
@@ -93,6 +96,10 @@ impure fn new_parser(session.session sess,
9396
ret ftype;
9497
}
9598

99+
fn get_env() -> eval.env {
100+
ret env;
101+
}
102+
96103
}
97104
auto ftype = SOURCE_FILE;
98105
if (_str.ends_with(path, ".rc")) {
@@ -101,7 +108,7 @@ impure fn new_parser(session.session sess,
101108
auto srdr = io.new_stdio_reader(path);
102109
auto rdr = lexer.new_reader(srdr, path);
103110
auto npos = rdr.get_curr_pos();
104-
ret stdio_parser(sess, ftype, lexer.next_token(rdr),
111+
ret stdio_parser(sess, env, ftype, lexer.next_token(rdr),
105112
npos, npos, 0, UNRESTRICTED, crate, rdr);
106113
}
107114

@@ -2279,7 +2286,7 @@ impure fn parse_crate_from_crate_file(parser p) -> @ast.crate {
22792286
auto hi = lo;
22802287
auto prefix = std.path.dirname(lo.filename);
22812288
auto cdirs = parse_crate_directives(p, token.EOF);
2282-
auto m = eval.eval_crate_directives_to_mod(p, eval.mk_env(),
2289+
auto m = eval.eval_crate_directives_to_mod(p, p.get_env(),
22832290
cdirs, prefix);
22842291
hi = p.get_span();
22852292
expect(p, token.EOF);

0 commit comments

Comments
 (0)