comment
[vg.git] / vg_build.h
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <unistd.h>
4
5 #include "vg_log.h"
6
7 struct compiler_info
8 {
9 char name[64],
10 file[512],
11 link[512],
12 library[512],
13 include[512],
14 build_dir[512],
15 executable[512];
16
17 enum optimization_profile
18 {
19 k_optimization_profile_debug,
20 k_optimization_profile_release
21 }
22 optimization_profile;
23
24 enum target_file
25 {
26 k_target_file_game,
27 k_target_file_server
28 }
29 target_file;
30
31 enum compiler
32 {
33 k_compiler_clang,
34 k_compiler_gcc,
35 k_compiler_mingw
36 }
37 compiler;
38 }
39
40 static vg_compiler;
41
42 void vg_build_syscall(const char *fmt, ...)
43 {
44 va_list args;
45 va_start( args, fmt );
46
47 char call[4096];
48 vsnprintf( call, vg_list_size( call ), fmt, args );
49
50 va_end( args );
51
52 puts( call );
53
54 if( system(call) )
55 exit(0);
56 }
57
58 void vg_build_object( const char *file )
59 {
60 strcat( vg_compiler.file, file );
61 }
62
63 void vg_build_library_dir( const char *ldir )
64 {
65 strcat( vg_compiler.library, ldir );
66 }
67
68 void vg_build_link( const char *link )
69 {
70 strcat( vg_compiler.link, link );
71 }
72
73 void vg_build_include( const char *inc )
74 {
75 strcat( vg_compiler.include, inc );
76 }
77
78 const char *vg_compiler_str(void)
79 {
80 return (const char *[]){ "clang", "gcc", "i686-w64-mingw32-gcc" }
81 [vg_compiler.compiler];
82 }
83
84 void vg_build_start( const char *name, enum compiler compiler )
85 {
86 vg_compiler.file[0] = '\0';
87 vg_compiler.link[0] = '\0';
88 vg_compiler.include[0] = '\0';
89 vg_compiler.library[0] = '\0';
90 vg_compiler.compiler = compiler;
91
92 strcpy( vg_compiler.name, name );
93
94 snprintf( vg_compiler.build_dir, 512,
95 "bin/%s-%s",
96 name,
97 vg_compiler_str() );
98
99 vg_build_syscall( "mkdir -p %s", vg_compiler.build_dir );
100 vg_build_include( "-I. -I./vg " );
101 vg_build_library_dir( "-L. " );
102 }
103
104 void vg_build_add_link_for_graphics(void)
105 {
106 if( (vg_compiler.compiler == k_compiler_gcc) ||
107 (vg_compiler.compiler == k_compiler_clang ) )
108 {
109 vg_build_link( "-lSDL2 -lGL -lX11 -lXxf86vm -lXrandr -lXi -ldl " );
110 }
111 else
112 {
113 vg_build_link( "-lmingw32 -lSDL2main -lSDL2 -lopengl32 -mwindows \\\n" );
114 vg_build_link( " -Wl,--dynamicbase -Wl,--nxcompat \\\n" );
115
116 /* + 26.05.23: Suddenly something is pulling in winpthread.
117 * cant work out whats doing it or why. */
118 vg_build_link( " -Wl,-Bstatic,--whole-archive \\\n" );
119 vg_build_link( " -lwinpthread \\\n" );
120 vg_build_link( " -Wl,--no-whole-archive " );
121 }
122
123 vg_build_object( "vg/dep/glad/glad.c " );
124
125 vg_build_link( "-lm " );
126 if( vg_compiler.compiler == k_compiler_mingw ){
127 //vg_build_link( "-mthreads " );
128 //vg_build_link( "-static-libgcc " );
129 }
130 else{
131 vg_build_link( "-pthread " );
132 }
133 }
134
135 void vg_build_add_link_for_game(void)
136 {
137 if( (vg_compiler.compiler == k_compiler_gcc) ||
138 (vg_compiler.compiler == k_compiler_clang ) )
139 {
140 vg_build_link( "-lsteam_api " );
141 }
142 else
143 {
144 vg_build_library_dir( "-L./vg/dep/sdl " );
145 vg_build_link( "vg/dep/steam/steam_api.dll " );
146 }
147
148 vg_build_include( "-I./vg/dep " );
149 vg_build_library_dir( "-L./vg/dep/steam " );
150 }
151
152 void vg_build_bin_dependency_file( const char *src )
153 {
154 vg_build_syscall( "cp %s %s", src, vg_compiler.build_dir );
155 }
156
157 void vg_build_symbolic_link( const char *folder, const char *bin_name )
158 {
159 char dest[512];
160 snprintf( dest, 512, "%s/%s", vg_compiler.build_dir, bin_name );
161
162 if( !access( dest, F_OK ) )
163 vg_build_syscall( "unlink %s", dest );
164
165 vg_build_syscall( "ln -srf %s %s", folder, dest );
166 }
167
168 void vg_build_copy_graphics_dependencies(void)
169 {
170 if( vg_compiler.compiler == k_compiler_mingw )
171 {
172 vg_build_bin_dependency_file( "vg/dep/sdl/SDL2.dll" );
173 }
174 }
175
176 void vg_build_copy_game_dependencies(void)
177 {
178 vg_build_bin_dependency_file(
179 "vg/submodules/SDL_GameControllerDB/gamecontrollerdb.txt" );
180
181 if( (vg_compiler.compiler == k_compiler_gcc) ||
182 (vg_compiler.compiler == k_compiler_clang) )
183 {
184 vg_build_bin_dependency_file( "vg/dep/steam/libsteam_api.so" );
185 }
186 else
187 {
188 vg_build_bin_dependency_file( "vg/dep/steam/steam_api.dll" );
189 }
190 }
191
192 void vg_build_mode_release(void)
193 {
194 vg_compiler.optimization_profile = k_optimization_profile_release;
195 }
196
197 void vg_build_mode_debug(void)
198 {
199 vg_compiler.optimization_profile = k_optimization_profile_debug;
200 }
201
202 void vg_build(void)
203 {
204 char cmd[8192];
205 cmd[0] = '\0';
206
207 /* Compiler */
208 strcat( cmd, "ccache " );
209 strcat( cmd, vg_compiler_str() );
210 strcat( cmd, " -std=gnu99 -D_REENTRANT \\\n" );
211
212 /* Debugging information */
213 if( vg_compiler.optimization_profile == k_optimization_profile_debug )
214 {
215 strcat( cmd, " -O0 -ggdb3 -fno-omit-frame-pointer " );
216
217 if( (vg_compiler.compiler == k_compiler_gcc) ||
218 (vg_compiler.compiler == k_compiler_clang ) )
219 {
220 strcat( cmd, "-rdynamic -fsanitize=address " );
221 }
222
223 strcat( cmd, "\\\n" );
224 }
225 else
226 {
227 strcat( cmd, " -O3 -DVG_RELEASE\\\n" );
228 }
229
230 /* Warnings */
231 strcat( cmd,
232 " -Wall\\\n"
233 " -Wno-unused-function -Wno-unused-variable\\\n"
234 " -Wno-unused-command-line-argument -Wno-unused-but-set-variable\\\n"
235 );
236
237 if( vg_compiler.compiler == k_compiler_clang ){
238 strcat( cmd,
239 " -ferror-limit=5\\\n" );
240 }
241
242 /* Include */
243 strcat( cmd, " " );
244 strcat( cmd, vg_compiler.include );
245 strcat( cmd, "\\\n" );
246
247 /* Library */
248 strcat( cmd, " " );
249 strcat( cmd, vg_compiler.library );
250 strcat( cmd, "\\\n" );
251
252 /* Targets */
253 strcat( cmd, " " );
254 strcat( cmd, vg_compiler.file );
255 strcat( cmd, "\\\n" );
256
257 /* Output */
258 strcat( cmd, " -o " );
259 vg_compiler.executable[0] = '\0';
260 strcat( vg_compiler.executable, vg_compiler.build_dir );
261 strcat( vg_compiler.executable, "/" );
262 strcat( vg_compiler.executable, vg_compiler.name );
263
264 if( vg_compiler.compiler == k_compiler_mingw )
265 strcat( vg_compiler.executable, ".exe" );
266
267 strcat( cmd, vg_compiler.executable );
268 strcat( cmd, "\\\n" );
269
270 /* Link */
271 strcat( cmd, " " );
272 strcat( cmd, vg_compiler.link );
273 strcat( cmd, "\\\n" );
274
275 strcat( cmd, " -Wl,-rpath=./" );
276
277 vg_build_syscall( cmd );
278 }