#include "src/build_tool/library.cpp" enum { PROFILE_DEBUG, PROFILE_RELEASE, }; int Profile = PROFILE_DEBUG; void AddCommonFlags(Array *cmd) { cmd->add("/MP /Zi /FC /nologo"); cmd->add("/WX /W3 /wd4200 /diagnostics:column"); cmd->add("/Oi"); cmd->add("-D_CRT_SECURE_NO_WARNINGS"); if (Profile == PROFILE_DEBUG) { cmd->add("-DDEBUG_BUILD=1"); cmd->add("-DRELEASE_BUILD=0"); // cmd->add("-D_DEBUG /MDd"); } else { cmd->add("-DDEBUG_BUILD=0"); cmd->add("-DRELEASE_BUILD=1"); cmd->add("/O2 /MT /DNDEBUG /GL"); } } struct Library { Array sources; Array objects; Array include_paths; Array defines; }; Library PrepareSDL() { Library l = {}; l.include_paths.add("../src/external/SDL/include"); l.objects.add("../src/external/SDL/VisualC/x64/Release/SDL3.lib"); return l; } Library PrepareRaylib() { Library l = {}; l.include_paths.add("../src/external/raylib/include"); if (0) { l.objects.add("../src/external/raylib/lib/raylib.lib"); } else { l.objects.add("../src/external/raylib/lib/raylibdll.lib"); OS_CopyFile("../src/external/raylib/lib/raylib.dll", "./raylib.dll", false); } return l; } Library PrepareLua() { Library l = {}; l.include_paths.add("../src/external/lua/src"); MA_Scratch scratch; for (OS_FileIter it = OS_IterateFiles(scratch, "../src/external/lua/src"); OS_IsValid(it); OS_Advance(&it)) { if (it.filename == "luac.c") continue; if (it.filename == "lua.c") continue; if (S8_EndsWith(it.filename, ".c", true)) { l.sources.add(it.absolute_path); S8_String file = S8_ChopLastPeriod(it.filename); l.objects.add(Fmt("%.*s.obj", S8_Expand(file))); } } if (!OS_FileExists(l.objects[0])) { Array cmd = {}; cmd.add("cl.exe -c"); AddCommonFlags(&cmd); For(l.include_paths) cmd.add(S8_Format(Perm, "-I %.*s ", S8_Expand(it))); cmd += l.sources; Run(cmd); } return l; } Library PrepareGlad() { Library l = {}; l.sources.add("../src/external/glad/glad.c"); l.include_paths.add("../src/external/glad"); l.objects.add("glad.obj"); if (!OS_FileExists(l.objects[0])) { Array cmd = {}; cmd.add("cl.exe -c"); AddCommonFlags(&cmd); For(l.include_paths) cmd.add(S8_Format(Perm, "-I %.*s ", S8_Expand(it))); cmd += l.sources; Run(cmd); } return l; } int CompileTextEditor() { int result = 0; Array libs = {}; libs.add(PrepareRaylib()); libs.add(PrepareLua()); Array cmd = {}; cmd.add("cl.exe"); cmd.add("-Fe:te.exe"); cmd.add("-Fd:te.pdb"); AddCommonFlags(&cmd); For2(lib, libs) For(lib.defines) cmd.add(it); cmd.add("../src/text_editor/text_editor.cpp"); cmd.add("../src/basic/win32.cpp"); For2(lib, libs) For(lib.include_paths) cmd.add(Fmt("-I %.*s", S8_Expand(it))); cmd.add("/link"); cmd.add("/incremental:no"); // cmd.add("/SUBSYSTEM:WINDOWS"); cmd.add("opengl32.lib gdi32.lib winmm.lib shell32.lib user32.lib msvcrt.lib /NODEFAULTLIB:LIBCMT"); For(libs) For2(o, it.objects) cmd.add(o); OS_DeleteFile("te.pdb"); // For(cmd) IO_Printf("%.*s\n", S8_Expand(it)); result += Run(cmd); return result; } int main() { MA_InitScratch(); SRC_InitCache(Perm, "te.cache"); int result = CompileTextEditor(); if (result != 0) { OS_DeleteFile("te.cache"); return result; } SRC_SaveCache(); return 0; }