-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.jai
More file actions
143 lines (120 loc) · 4.9 KB
/
build.jai
File metadata and controls
143 lines (120 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#import "Basic";
#import "Compiler";
#import "File";
#import "String";
#import "File_Utilities";
Compiler :: #import "Compiler";
#import "Windows_Resources";
#import "Metaprogram_Plugins";
#if OS == .WINDOWS {
Windows_Resources :: #import "Windows_Resources";
Ico_File :: #import "Ico_File";
}
BuildType :: enum u8
{
DEBUG;
OPTIMIZED_DEBUG;
SHIPPING;
}
BUILD_DEBUG_DIR :: "build/debug";
BUILD_OPTIMIZED_DEBUG_DIR :: "build/optimized";
BUILD_SHIPPING_DIR :: "build/shipping";
Build :: ()
{
w := compiler_create_workspace();
// @todo, create build output when it does not exist
target_options := get_build_options(w);
args := target_options.compile_time_command_line;
set_working_directory(#filepath);
target_options.output_executable_name = "Photon";
set_build_options(target_options, w);
set_build_options_dc(.{do_output=false});
buildType: BuildType = .DEBUG;
for arg: args
{
if arg ==
{
case "-optimized_debug";
buildType = .OPTIMIZED_DEBUG;
case "shipping"; // use like jai build.jai - shipping
buildType = .SHIPPING;
}
}
intercept_flags: Intercept_Flags;
res, pluginsToCreate, remaining := parse_plugin_arguments(args);
plugins : [..]*Metaprogram_Plugin;
init_plugins(pluginsToCreate, *plugins , w);
for plugins if it.before_intercept it.before_intercept(it, *intercept_flags);
Compiler.compiler_begin_intercept(w, intercept_flags);
if buildType == {
case .DEBUG;
make_directory_if_it_does_not_exist(BUILD_DEBUG_DIR, recursive=true);
target_options := get_build_options(w);
target_options.backend =.X64;
target_options.output_path = BUILD_DEBUG_DIR;
set_optimization(*target_options, Optimization_Type.DEBUG, true);
set_build_options(target_options, w);
add_build_string("BUILD_TYPE :: BuildType.DEBUG;", w);
case .OPTIMIZED_DEBUG;
make_directory_if_it_does_not_exist(BUILD_OPTIMIZED_DEBUG_DIR, recursive=true);
target_options := get_build_options(w);
target_options.backend = .LLVM;
target_options.output_path = BUILD_OPTIMIZED_DEBUG_DIR;
set_optimization(*target_options, Optimization_Type.VERY_OPTIMIZED);
set_build_options(target_options, w);
add_build_string("BUILD_TYPE :: BuildType.OPTIMIZED_DEBUG;", w);
case .SHIPPING;
make_directory_if_it_does_not_exist(BUILD_SHIPPING_DIR, recursive=true);
target_options := get_build_options(w);
target_options.backend = .LLVM;
target_options.output_path = BUILD_SHIPPING_DIR;
// target_options.emit_debug_info=.NONE; // @todo: we output debug info in shipping builds for crash reports, any way around that?
target_options.enable_bytecode_inliner = true;
set_optimization(*target_options, Optimization_Type.VERY_OPTIMIZED);
set_build_options(target_options, w);
add_build_string("BUILD_TYPE :: BuildType.SHIPPING;", w);
}
add_build_string("BuildType :: enum u8 { DEBUG; OPTIMIZED_DEBUG; SHIPPING; }", w);
for plugins if it.add_source it.add_source(it);
add_build_file("source/main.jai", w);
// wait for compilation to finish so we can edit the exe
while true {
message := Compiler.compiler_wait_for_message();
for plugins if it.message it.message(it, message);
if message.kind == .COMPLETE break;
}
Compiler.compiler_end_intercept(w);
for plugins if it.finish it.finish (it);
for plugins if it.shutdown it.shutdown(it);
// Edit the exe and do any other bits we need
build_opts := get_build_options(w);
exe_name := sprint("%/%.exe", build_opts.output_path, target_options.output_executable_name);
defer free(exe_name);
ico_data := Ico_File.create_ico_file_from_bitmap_filename("photon.png");
defer free(ico_data);
Windows_Resources.set_icon_by_data(exe_name, ico_data);
manifest_options: Windows_Resources.Manifest_Options;
success := Windows_Resources.add_manifest_to_executable(exe_name, manifest_options);
if !success {
log_error("ERROR: Couldn't add manifest to executable '%'\n", exe_name);
}
// copy stuff to output
copy_file("modules/treesitter/windows/treesitter.dll", tprint("%/treesitter.dll", build_opts.output_path));
copy_file("modules/treesitter/windows/treesitter.pdb", tprint("%/treesitter.pdb", build_opts.output_path));
if buildType == .SHIPPING {
copy_directory("fonts", tprint("%/fonts", BUILD_SHIPPING_DIR));
visitor :: (info: *File_Visit_Info, args: *void) {
if info.is_directory {
info.descend_into_directory = false;
return;
}
if path_extension(info.full_name) == "dll" {
copy_file(info.full_name, tprint("%/grammars/%", BUILD_SHIPPING_DIR, info.short_name));
}
}
make_directory_if_it_does_not_exist(tprint("%/grammars", BUILD_SHIPPING_DIR));
visit_files("grammars", true, null, visitor, visit_directories = true);
copy_directory("queries", tprint("%/queries", BUILD_SHIPPING_DIR));
}
}
#run,stallable Build();