Commit: c83e4c553332bc4d2bbe4a3ccdd1cfacfcb4af87
Parent: 7af82b9de344becfbb86b6ec3c1cd265480de7db
Author: Randy Palamar
Date: Sat, 17 Jan 2026 14:15:49 -0700
add and build glslang library for shader compilation
unfortunately this requires a c++ compiler but I don't know of any
other options at the moment
Diffstat:
5 files changed, 132 insertions(+), 11 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -1,3 +1,6 @@
+[submodule "external/glslang"]
+ path = external/glslang
+ url = https://github.com/KhronosGroup/glslang.git
[submodule "external/raylib"]
path = external/raylib
url = https://github.com/raysan5/raylib.git
diff --git a/build.c b/build.c
@@ -32,12 +32,14 @@ global char *g_argv0;
#define OUTPUT(s) OUTDIR OS_PATH_SEPARATOR s
#if COMPILER_MSVC
- #define COMMON_FLAGS "-nologo", "-std:c11", "-Fo:" OUTDIR "\\", "-Z7", "-Zo"
+ #define COMMON_CFLAGS "-std:c11"
+ #define COMMON_FLAGS "-nologo", "-Fo:" OUTDIR "\\", "-Z7", "-Zo"
#define DEBUG_FLAGS "-Od", "-D_DEBUG"
#define OPTIMIZED_FLAGS "-O2"
#define EXTRA_FLAGS ""
#else
- #define COMMON_FLAGS "-std=c11", "-pipe", "-Wall"
+ #define COMMON_CFLAGS "-std=c11"
+ #define COMMON_FLAGS "-pipe", "-Wall"
#define DEBUG_FLAGS "-O0", "-D_DEBUG", "-Wno-unused-function"
#define OPTIMIZED_FLAGS "-O3"
#define EXTRA_FLAGS_BASE "-Werror", "-Wextra", "-Wno-unused-parameter", \
@@ -95,12 +97,15 @@ global char *g_argv0;
#if COMPILER_CLANG
#define COMPILER "clang"
+ #define CPP_COMPILER "clang++"
#define PREPROCESSOR "clang", "-E", "-P"
#elif COMPILER_MSVC
#define COMPILER "cl"
+ #define CPP_COMPILER "cl"
#define PREPROCESSOR "cl", "/EP"
#else
#define COMPILER "cc"
+ #define CPP_COMPILER "c++"
#define PREPROCESSOR "cc", "-E", "-P"
#endif
@@ -541,11 +546,11 @@ use_sanitization(void)
}
function void
-cmd_base(Arena *a, CommandList *c)
+cmd_base(Arena *a, CommandList *c, b32 cpp)
{
Config *o = &config;
- cmd_append(a, c, COMPILER);
+ cmd_append(a, c, cpp ? CPP_COMPILER : COMPILER);
if (!is_msvc) {
/* TODO(rnp): support cross compiling with clang */
@@ -554,6 +559,7 @@ cmd_base(Arena *a, CommandList *c)
else if (is_aarch64) cmd_append(a, c, "-march=armv8");
}
+ if (!cpp) cmd_append(a, c, COMMON_CFLAGS);
cmd_append(a, c, COMMON_FLAGS);
if (o->debug) cmd_append(a, c, DEBUG_FLAGS);
else cmd_append(a, c, OPTIMIZED_FLAGS);
@@ -584,7 +590,7 @@ check_rebuild_self(Arena arena, i32 argc, char *argv[])
build_fatal("failed to move: %s -> %s", binary, old_name);
CommandList c = {0};
- cmd_base(&arena, &c);
+ cmd_base(&arena, &c, 0);
cmd_append(&arena, &c, EXTRA_FLAGS);
if (!is_msvc) cmd_append(&arena, &c, "-Wno-unused-function");
cmd_append(&arena, &c, __FILE__, OUTPUT_EXE(binary));
@@ -731,7 +737,7 @@ build_static_library(Arena a, CommandList cc, char *name, char **deps, char **ou
}
function b32
-check_build_raylib(Arena a)
+build_raylib(Arena a)
{
b32 result = 1, shared = config.debug;
char *libraylib = shared ? OS_SHARED_LINK_LIB("raylib") : OUTPUT_LIB(OS_STATIC_LIB("raylib"));
@@ -740,7 +746,7 @@ check_build_raylib(Arena a)
os_copy_file("external/raylib/src/rlgl.h", "external/include/rlgl.h");
CommandList cc = {0};
- cmd_base(&a, &cc);
+ cmd_base(&a, &cc, 0);
if (is_unix) cmd_append(&a, &cc, "-D_GLFW_X11");
cmd_append(&a, &cc, "-DPLATFORM_DESKTOP_GLFW");
if (!is_msvc) cmd_append(&a, &cc, "-Wno-unused-but-set-variable");
@@ -771,10 +777,50 @@ check_build_raylib(Arena a)
}
function b32
+build_glslang(Arena a)
+{
+ b32 result = 1;
+ char *lib = OUTPUT_LIB(OS_STATIC_LIB("glslang"));
+ if (needs_rebuild(lib, "external/glslang")) {
+ git_submodule_update(a, "external/glslang");
+ os_copy_file("external/glslang/glslang/Include/glslang_c_interface.h", "external/include/glslang_c_interface.h");
+
+ CommandList cc = {0};
+ cmd_base(&a, &cc, 1);
+ cmd_append(&a, &cc, "-std=c++17", "-fno-rtti", "-fno-exceptions", "-Wno-unused-but-set-variable");
+ cmd_append(&a, &cc, "-Iexternal/glslang_local", "-Iexternal/glslang");
+
+ #if OS_WINDOWS
+ #define GLSLANG_SOURCES_OS X(ossource, "glslang/glslang/OSDependent/Windows/")
+ #else
+ #define GLSLANG_SOURCES_OS
+ #endif
+
+ #define GLSLANG_SOURCES_COMMON \
+ X(glslang, "glslang_local/") \
+ X(spirv_c_interface, "glslang/SPIRV/CInterface/") \
+
+ #define GLSLANG_SOURCES \
+ GLSLANG_SOURCES_COMMON \
+ GLSLANG_SOURCES_OS \
+
+ #define X(name, extra) "external/" extra #name ".cpp",
+ char *srcs[] = {GLSLANG_SOURCES};
+ #undef X
+ #define X(name, ...) OUTPUT(OBJECT(#name)),
+ char *outs[] = {GLSLANG_SOURCES};
+ #undef X
+
+ result = build_static_library(a, cc, lib, srcs, outs, countof(srcs));
+ }
+ return result;
+}
+
+function b32
build_helper_library(Arena arena)
{
CommandList cc = {0};
- cmd_base(&arena, &cc);
+ cmd_base(&arena, &cc, 0);
cmd_append(&arena, &cc, EXTRA_FLAGS);
/////////////
@@ -792,7 +838,7 @@ build_helper_library(Arena arena)
function void
cmd_beamformer_base(Arena *a, CommandList *c)
{
- cmd_base(a, c);
+ cmd_base(a, c, 0);
cmd_append(a, c, "-Iexternal/include");
cmd_append(a, c, EXTRA_FLAGS);
cmd_append(a, c, config.bake_shaders? "-DBakeShaders=1" : "-DBakeShaders=0");
@@ -856,7 +902,7 @@ function b32
build_tests(Arena arena)
{
CommandList cc = {0};
- cmd_base(&arena, &cc);
+ cmd_base(&arena, &cc, 0);
cmd_append(&arena, &cc, EXTRA_FLAGS);
#define TEST_PROGRAMS \
@@ -4785,7 +4831,8 @@ main(i32 argc, char *argv[])
parse_config(argc, argv);
- if (!check_build_raylib(arena)) return 1;
+ if (!build_raylib(arena)) return 1;
+ if (!build_glslang(arena)) return 1;
/////////////////
// lib/tests
diff --git a/external/glslang b/external/glslang
@@ -0,0 +1 @@
+Subproject commit b5782e52ee2f7b3e40bb9c80d15b47016e008bc9
diff --git a/external/glslang_local/glslang.cpp b/external/glslang_local/glslang.cpp
@@ -0,0 +1,58 @@
+/* See LICENSE for license details. */
+// NOTE(rnp): an almost single file build for glslang
+
+#include "../../compiler.h"
+
+#include "SPIRV/SpvBuilder.cpp"
+
+// NOTE(rnp): cannot be included at the samee time as glslang_c_interface.cpp
+// compiled as a seperate object
+//#include "SPIRV/CInterface/spirv_c_interface.cpp"
+
+#include "SPIRV/GlslangToSpv.cpp"
+#include "SPIRV/InReadableOrder.cpp"
+#include "SPIRV/Logger.cpp"
+#include "SPIRV/SpvPostProcess.cpp"
+#include "SPIRV/SpvTools.cpp"
+#include "SPIRV/disassemble.cpp"
+#include "SPIRV/doc.cpp"
+#include "glslang/CInterface/glslang_c_interface.cpp"
+#include "glslang/GenericCodeGen/CodeGen.cpp"
+#include "glslang/GenericCodeGen/Link.cpp"
+#include "glslang/MachineIndependent/Constant.cpp"
+#include "glslang/MachineIndependent/InfoSink.cpp"
+#include "glslang/MachineIndependent/Initialize.cpp"
+#include "glslang/MachineIndependent/IntermTraverse.cpp"
+#include "glslang/MachineIndependent/Intermediate.cpp"
+#include "glslang/MachineIndependent/ParseContextBase.cpp"
+#include "glslang/MachineIndependent/ParseHelper.cpp"
+#include "glslang/MachineIndependent/PoolAlloc.cpp"
+#include "glslang/MachineIndependent/RemoveTree.cpp"
+#include "glslang/MachineIndependent/Scan.cpp"
+#include "glslang/MachineIndependent/ShaderLang.cpp"
+#include "glslang/MachineIndependent/SpirvIntrinsics.cpp"
+#include "glslang/MachineIndependent/SymbolTable.cpp"
+#include "glslang/MachineIndependent/Versions.cpp"
+#include "glslang/MachineIndependent/attribute.cpp"
+#include "glslang/MachineIndependent/intermOut.cpp"
+#include "glslang/MachineIndependent/iomapper.cpp"
+#include "glslang/MachineIndependent/limits.cpp"
+#include "glslang/MachineIndependent/linkValidate.cpp"
+#include "glslang/MachineIndependent/parseConst.cpp"
+#include "glslang/MachineIndependent/preprocessor/Pp.cpp"
+#include "glslang/MachineIndependent/preprocessor/PpAtom.cpp"
+#include "glslang/MachineIndependent/preprocessor/PpContext.cpp"
+#include "glslang/MachineIndependent/preprocessor/PpScanner.cpp"
+#include "glslang/MachineIndependent/preprocessor/PpTokens.cpp"
+#include "glslang/MachineIndependent/propagateNoContraction.cpp"
+#include "glslang/MachineIndependent/reflection.cpp"
+
+#if OS_WINDOWS
+// NOTE(rnp): includes windows.h: i.e. it needs its own TU
+//#include "glslang/OSDependent/Windows/ossource.cpp"
+#else
+#include "glslang/OSDependent/Unix/ossource.cpp"
+#endif
+
+// NOTE(rnp): generated with some of the worst garbage ever taught in CS (yacc). must come last
+#include "glslang/MachineIndependent/glslang_tab.cpp"
diff --git a/external/glslang_local/glslang/build_info.h b/external/glslang_local/glslang/build_info.h
@@ -0,0 +1,12 @@
+// NOTE(rnp): completely garbage file that is used in exactly one place in the glslang
+// source code. For some reason they think this needs to be autogenerated instead of
+// specifying these on the command line at build time.
+#ifndef GLSLANG_BUILD_INFO
+#define GLSLANG_BUILD_INFO
+
+#define GLSLANG_VERSION_MAJOR 16
+#define GLSLANG_VERSION_MINOR 1
+#define GLSLANG_VERSION_PATCH 0
+#define GLSLANG_VERSION_FLAVOR ""
+
+#endif /* GLSLANG_BUILD_INFO */