authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-24 10:08:20-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-24 10:08:20-04:00
log4f4da3c10c56eb1d60fdb2a98a46634d4dc608fe
treed7acdcf2f409d3d3c184408c7f792be481f98e7e
parent92751d5e2426f5f8151b910156d33709bf5df11b

wip self hosted code


5 files changed, 175 insertions(+), 14 deletions(-)

src-self-hosted/main.zig+175-3
...@@ -1,3 +1,4 @@...@@ -1,3 +1,4 @@
1const builtin = @import("builtin");
1const io = @import("std").io;2const io = @import("std").io;
2const os = @import("std").os;3const os = @import("std").os;
3const heap = @import("std").mem;4const heap = @import("std").mem;
...@@ -8,6 +9,8 @@ const heap = @import("std").mem;...@@ -8,6 +9,8 @@ const heap = @import("std").mem;
8error InvalidArgument;9error InvalidArgument;
9error MissingArg0;10error MissingArg0;
1011
12var arg0: []u8 = undefined;
13
11pub fn main() -> %void {14pub fn main() -> %void {
12 if (internal_main()) |_| {15 if (internal_main()) |_| {
13 return;16 return;
...@@ -33,15 +36,169 @@ pub fn internal_main() -> %void {...@@ -33,15 +36,169 @@ pub fn internal_main() -> %void {
3336
34 const allocator = &incrementing_allocator.allocator;37 const allocator = &incrementing_allocator.allocator;
35 38
36 const arg0 = %return (args_it.next(allocator) ?? error.MissingArg0);39 arg0 = %return (args_it.next(allocator) ?? error.MissingArg0);
37 defer allocator.free(arg0);40 defer allocator.free(arg0);
3841
39 %return printUsage(&io.stdout);42 var build_mode = builtin.Mode.Debug;
43 var strip = false;
44 var is_static = false;
45 var verbose = false;
46 var verbose_link = false;
47 var verbose_ir = false;
48 var mwindows = false;
49 var mconsole = false;
50
51 while (args_it.next()) |arg_or_err| {
52 const arg = %return arg_or_err;
53
54 if (arg[0] == '-') {
55 if (strcmp(arg, "--release-fast") == 0) {
56 build_mode = builtin.Mode.ReleaseFast;
57 } else if (strcmp(arg, "--release-safe") == 0) {
58 build_mode = builtin.Mode.ReleaseSafe;
59 } else if (strcmp(arg, "--strip") == 0) {
60 strip = true;
61 } else if (strcmp(arg, "--static") == 0) {
62 is_static = true;
63 } else if (strcmp(arg, "--verbose") == 0) {
64 verbose = true;
65 } else if (strcmp(arg, "--verbose-link") == 0) {
66 verbose_link = true;
67 } else if (strcmp(arg, "--verbose-ir") == 0) {
68 verbose_ir = true;
69 } else if (strcmp(arg, "-mwindows") == 0) {
70 mwindows = true;
71 } else if (strcmp(arg, "-mconsole") == 0) {
72 mconsole = true;
73 } else if (strcmp(arg, "-municode") == 0) {
74 municode = true;
75 } else if (strcmp(arg, "-rdynamic") == 0) {
76 rdynamic = true;
77 } else if (strcmp(arg, "--each-lib-rpath") == 0) {
78 each_lib_rpath = true;
79 } else if (strcmp(arg, "--enable-timing-info") == 0) {
80 timing_info = true;
81 } else if (strcmp(arg, "--test-cmd-bin") == 0) {
82 test_exec_args.append(nullptr);
83 } else if (arg[1] == 'L' && arg[2] != 0) {
84 // alias for --library-path
85 lib_dirs.append(&arg[2]);
86 } else if (strcmp(arg, "--pkg-begin") == 0) {
87 if (i + 2 >= argc) {
88 fprintf(stderr, "Expected 2 arguments after --pkg-begin\n");
89 return usage(arg0);
90 }
91 CliPkg *new_cur_pkg = allocate<CliPkg>(1);
92 i += 1;
93 new_cur_pkg->name = argv[i];
94 i += 1;
95 new_cur_pkg->path = argv[i];
96 new_cur_pkg->parent = cur_pkg;
97 cur_pkg->children.append(new_cur_pkg);
98 cur_pkg = new_cur_pkg;
99 } else if (strcmp(arg, "--pkg-end") == 0) {
100 if (cur_pkg->parent == nullptr) {
101 fprintf(stderr, "Encountered --pkg-end with no matching --pkg-begin\n");
102 return EXIT_FAILURE;
103 }
104 cur_pkg = cur_pkg->parent;
105 } else if (i + 1 >= argc) {
106 fprintf(stderr, "Expected another argument after %s\n", arg);
107 return usage(arg0);
108 } else {
109 i += 1;
110 if (strcmp(arg, "--output") == 0) {
111 out_file = argv[i];
112 } else if (strcmp(arg, "--output-h") == 0) {
113 out_file_h = argv[i];
114 } else if (strcmp(arg, "--color") == 0) {
115 if (strcmp(argv[i], "auto") == 0) {
116 color = ErrColorAuto;
117 } else if (strcmp(argv[i], "on") == 0) {
118 color = ErrColorOn;
119 } else if (strcmp(argv[i], "off") == 0) {
120 color = ErrColorOff;
121 } else {
122 fprintf(stderr, "--color options are 'auto', 'on', or 'off'\n");
123 return usage(arg0);
124 }
125 } else if (strcmp(arg, "--name") == 0) {
126 out_name = argv[i];
127 } else if (strcmp(arg, "--libc-lib-dir") == 0) {
128 libc_lib_dir = argv[i];
129 } else if (strcmp(arg, "--libc-static-lib-dir") == 0) {
130 libc_static_lib_dir = argv[i];
131 } else if (strcmp(arg, "--libc-include-dir") == 0) {
132 libc_include_dir = argv[i];
133 } else if (strcmp(arg, "--msvc-lib-dir") == 0) {
134 msvc_lib_dir = argv[i];
135 } else if (strcmp(arg, "--kernel32-lib-dir") == 0) {
136 kernel32_lib_dir = argv[i];
137 } else if (strcmp(arg, "--zig-install-prefix") == 0) {
138 zig_install_prefix = argv[i];
139 } else if (strcmp(arg, "--dynamic-linker") == 0) {
140 dynamic_linker = argv[i];
141 } else if (strcmp(arg, "-isystem") == 0) {
142 clang_argv.append("-isystem");
143 clang_argv.append(argv[i]);
144 } else if (strcmp(arg, "-dirafter") == 0) {
145 clang_argv.append("-dirafter");
146 clang_argv.append(argv[i]);
147 } else if (strcmp(arg, "-mllvm") == 0) {
148 clang_argv.append("-mllvm");
149 clang_argv.append(argv[i]);
150
151 llvm_argv.append(argv[i]);
152 } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) {
153 lib_dirs.append(argv[i]);
154 } else if (strcmp(arg, "--library") == 0) {
155 link_libs.append(argv[i]);
156 } else if (strcmp(arg, "--object") == 0) {
157 objects.append(argv[i]);
158 } else if (strcmp(arg, "--assembly") == 0) {
159 asm_files.append(argv[i]);
160 } else if (strcmp(arg, "--cache-dir") == 0) {
161 cache_dir = argv[i];
162 } else if (strcmp(arg, "--target-arch") == 0) {
163 target_arch = argv[i];
164 } else if (strcmp(arg, "--target-os") == 0) {
165 target_os = argv[i];
166 } else if (strcmp(arg, "--target-environ") == 0) {
167 target_environ = argv[i];
168 } else if (strcmp(arg, "-mmacosx-version-min") == 0) {
169 mmacosx_version_min = argv[i];
170 } else if (strcmp(arg, "-mios-version-min") == 0) {
171 mios_version_min = argv[i];
172 } else if (strcmp(arg, "-framework") == 0) {
173 frameworks.append(argv[i]);
174 } else if (strcmp(arg, "--linker-script") == 0) {
175 linker_script = argv[i];
176 } else if (strcmp(arg, "-rpath") == 0) {
177 rpath_list.append(argv[i]);
178 } else if (strcmp(arg, "--test-filter") == 0) {
179 test_filter = argv[i];
180 } else if (strcmp(arg, "--test-name-prefix") == 0) {
181 test_name_prefix = argv[i];
182 } else if (strcmp(arg, "--ver-major") == 0) {
183 ver_major = atoi(argv[i]);
184 } else if (strcmp(arg, "--ver-minor") == 0) {
185 ver_minor = atoi(argv[i]);
186 } else if (strcmp(arg, "--ver-patch") == 0) {
187 ver_patch = atoi(argv[i]);
188 } else if (strcmp(arg, "--test-cmd") == 0) {
189 test_exec_args.append(argv[i]);
190 } else {
191 fprintf(stderr, "Invalid argument: %s\n", arg);
192 return usage(arg0);
193 }
194 }
195 }
196 }
40}197}
41198
42fn printUsage(outstream: &io.OutStream) -> %void {199fn printUsage(outstream: &io.OutStream) -> %void {
200 %return outstream.print("Usage: {} [command] [options]\n", arg0);
43 %return outstream.write(201 %return outstream.write(
44 \\Usage: zig [command] [options]
45 \\Commands:202 \\Commands:
46 \\ build build project from build.zig203 \\ build build project from build.zig
47 \\ build-exe [source] create executable from source or object files204 \\ build-exe [source] create executable from source or object files
...@@ -110,3 +267,18 @@ fn printUsage(outstream: &io.OutStream) -> %void {...@@ -110,3 +267,18 @@ fn printUsage(outstream: &io.OutStream) -> %void {
110 );267 );
111 %return outstream.flush();268 %return outstream.flush();
112}269}
270
271const ZIG_ZEN =
272 \\ * Communicate intent precisely.
273 \\ * Edge cases matter.
274 \\ * Favor reading code over writing code.
275 \\ * Only one obvious way to do things.
276 \\ * Runtime crashes are better than bugs.
277 \\ * Compile errors are better than runtime crashes.
278 \\ * Incremental improvements.
279 \\ * Avoid local maximums.
280 \\ * Reduce the amount one must remember.
281 \\ * Minimize energy spent on coding style.
282 \\ * Together we serve end users.
283 \\
284;
src/all_types.hpp-1
...@@ -1488,7 +1488,6 @@ struct CodeGen {...@@ -1488,7 +1488,6 @@ struct CodeGen {
1488 Buf *root_out_name;1488 Buf *root_out_name;
1489 bool windows_subsystem_windows;1489 bool windows_subsystem_windows;
1490 bool windows_subsystem_console;1490 bool windows_subsystem_console;
1491 bool windows_linker_unicode;
1492 Buf *mmacosx_version_min;1491 Buf *mmacosx_version_min;
1493 Buf *mios_version_min;1492 Buf *mios_version_min;
1494 bool linker_rdynamic;1493 bool linker_rdynamic;
src/codegen.cpp-4
...@@ -265,10 +265,6 @@ void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole) {...@@ -265,10 +265,6 @@ void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole) {
265 g->windows_subsystem_console = mconsole;265 g->windows_subsystem_console = mconsole;
266}266}
267267
268void codegen_set_windows_unicode(CodeGen *g, bool municode) {
269 g->windows_linker_unicode = municode;
270}
271
272void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min) {268void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min) {
273 g->mmacosx_version_min = mmacosx_version_min;269 g->mmacosx_version_min = mmacosx_version_min;
274}270}
src/codegen.hpp-1
...@@ -35,7 +35,6 @@ void codegen_set_msvc_lib_dir(CodeGen *codegen, Buf *msvc_lib_dir);...@@ -35,7 +35,6 @@ void codegen_set_msvc_lib_dir(CodeGen *codegen, Buf *msvc_lib_dir);
35void codegen_set_kernel32_lib_dir(CodeGen *codegen, Buf *kernel32_lib_dir);35void codegen_set_kernel32_lib_dir(CodeGen *codegen, Buf *kernel32_lib_dir);
36void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker);36void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker);
37void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole);37void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole);
38void codegen_set_windows_unicode(CodeGen *g, bool municode);
39void codegen_add_lib_dir(CodeGen *codegen, const char *dir);38void codegen_add_lib_dir(CodeGen *codegen, const char *dir);
40LinkLib *codegen_add_link_lib(CodeGen *codegen, Buf *lib);39LinkLib *codegen_add_link_lib(CodeGen *codegen, Buf *lib);
41void codegen_add_framework(CodeGen *codegen, const char *name);40void codegen_add_framework(CodeGen *codegen, const char *name);
src/main.cpp-5
...@@ -70,7 +70,6 @@ static int usage(const char *arg0) {...@@ -70,7 +70,6 @@ static int usage(const char *arg0) {
70 " -rpath [path] add directory to the runtime library search path\n"70 " -rpath [path] add directory to the runtime library search path\n"
71 " -mconsole (windows) --subsystem console to the linker\n"71 " -mconsole (windows) --subsystem console to the linker\n"
72 " -mwindows (windows) --subsystem windows to the linker\n"72 " -mwindows (windows) --subsystem windows to the linker\n"
73 " -municode (windows) link with unicode\n"
74 " -framework [name] (darwin) link against framework\n"73 " -framework [name] (darwin) link against framework\n"
75 " -mios-version-min [ver] (darwin) set iOS deployment target\n"74 " -mios-version-min [ver] (darwin) set iOS deployment target\n"
76 " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n"75 " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n"
...@@ -296,7 +295,6 @@ int main(int argc, char **argv) {...@@ -296,7 +295,6 @@ int main(int argc, char **argv) {
296 const char *target_environ = nullptr;295 const char *target_environ = nullptr;
297 bool mwindows = false;296 bool mwindows = false;
298 bool mconsole = false;297 bool mconsole = false;
299 bool municode = false;
300 bool rdynamic = false;298 bool rdynamic = false;
301 const char *mmacosx_version_min = nullptr;299 const char *mmacosx_version_min = nullptr;
302 const char *mios_version_min = nullptr;300 const char *mios_version_min = nullptr;
...@@ -462,8 +460,6 @@ int main(int argc, char **argv) {...@@ -462,8 +460,6 @@ int main(int argc, char **argv) {
462 mwindows = true;460 mwindows = true;
463 } else if (strcmp(arg, "-mconsole") == 0) {461 } else if (strcmp(arg, "-mconsole") == 0) {
464 mconsole = true;462 mconsole = true;
465 } else if (strcmp(arg, "-municode") == 0) {
466 municode = true;
467 } else if (strcmp(arg, "-rdynamic") == 0) {463 } else if (strcmp(arg, "-rdynamic") == 0) {
468 rdynamic = true;464 rdynamic = true;
469 } else if (strcmp(arg, "--each-lib-rpath") == 0) {465 } else if (strcmp(arg, "--each-lib-rpath") == 0) {
...@@ -762,7 +758,6 @@ int main(int argc, char **argv) {...@@ -762,7 +758,6 @@ int main(int argc, char **argv) {
762 }758 }
763759
764 codegen_set_windows_subsystem(g, mwindows, mconsole);760 codegen_set_windows_subsystem(g, mwindows, mconsole);
765 codegen_set_windows_unicode(g, municode);
766 codegen_set_rdynamic(g, rdynamic);761 codegen_set_rdynamic(g, rdynamic);
767 if (mmacosx_version_min && mios_version_min) {762 if (mmacosx_version_min && mios_version_min) {
768 fprintf(stderr, "-mmacosx-version-min and -mios-version-min options not allowed together\n");763 fprintf(stderr, "-mmacosx-version-min and -mios-version-min options not allowed together\n");