replace nob with noblike
This commit is contained in:
341
build.c
341
build.c
@@ -3,8 +3,8 @@
|
||||
// macOS: cc build.c -o build
|
||||
// After that, just run: ./build (or build.exe on Windows)
|
||||
|
||||
#define NOB_IMPLEMENTATION
|
||||
#include "vendor/nob/nob.h"
|
||||
#define BUILD_IMPLEMENTATION
|
||||
#include "build.h"
|
||||
|
||||
////////////////////////////////
|
||||
// FreeType source files
|
||||
@@ -31,18 +31,18 @@ static const char *freetype_sources[] = {
|
||||
// Font embedding — reads a .ttf and writes a C header with the data as a byte array
|
||||
|
||||
static bool embed_font_file(const char *ttf_path, const char *header_path) {
|
||||
if (!nob_needs_rebuild1(header_path, ttf_path)) {
|
||||
nob_log(NOB_INFO, "Font header %s is up to date", header_path);
|
||||
if (!needs_rebuild1(header_path, ttf_path)) {
|
||||
build_log(LOG_INFO, "Font header %s is up to date", header_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
Nob_String_Builder sb = {0};
|
||||
if (!nob_read_entire_file(ttf_path, &sb)) return false;
|
||||
String_Builder sb = {0};
|
||||
if (!sb_read_file(&sb, ttf_path)) return false;
|
||||
|
||||
FILE *out = fopen(header_path, "wb");
|
||||
if (!out) {
|
||||
nob_log(NOB_ERROR, "Could not open %s for writing", header_path);
|
||||
nob_sb_free(sb);
|
||||
build_log(LOG_ERROR, "Could not open %s for writing", header_path);
|
||||
sb_free(&sb);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -58,8 +58,8 @@ static bool embed_font_file(const char *ttf_path, const char *header_path) {
|
||||
fprintf(out, "static const unsigned int font_inter_size = %zu;\n", sb.count);
|
||||
|
||||
fclose(out);
|
||||
nob_sb_free(sb);
|
||||
nob_log(NOB_INFO, "Generated %s (%zu bytes)", header_path, sb.count);
|
||||
sb_free(&sb);
|
||||
build_log(LOG_INFO, "Generated %s (%zu bytes)", header_path, sb.count);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -78,17 +78,17 @@ static const char *frameworks[] = {
|
||||
};
|
||||
|
||||
static bool build_freetype_lib(const char *build_dir, bool debug) {
|
||||
const char *obj_dir = nob_temp_sprintf("%s/freetype_obj", build_dir);
|
||||
const char *obj_dir = temp_sprintf("%s/freetype_obj", build_dir);
|
||||
const char *lib_path = "vendor/freetype/libfreetype.a";
|
||||
|
||||
if (!nob_needs_rebuild(lib_path, freetype_sources, NOB_ARRAY_LEN(freetype_sources))) {
|
||||
nob_log(NOB_INFO, "freetype is up to date");
|
||||
if (!needs_rebuild(lib_path, freetype_sources, ARRAY_LEN(freetype_sources))) {
|
||||
build_log(LOG_INFO, "freetype is up to date");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!nob_mkdir_if_not_exists(obj_dir)) return false;
|
||||
if (!mkdir_if_not_exists(obj_dir)) return false;
|
||||
|
||||
for (size_t i = 0; i < NOB_ARRAY_LEN(freetype_sources); i++) {
|
||||
for (size_t i = 0; i < ARRAY_LEN(freetype_sources); i++) {
|
||||
const char *src = freetype_sources[i];
|
||||
const char *base = strrchr(src, '/');
|
||||
base = base ? base + 1 : src;
|
||||
@@ -96,30 +96,29 @@ static bool build_freetype_lib(const char *build_dir, bool debug) {
|
||||
snprintf(obj_name, sizeof(obj_name), "%s", base);
|
||||
char *dot = strrchr(obj_name, '.');
|
||||
if (dot) { dot[1] = 'o'; dot[2] = '\0'; }
|
||||
const char *obj_path = nob_temp_sprintf("%s/%s", obj_dir, obj_name);
|
||||
const char *obj_path = temp_sprintf("%s/%s", obj_dir, obj_name);
|
||||
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "clang");
|
||||
nob_cmd_append(&cmd, "-std=c11", "-c");
|
||||
nob_cmd_append(&cmd, "-DFT2_BUILD_LIBRARY");
|
||||
nob_cmd_append(&cmd, "-Ivendor/freetype/include");
|
||||
nob_cmd_append(&cmd, "-Wall", "-Wno-unused-function", "-Wno-unused-parameter");
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "clang");
|
||||
cmd_append(&cmd, "-std=c11", "-c");
|
||||
cmd_append(&cmd, "-DFT2_BUILD_LIBRARY");
|
||||
cmd_append(&cmd, "-Ivendor/freetype/include");
|
||||
cmd_append(&cmd, "-Wall", "-Wno-unused-function", "-Wno-unused-parameter");
|
||||
if (debug) {
|
||||
nob_cmd_append(&cmd, "-g", "-O0");
|
||||
cmd_append(&cmd, "-g", "-O0");
|
||||
} else {
|
||||
nob_cmd_append(&cmd, "-O2");
|
||||
cmd_append(&cmd, "-O2");
|
||||
}
|
||||
nob_cmd_append(&cmd, "-o", obj_path);
|
||||
nob_cmd_append(&cmd, src);
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
if (!nob_cmd_run_opt(&cmd, copt)) return false;
|
||||
cmd_append(&cmd, "-o", obj_path);
|
||||
cmd_append(&cmd, src);
|
||||
if (!cmd_run(&cmd)) return false;
|
||||
}
|
||||
|
||||
// Archive
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "ar", "rcs", lib_path);
|
||||
for (size_t i = 0; i < NOB_ARRAY_LEN(freetype_sources); i++) {
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "ar", "rcs", lib_path);
|
||||
for (size_t i = 0; i < ARRAY_LEN(freetype_sources); i++) {
|
||||
const char *src = freetype_sources[i];
|
||||
const char *base = strrchr(src, '/');
|
||||
base = base ? base + 1 : src;
|
||||
@@ -127,26 +126,24 @@ static bool build_freetype_lib(const char *build_dir, bool debug) {
|
||||
snprintf(obj_name, sizeof(obj_name), "%s", base);
|
||||
char *dot = strrchr(obj_name, '.');
|
||||
if (dot) { dot[1] = 'o'; dot[2] = '\0'; }
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("%s/%s", obj_dir, obj_name));
|
||||
cmd__append(&cmd, 1, temp_sprintf("%s/%s", obj_dir, obj_name));
|
||||
}
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
if (!nob_cmd_run_opt(&cmd, copt)) return false;
|
||||
if (!cmd_run(&cmd)) return false;
|
||||
}
|
||||
|
||||
// Clean up obj dir
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "rm", "-rf", obj_dir);
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
nob_cmd_run_opt(&cmd, copt);
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "rm", "-rf", obj_dir);
|
||||
cmd_run(&cmd);
|
||||
}
|
||||
|
||||
nob_log(NOB_INFO, "Built %s", lib_path);
|
||||
build_log(LOG_INFO, "Built %s", lib_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
NOB_GO_REBUILD_URSELF(argc, argv);
|
||||
GO_REBUILD_URSELF(argc, argv);
|
||||
|
||||
bool debug = false;
|
||||
bool clean = false;
|
||||
@@ -154,8 +151,8 @@ int main(int argc, char **argv) {
|
||||
if (strcmp(argv[i], "debug") == 0) debug = true;
|
||||
else if (strcmp(argv[i], "clean") == 0) clean = true;
|
||||
else {
|
||||
nob_log(NOB_ERROR, "unknown argument: %s", argv[i]);
|
||||
nob_log(NOB_ERROR, "usage: %s [debug] [clean]", argv[0]);
|
||||
build_log(LOG_ERROR, "unknown argument: %s", argv[i]);
|
||||
build_log(LOG_ERROR, "usage: %s [debug] [clean]", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -163,28 +160,26 @@ int main(int argc, char **argv) {
|
||||
const char *build_dir = debug ? "build_debug" : "build_release";
|
||||
|
||||
if (clean) {
|
||||
nob_log(NOB_INFO, "Cleaning build artifacts");
|
||||
{ Nob_Cmd cmd = {0}; nob_cmd_append(&cmd, "rm", "-rf", "build_debug");
|
||||
Nob_Cmd_Opt opt = {0}; nob_cmd_run_opt(&cmd, opt); }
|
||||
{ Nob_Cmd cmd = {0}; nob_cmd_append(&cmd, "rm", "-rf", "build_release");
|
||||
Nob_Cmd_Opt opt = {0}; nob_cmd_run_opt(&cmd, opt); }
|
||||
build_log(LOG_INFO, "Cleaning build artifacts");
|
||||
{ Cmd cmd = {0}; cmd_append(&cmd, "rm", "-rf", "build_debug"); cmd_run(&cmd); }
|
||||
{ Cmd cmd = {0}; cmd_append(&cmd, "rm", "-rf", "build_release"); cmd_run(&cmd); }
|
||||
remove("vendor/freetype/libfreetype.a");
|
||||
remove("src/renderer/font_inter.gen.h");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// App bundle paths
|
||||
const char *app_dir = nob_temp_sprintf("%s/autosample.app", build_dir);
|
||||
const char *contents = nob_temp_sprintf("%s/Contents", app_dir);
|
||||
const char *macos_dir = nob_temp_sprintf("%s/Contents/MacOS", app_dir);
|
||||
const char *res_dir = nob_temp_sprintf("%s/Contents/Resources", app_dir);
|
||||
const char *binary_path = nob_temp_sprintf("%s/Contents/MacOS/autosample", app_dir);
|
||||
const char *app_dir = temp_sprintf("%s/autosample.app", build_dir);
|
||||
const char *contents = temp_sprintf("%s/Contents", app_dir);
|
||||
const char *macos_dir = temp_sprintf("%s/Contents/MacOS", app_dir);
|
||||
const char *res_dir = temp_sprintf("%s/Contents/Resources", app_dir);
|
||||
const char *binary_path = temp_sprintf("%s/Contents/MacOS/autosample", app_dir);
|
||||
|
||||
if (!nob_mkdir_if_not_exists(build_dir)) return 1;
|
||||
if (!nob_mkdir_if_not_exists(app_dir)) return 1;
|
||||
if (!nob_mkdir_if_not_exists(contents)) return 1;
|
||||
if (!nob_mkdir_if_not_exists(macos_dir)) return 1;
|
||||
if (!nob_mkdir_if_not_exists(res_dir)) return 1;
|
||||
if (!mkdir_if_not_exists(build_dir)) return 1;
|
||||
if (!mkdir_if_not_exists(app_dir)) return 1;
|
||||
if (!mkdir_if_not_exists(contents)) return 1;
|
||||
if (!mkdir_if_not_exists(macos_dir)) return 1;
|
||||
if (!mkdir_if_not_exists(res_dir)) return 1;
|
||||
|
||||
// Build static libraries
|
||||
if (!build_freetype_lib(build_dir, debug)) return 1;
|
||||
@@ -195,41 +190,41 @@ int main(int argc, char **argv) {
|
||||
|
||||
// Unity build: single clang invocation compiles main.c (which #includes everything)
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "clang");
|
||||
nob_cmd_append(&cmd, "-std=c11", "-x", "objective-c");
|
||||
nob_cmd_append(&cmd, "-Wall", "-Wextra", "-Wno-missing-field-initializers");
|
||||
nob_cmd_append(&cmd, "-Wno-deprecated-declarations");
|
||||
nob_cmd_append(&cmd, "-Isrc", "-Ivendor/clay");
|
||||
nob_cmd_append(&cmd, "-Ivendor/nanosvg");
|
||||
nob_cmd_append(&cmd, "-Ivendor/freetype/include");
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "clang");
|
||||
cmd_append(&cmd, "-std=c11", "-x", "objective-c");
|
||||
cmd_append(&cmd, "-Wall", "-Wextra", "-Wno-missing-field-initializers");
|
||||
cmd_append(&cmd, "-Wno-deprecated-declarations");
|
||||
cmd_append(&cmd, "-Isrc", "-Ivendor/clay");
|
||||
cmd_append(&cmd, "-Ivendor/nanosvg");
|
||||
cmd_append(&cmd, "-Ivendor/freetype/include");
|
||||
|
||||
if (debug) {
|
||||
nob_cmd_append(&cmd, "-g", "-O0", "-D_DEBUG");
|
||||
cmd_append(&cmd, "-g", "-O0", "-D_DEBUG");
|
||||
} else {
|
||||
nob_cmd_append(&cmd, "-O2", "-DNDEBUG");
|
||||
cmd_append(&cmd, "-O2", "-DNDEBUG");
|
||||
}
|
||||
|
||||
nob_cmd_append(&cmd, "-o", binary_path);
|
||||
nob_cmd_append(&cmd, "src/main.c");
|
||||
cmd_append(&cmd, "-o", binary_path);
|
||||
cmd_append(&cmd, "src/main.c");
|
||||
|
||||
// Reset language mode so .a is treated as a library, not source
|
||||
nob_cmd_append(&cmd, "-x", "none");
|
||||
nob_cmd_append(&cmd, "vendor/freetype/libfreetype.a");
|
||||
cmd_append(&cmd, "-x", "none");
|
||||
cmd_append(&cmd, "vendor/freetype/libfreetype.a");
|
||||
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < NOB_ARRAY_LEN(frameworks); i++)
|
||||
nob_cmd_append(&cmd, frameworks[i]);
|
||||
for (i = 0; i < ARRAY_LEN(frameworks); i++)
|
||||
cmd__append(&cmd, 1, frameworks[i]);
|
||||
}
|
||||
nob_cmd_append(&cmd, "-lm");
|
||||
{ Nob_Cmd_Opt opt = {0}; if (!nob_cmd_run_opt(&cmd, opt)) return 1; }
|
||||
cmd_append(&cmd, "-lm");
|
||||
if (!cmd_run(&cmd)) return 1;
|
||||
}
|
||||
|
||||
// Write Info.plist
|
||||
{
|
||||
const char *plist_path = nob_temp_sprintf("%s/Contents/Info.plist", app_dir);
|
||||
nob_write_entire_file(plist_path,
|
||||
const char *plist_path = temp_sprintf("%s/Contents/Info.plist", app_dir);
|
||||
const char *plist =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"\n"
|
||||
" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
||||
@@ -252,35 +247,11 @@ int main(int argc, char **argv) {
|
||||
" <key>NSSupportsAutomaticGraphicsSwitching</key>\n"
|
||||
" <true/>\n"
|
||||
"</dict>\n"
|
||||
"</plist>\n",
|
||||
strlen(
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"\n"
|
||||
" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
||||
"<plist version=\"1.0\">\n"
|
||||
"<dict>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>autosample</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
" <string>com.autosample.app</string>\n"
|
||||
" <key>CFBundleName</key>\n"
|
||||
" <string>autosample</string>\n"
|
||||
" <key>CFBundleVersion</key>\n"
|
||||
" <string>0.1</string>\n"
|
||||
" <key>CFBundleShortVersionString</key>\n"
|
||||
" <string>0.1</string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>NSHighResolutionCapable</key>\n"
|
||||
" <true/>\n"
|
||||
" <key>NSSupportsAutomaticGraphicsSwitching</key>\n"
|
||||
" <true/>\n"
|
||||
"</dict>\n"
|
||||
"</plist>\n"
|
||||
));
|
||||
"</plist>\n";
|
||||
write_entire_file(plist_path, plist, strlen(plist));
|
||||
}
|
||||
|
||||
nob_log(NOB_INFO, "Build complete: %s", app_dir);
|
||||
build_log(LOG_INFO, "Build complete: %s", app_dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -309,20 +280,19 @@ static const char *link_libs[] = {
|
||||
// SPIR-V shader compilation — compiles .glsl to .spv, then embeds as C header
|
||||
|
||||
static bool compile_shader(const char *glslc_path, const char *src, const char *spv_path, const char *stage) {
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, glslc_path, nob_temp_sprintf("-fshader-stage=%s", stage), "-o", spv_path, src);
|
||||
Nob_Cmd_Opt opt = {0};
|
||||
return nob_cmd_run_opt(&cmd, opt);
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, glslc_path, temp_sprintf("-fshader-stage=%s", stage), "-o", spv_path, src);
|
||||
return cmd_run(&cmd);
|
||||
}
|
||||
|
||||
static bool embed_spirv(const char *spv_path, const char *header_path, const char *array_name) {
|
||||
Nob_String_Builder sb = {0};
|
||||
if (!nob_read_entire_file(spv_path, &sb)) return false;
|
||||
String_Builder sb = {0};
|
||||
if (!sb_read_file(&sb, spv_path)) return false;
|
||||
|
||||
FILE *out = fopen(header_path, "wb");
|
||||
if (!out) {
|
||||
nob_log(NOB_ERROR, "Could not open %s for writing", header_path);
|
||||
nob_sb_free(sb);
|
||||
build_log(LOG_ERROR, "Could not open %s for writing", header_path);
|
||||
sb_free(&sb);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -341,96 +311,93 @@ static bool embed_spirv(const char *spv_path, const char *header_path, const cha
|
||||
fprintf(out, "};\n");
|
||||
|
||||
fclose(out);
|
||||
nob_sb_free(sb);
|
||||
nob_log(NOB_INFO, "Generated %s (%zu bytes)", header_path, sb.count);
|
||||
sb_free(&sb);
|
||||
build_log(LOG_INFO, "Generated %s (%zu bytes)", header_path, sb.count);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool compile_and_embed_shaders(const char *build_dir) {
|
||||
const char *vk_sdk = get_vulkan_sdk_path();
|
||||
const char *glslc = nob_temp_sprintf("%s\\Bin\\glslc.exe", vk_sdk);
|
||||
const char *glslc = temp_sprintf("%s\\Bin\\glslc.exe", vk_sdk);
|
||||
|
||||
const char *vert_src = "src/renderer/ui.v.glsl";
|
||||
const char *frag_src = "src/renderer/ui.f.glsl";
|
||||
const char *vert_spv = nob_temp_sprintf("%s/ui_vert.spv", build_dir);
|
||||
const char *frag_spv = nob_temp_sprintf("%s/ui_frag.spv", build_dir);
|
||||
const char *vert_spv = temp_sprintf("%s/ui_vert.spv", build_dir);
|
||||
const char *frag_spv = temp_sprintf("%s/ui_frag.spv", build_dir);
|
||||
const char *vert_hdr = "src/renderer/ui_vert.spv.h";
|
||||
const char *frag_hdr = "src/renderer/ui_frag.spv.h";
|
||||
|
||||
// Check if rebuild needed
|
||||
if (nob_needs_rebuild1(vert_hdr, vert_src)) {
|
||||
nob_log(NOB_INFO, "Compiling vertex shader");
|
||||
if (needs_rebuild1(vert_hdr, vert_src)) {
|
||||
build_log(LOG_INFO, "Compiling vertex shader");
|
||||
if (!compile_shader(glslc, vert_src, vert_spv, "vertex")) return false;
|
||||
if (!embed_spirv(vert_spv, vert_hdr, "ui_vert_spv")) return false;
|
||||
} else {
|
||||
nob_log(NOB_INFO, "Vertex shader is up to date");
|
||||
build_log(LOG_INFO, "Vertex shader is up to date");
|
||||
}
|
||||
|
||||
if (nob_needs_rebuild1(frag_hdr, frag_src)) {
|
||||
nob_log(NOB_INFO, "Compiling fragment shader");
|
||||
if (needs_rebuild1(frag_hdr, frag_src)) {
|
||||
build_log(LOG_INFO, "Compiling fragment shader");
|
||||
if (!compile_shader(glslc, frag_src, frag_spv, "fragment")) return false;
|
||||
if (!embed_spirv(frag_spv, frag_hdr, "ui_frag_spv")) return false;
|
||||
} else {
|
||||
nob_log(NOB_INFO, "Fragment shader is up to date");
|
||||
build_log(LOG_INFO, "Fragment shader is up to date");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool build_freetype_lib(const char *build_dir, bool debug) {
|
||||
const char *obj_dir = nob_temp_sprintf("%s\\freetype_obj", build_dir);
|
||||
const char *obj_dir = temp_sprintf("%s\\freetype_obj", build_dir);
|
||||
const char *lib_path = debug ? "vendor\\freetype\\freetype_d.lib" : "vendor\\freetype\\freetype.lib";
|
||||
|
||||
if (!nob_needs_rebuild(lib_path, freetype_sources, NOB_ARRAY_LEN(freetype_sources))) {
|
||||
nob_log(NOB_INFO, "freetype is up to date");
|
||||
if (!needs_rebuild(lib_path, freetype_sources, ARRAY_LEN(freetype_sources))) {
|
||||
build_log(LOG_INFO, "freetype is up to date");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!nob_mkdir_if_not_exists(obj_dir)) return false;
|
||||
if (!mkdir_if_not_exists(obj_dir)) return false;
|
||||
|
||||
for (size_t i = 0; i < NOB_ARRAY_LEN(freetype_sources); i++) {
|
||||
for (size_t i = 0; i < ARRAY_LEN(freetype_sources); i++) {
|
||||
const char *src = freetype_sources[i];
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "cl.exe", "/nologo", "/c");
|
||||
nob_cmd_append(&cmd, "/std:c11");
|
||||
nob_cmd_append(&cmd, "/DFT2_BUILD_LIBRARY");
|
||||
nob_cmd_append(&cmd, "/Ivendor/freetype/include");
|
||||
nob_cmd_append(&cmd, "/W3");
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "cl.exe", "/nologo", "/c");
|
||||
cmd_append(&cmd, "/std:c11");
|
||||
cmd_append(&cmd, "/DFT2_BUILD_LIBRARY");
|
||||
cmd_append(&cmd, "/Ivendor/freetype/include");
|
||||
cmd_append(&cmd, "/W3");
|
||||
if (debug) {
|
||||
nob_cmd_append(&cmd, "/MTd", "/Zi");
|
||||
cmd_append(&cmd, "/MTd", "/Zi");
|
||||
} else {
|
||||
nob_cmd_append(&cmd, "/MT", "/O2");
|
||||
cmd_append(&cmd, "/MT", "/O2");
|
||||
}
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("/Fo:%s/", obj_dir));
|
||||
nob_cmd_append(&cmd, src);
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
if (!nob_cmd_run_opt(&cmd, copt)) return false;
|
||||
cmd_append(&cmd, temp_sprintf("/Fo:%s/", obj_dir));
|
||||
cmd_append(&cmd, src);
|
||||
if (!cmd_run(&cmd)) return false;
|
||||
}
|
||||
|
||||
// Archive
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "lib.exe", "/nologo", nob_temp_sprintf("/OUT:%s", lib_path));
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("%s/*.obj", obj_dir));
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
if (!nob_cmd_run_opt(&cmd, copt)) return false;
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "lib.exe", "/nologo", temp_sprintf("/OUT:%s", lib_path));
|
||||
cmd_append(&cmd, temp_sprintf("%s/*.obj", obj_dir));
|
||||
if (!cmd_run(&cmd)) return false;
|
||||
}
|
||||
|
||||
// Clean up obj dir
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "cmd.exe", "/c",
|
||||
nob_temp_sprintf("if exist %s rmdir /s /q %s", obj_dir, obj_dir));
|
||||
Nob_Cmd_Opt copt = {0};
|
||||
nob_cmd_run_opt(&cmd, copt);
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "cmd.exe", "/c",
|
||||
temp_sprintf("if exist %s rmdir /s /q %s", obj_dir, obj_dir));
|
||||
cmd_run(&cmd);
|
||||
}
|
||||
|
||||
nob_log(NOB_INFO, "Built %s", lib_path);
|
||||
build_log(LOG_INFO, "Built %s", lib_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
NOB_GO_REBUILD_URSELF(argc, argv);
|
||||
GO_REBUILD_URSELF(argc, argv);
|
||||
|
||||
bool debug = false;
|
||||
bool clean = false;
|
||||
@@ -438,8 +405,8 @@ int main(int argc, char **argv) {
|
||||
if (strcmp(argv[i], "debug") == 0) debug = true;
|
||||
else if (strcmp(argv[i], "clean") == 0) clean = true;
|
||||
else {
|
||||
nob_log(NOB_ERROR, "unknown argument: %s", argv[i]);
|
||||
nob_log(NOB_ERROR, "usage: %s [debug] [clean]", argv[0]);
|
||||
build_log(LOG_ERROR, "unknown argument: %s", argv[i]);
|
||||
build_log(LOG_ERROR, "usage: %s [debug] [clean]", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -447,13 +414,13 @@ int main(int argc, char **argv) {
|
||||
const char *build_dir = debug ? "build_debug" : "build_release";
|
||||
|
||||
if (clean) {
|
||||
nob_log(NOB_INFO, "Cleaning build artifacts");
|
||||
{ Nob_Cmd cmd = {0}; nob_cmd_append(&cmd, "cmd.exe", "/c",
|
||||
build_log(LOG_INFO, "Cleaning build artifacts");
|
||||
{ Cmd cmd = {0}; cmd_append(&cmd, "cmd.exe", "/c",
|
||||
"if exist build_debug rmdir /s /q build_debug");
|
||||
Nob_Cmd_Opt opt = {0}; nob_cmd_run_opt(&cmd, opt); }
|
||||
{ Nob_Cmd cmd = {0}; nob_cmd_append(&cmd, "cmd.exe", "/c",
|
||||
cmd_run(&cmd); }
|
||||
{ Cmd cmd = {0}; cmd_append(&cmd, "cmd.exe", "/c",
|
||||
"if exist build_release rmdir /s /q build_release");
|
||||
Nob_Cmd_Opt opt = {0}; nob_cmd_run_opt(&cmd, opt); }
|
||||
cmd_run(&cmd); }
|
||||
remove("vendor\\freetype\\freetype.lib");
|
||||
remove("vendor\\freetype\\freetype_d.lib");
|
||||
remove("src\\renderer\\font_inter.gen.h");
|
||||
@@ -462,7 +429,7 @@ int main(int argc, char **argv) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!nob_mkdir_if_not_exists(build_dir)) return 1;
|
||||
if (!mkdir_if_not_exists(build_dir)) return 1;
|
||||
|
||||
// Build static libraries
|
||||
if (!build_freetype_lib(build_dir, debug)) return 1;
|
||||
@@ -475,50 +442,50 @@ int main(int argc, char **argv) {
|
||||
if (!compile_and_embed_shaders(build_dir)) return 1;
|
||||
|
||||
const char *vk_sdk = get_vulkan_sdk_path();
|
||||
const char *vk_include = nob_temp_sprintf("/I%s/Include", vk_sdk);
|
||||
const char *vk_lib = nob_temp_sprintf("%s/Lib/vulkan-1.lib", vk_sdk);
|
||||
const char *vk_include = temp_sprintf("/I%s/Include", vk_sdk);
|
||||
const char *vk_lib = temp_sprintf("%s/Lib/vulkan-1.lib", vk_sdk);
|
||||
|
||||
// Unity build: single cl.exe invocation compiles main.c (which #includes everything)
|
||||
{
|
||||
Nob_Cmd cmd = {0};
|
||||
nob_cmd_append(&cmd, "cl.exe");
|
||||
nob_cmd_append(&cmd, "/nologo", "/std:c11", "/TC", "/W3");
|
||||
nob_cmd_append(&cmd, "/Isrc", "/Ivendor/clay");
|
||||
nob_cmd_append(&cmd, "/Ivendor/nanosvg");
|
||||
nob_cmd_append(&cmd, "/Ivendor/freetype/include");
|
||||
nob_cmd_append(&cmd, vk_include);
|
||||
Cmd cmd = {0};
|
||||
cmd_append(&cmd, "cl.exe");
|
||||
cmd_append(&cmd, "/nologo", "/std:c11", "/TC", "/W3");
|
||||
cmd_append(&cmd, "/Isrc", "/Ivendor/clay");
|
||||
cmd_append(&cmd, "/Ivendor/nanosvg");
|
||||
cmd_append(&cmd, "/Ivendor/freetype/include");
|
||||
cmd_append(&cmd, vk_include);
|
||||
|
||||
if (debug) {
|
||||
nob_cmd_append(&cmd, "/MTd", "/Zi", "/D_DEBUG");
|
||||
cmd_append(&cmd, "/MTd", "/Zi", "/D_DEBUG");
|
||||
} else {
|
||||
nob_cmd_append(&cmd, "/MT", "/Zi", "/O2", "/DNDEBUG");
|
||||
cmd_append(&cmd, "/MT", "/Zi", "/O2", "/DNDEBUG");
|
||||
}
|
||||
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("/Fe:%s/autosample.exe", build_dir));
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("/Fo:%s/", build_dir));
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("/Fd:%s/autosample.pdb", build_dir));
|
||||
cmd_append(&cmd, temp_sprintf("/Fe:%s/autosample.exe", build_dir));
|
||||
cmd_append(&cmd, temp_sprintf("/Fo:%s/", build_dir));
|
||||
cmd_append(&cmd, temp_sprintf("/Fd:%s/autosample.pdb", build_dir));
|
||||
|
||||
nob_cmd_append(&cmd, "src/main.c");
|
||||
cmd_append(&cmd, "src/main.c");
|
||||
|
||||
nob_cmd_append(&cmd, "/link");
|
||||
nob_cmd_append(&cmd, "/MACHINE:X64");
|
||||
nob_cmd_append(&cmd, "/SUBSYSTEM:CONSOLE");
|
||||
nob_cmd_append(&cmd, nob_temp_sprintf("/PDB:%s/autosample.pdb", build_dir));
|
||||
nob_cmd_append(&cmd, "/DEBUG");
|
||||
nob_cmd_append(&cmd, debug ? "vendor/freetype/freetype_d.lib" : "vendor/freetype/freetype.lib");
|
||||
nob_cmd_append(&cmd, vk_lib);
|
||||
cmd_append(&cmd, "/link");
|
||||
cmd_append(&cmd, "/MACHINE:X64");
|
||||
cmd_append(&cmd, "/SUBSYSTEM:CONSOLE");
|
||||
cmd_append(&cmd, temp_sprintf("/PDB:%s/autosample.pdb", build_dir));
|
||||
cmd_append(&cmd, "/DEBUG");
|
||||
cmd_append(&cmd, debug ? "vendor/freetype/freetype_d.lib" : "vendor/freetype/freetype.lib");
|
||||
cmd_append(&cmd, vk_lib);
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < NOB_ARRAY_LEN(link_libs); i++)
|
||||
nob_cmd_append(&cmd, link_libs[i]);
|
||||
for (i = 0; i < ARRAY_LEN(link_libs); i++)
|
||||
cmd__append(&cmd, 1, link_libs[i]);
|
||||
}
|
||||
{ Nob_Cmd_Opt opt = {0}; if (!nob_cmd_run_opt(&cmd, opt)) return 1; }
|
||||
if (!cmd_run(&cmd)) return 1;
|
||||
}
|
||||
|
||||
// Clean up obj files
|
||||
nob_delete_file(nob_temp_sprintf("%s/main.obj", build_dir));
|
||||
delete_file(temp_sprintf("%s/main.obj", build_dir));
|
||||
|
||||
nob_log(NOB_INFO, "Build complete: %s/autosample.exe", build_dir);
|
||||
build_log(LOG_INFO, "Build complete: %s/autosample.exe", build_dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user