96 lines
2.0 KiB
Plaintext
96 lines
2.0 KiB
Plaintext
#import "Basic";
|
|
#import "File";
|
|
#import "Compiler";
|
|
#import "Metaprogram_Plugins";
|
|
|
|
plugins: [..] *Metaprogram_Plugin;
|
|
|
|
build :: () {
|
|
w := compiler_create_workspace("Ink Build");
|
|
if !w {
|
|
print("Workspace creation failed.\n");
|
|
return;
|
|
}
|
|
|
|
EXECUTABLE_NAME :: "ink";
|
|
MAIN_FILE :: "ink.jai";
|
|
|
|
options := get_build_options(w);
|
|
|
|
args := options.compile_time_command_line;
|
|
|
|
profile : bool = false;
|
|
|
|
for arg : args {
|
|
if arg == {
|
|
case "check"; {
|
|
options.output_type = .NO_OUTPUT;
|
|
}
|
|
case "profile"; {
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
intercept_flags: Intercept_Flags;
|
|
plugins_to_create: [..] Plugin_To_Create;
|
|
|
|
if profile {
|
|
tracy : Plugin_To_Create;
|
|
tracy.name = "tracy";
|
|
array_add(*plugins_to_create, tracy);
|
|
}
|
|
|
|
success := init_plugins(plugins_to_create, *plugins, w);
|
|
if !success {
|
|
log_error("A plugin init() failed. Exiting.\n");
|
|
exit(0);
|
|
}
|
|
|
|
new_path: [..] string;
|
|
array_add(*new_path, ..options.import_path);
|
|
array_add(*new_path, "modules");
|
|
options.import_path = new_path;
|
|
options.output_executable_name = EXECUTABLE_NAME;
|
|
|
|
wd := get_working_directory();
|
|
|
|
set_build_options(options, w);
|
|
|
|
for plugins {
|
|
if it.before_intercept it.before_intercept(it, *intercept_flags);
|
|
}
|
|
|
|
compiler_begin_intercept(w, intercept_flags);
|
|
|
|
for plugins if it.add_source it.add_source(it);
|
|
|
|
add_build_file(MAIN_FILE, w);
|
|
|
|
// Call message_loop(), which is a routine of ours below that will receive the messages.
|
|
message_loop(w);
|
|
|
|
compiler_end_intercept(w);
|
|
|
|
for plugins if it.finish it.finish (it);
|
|
for plugins if it.shutdown it.shutdown(it);
|
|
|
|
print("\nDone!\n\n");
|
|
|
|
set_build_options_dc(.{do_output=false, write_added_strings=false});
|
|
}
|
|
|
|
message_loop :: (w: Workspace) {
|
|
while true {
|
|
// We ask the compiler for the next message. If one is not available,
|
|
// we will wait until it becomes available.
|
|
message := compiler_wait_for_message();
|
|
// Pass the message to all plugins.
|
|
for plugins if it.message it.message(it, message);
|
|
|
|
if message.kind == .COMPLETE break;
|
|
}
|
|
}
|
|
|
|
#run, stallable build();
|