11open Grain ;
2+ open Grain_typed ;
23open Compile ;
34open Printf ;
45open Lexing ;
@@ -26,24 +27,8 @@ let () =
2627 }
2728 );
2829
29- let compile_file = (name, outfile_arg) => {
30- if (! Printexc . backtrace_status() && Grain_utils . Config . verbose^ ) {
31- Printexc . record_backtrace(true );
32- };
33- try ({
34- let outfile =
35- Option . value(
36- ~default= Compile . default_wasm_filename(name),
37- outfile_arg,
38- );
39- let hook =
40- if (Grain_utils . Config . statically_link^ ) {
41- Compile . stop_after_assembled;
42- } else {
43- Compile . stop_after_object_emitted;
44- };
45- ignore (Compile . compile_file(~is_root_file= true , ~hook, ~outfile, name));
46- }) {
30+ let error_wrapped = f =>
31+ try (f() ) {
4732 | exn =>
4833 let bt =
4934 if (Printexc . backtrace_status() ) {
@@ -63,6 +48,59 @@ let compile_file = (name, outfile_arg) => {
6348 );
6449 exit(2 );
6550 };
51+
52+ let compile_file = (~outfile=?, filename) => {
53+ let outfile =
54+ Option . value(
55+ ~default= Compile . default_object_filename(filename),
56+ outfile,
57+ );
58+ ignore (Compile . compile_file(~outfile, filename));
59+ };
60+ let compile_file = (~outfile=?, filename) =>
61+ error_wrapped(() => compile_file(~outfile? , filename));
62+
63+ let grainc = (single_file_mode, name, outfile) => {
64+ Grain_utils . Config . set_root_config() ;
65+
66+ if (! Printexc . backtrace_status() && Grain_utils . Config . verbose^ ) {
67+ Printexc . record_backtrace(true );
68+ };
69+
70+ if (single_file_mode) {
71+ compile_file(~outfile? , name);
72+ } else {
73+ switch (Grain_utils . Config . wasi_polyfill^ ) {
74+ | Some (name ) =>
75+ Grain_utils . Config . preserve_config(() => {
76+ Grain_utils . Config . compilation_mode := Grain_utils . Config . Runtime ;
77+ Module_resolution . load_dependency_graph(name);
78+ let to_compile = Module_resolution . get_out_of_date_dependencies() ;
79+ List . iter(compile_file, to_compile);
80+ compile_file(name);
81+ })
82+ | None => ()
83+ };
84+
85+ Module_resolution . load_dependency_graph(name);
86+ let to_compile = Module_resolution . get_out_of_date_dependencies() ;
87+ List . iter(compile_file, to_compile);
88+ compile_file(name);
89+
90+ if (Grain_utils . Config . statically_link^ ) {
91+ let main_object =
92+ Option . value(
93+ ~default= Compile . default_object_filename(name),
94+ outfile,
95+ );
96+ let outfile =
97+ Option . value(~default= Compile . default_wasm_filename(name), outfile);
98+ let dependencies = Module_resolution . get_dependencies() ;
99+
100+ Link . link(~main_object, ~outfile, dependencies);
101+ };
102+ };
103+
66104 ` Ok () ;
67105};
68106
@@ -107,6 +145,11 @@ let output_filename = {
107145 );
108146};
109147
148+ let single_file_mode = {
149+ let doc = sprintf("Compile a single file without compiling dependencies" );
150+ Arg . (value & vflag(false , [ (true , info([ "single-file" ] , ~doc))] ));
151+ };
152+
110153let cmd = {
111154 let doc = sprintf("Compile Grain programs" );
112155 let version =
@@ -118,7 +161,8 @@ let cmd = {
118161 Cmd . info(Sys . argv[ 0 ] , ~version, ~doc),
119162 Term . (
120163 ret(
121- Grain_utils . Config . with_cli_options(compile_file)
164+ Grain_utils . Config . with_cli_options(grainc)
165+ $ single_file_mode
122166 $ input_filename
123167 $ output_filename,
124168 )
0 commit comments