work on compile command generation

This commit is contained in:
Hunter 2025-04-05 11:31:10 -04:00
parent 5070d51ad6
commit 17d0b7bb2b
3 changed files with 127 additions and 2 deletions

23
README.md Normal file
View file

@ -0,0 +1,23 @@
# Kettle
Kettle is a zero dependency build system for HLSL, and GLSL shaders.
## About
Kettle is a build system for shaders. It takes in a build script, compiles the shaders, and prints a "registry" to standard error
This registry file contains information on how to find the compiled shaders, relative to the build folder.
## Usage
```
# Pipe stdout to /dev/null and stderr to Shaders.krg
./kettle kettle.in > /dev/null 2> Shaders.krg
cat Shaders.krg
// Kettle shader registry file
$Format SPIRV
$ShaderList Vertex
$Shader HDR.bin
$Shader Shadows.bin
$Shader WorldShader.bin
$EndShaderList
```

BIN
kettle

Binary file not shown.

106
kettle.c
View file

@ -1,8 +1,10 @@
#include <dirent.h>
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/**
* Kettle - Build system for HLSL and GLSL shaders
@ -11,7 +13,11 @@
*/
/// Type of file
typedef enum { e_kettle_file_hlsl, e_kettle_file_glsl } kettle_file;
typedef enum {
e_kettle_file_hlsl,
e_kettle_file_glsl,
e_kettle_file_unknown
} kettle_file;
typedef enum { e_kettle_compiler_dxc, e_kettle_compiler_glslc } kettle_compiler;
@ -64,6 +70,16 @@ typedef struct {
char **pArgs;
} kettle_arg_list_t;
kettle_file kettle_get_file_type(const char *pFileName) {
if (strstr(pFileName, ".glsl") != NULL) {
return e_kettle_file_glsl;
} else if (strstr(pFileName, ".hlsl") != NULL) {
return e_kettle_file_hlsl;
} else {
return e_kettle_file_unknown;
}
}
void kettle_help() {
printf("Kettle Build System\n");
printf("Description: Compiles kettle information files and prints the result "
@ -111,6 +127,23 @@ char *kettle_pop_index(const char *pInput, int index) {
return newStr;
}
/**
* Concat the contents of pInput with pInput2, automatically reallocating the
* memory of pInput
* @param pInput Input string buffer
* @param pInput2 Input to append to pInput
*/
char *kettle_str_concat(char *pInput, const char *pInput2) {
int newSize = strlen(pInput) + strlen(pInput2) + 1; // +1 for null byte
newSize *= sizeof(char);
pInput = realloc(pInput, newSize);
strcat(pInput, pInput2);
return pInput;
}
kettle_arg_list_t kettle_make_arg_list(const char *pInput) {
int size = strlen(pInput);
@ -237,6 +270,30 @@ void kettle_handle_cmd(kettle_arg_list_t argList, kettle_input_t *pInput) {
printf("> Error: Cannot add shader when no compiler batch is active!\n");
exit(EXIT_FAILURE);
}
const char *pFileName = argList.pArgs[1];
kettle_file_info_t fileInf;
memset(&fileInf, 0, sizeof(fileInf));
fileInf.eFileType = kettle_get_file_type(pFileName);
if (fileInf.eFileType == e_kettle_file_unknown) {
printf("> Error: Cannot determine file type of path '%s'!\n", pFileName);
exit(EXIT_FAILURE);
}
fileInf.pFileName = pFileName;
// Allocate a new file
pInput->pCurrentCompilerBatch->numFiles++;
pInput->pCurrentCompilerBatch->pFiles = (kettle_file_info_t *)realloc(
pInput->pCurrentCompilerBatch->pFiles,
sizeof(kettle_file_info_t) * pInput->pCurrentCompilerBatch->numFiles);
pInput->pCurrentCompilerBatch
->pFiles[pInput->pCurrentCompilerBatch->numFiles - 1] = fileInf;
} else {
printf("> Warning: Cannot process unknown compiler command '%s'\n", pCmd);
}
@ -284,6 +341,22 @@ kettle_input_t kettle_read_input(const char *pInput) {
return input;
}
const char *kettle_hlsl_compile(const kettle_compiler_t *pCompiler,
const kettle_compiler_batch_t *pBatch,
const kettle_file_info_t *pFileInfo) {
char *pCommand =
(char *)malloc((strlen(pCompiler->pCompilerPath) + 1) * sizeof(char));
strcpy(pCommand, pCompiler->pCompilerPath);
// This might be a little slow, but we need to create the command
// We force the DXC compiler to output spirv, this could change later
pCommand = kettle_str_concat(pCommand, " -spirv");
return pCommand;
}
int main(int argc, char **argv) {
if (argc <= 1) {
kettle_help();
@ -294,5 +367,34 @@ int main(int argc, char **argv) {
printf("> Will process input file: %s\n", inFile);
kettle_read_input(inFile);
kettle_input_t inputProcessed = kettle_read_input(inFile);
printf("> Will process %i compiler batche(s)...\n",
inputProcessed.numCompilerBatches);
for (int i = 0; i < inputProcessed.numCompilerBatches; ++i) {
const kettle_compiler_batch_t batch = inputProcessed.pCompilerBatches[i];
printf("> Change directory to: %s\n", batch.pWorkingDir);
if (chdir(batch.pWorkingDir) != 0) {
printf("> Error: Failed to chdir into new directory: %s\n",
strerror(errno));
exit(EXIT_FAILURE);
}
for (int x = 0; x < batch.numFiles; ++x) {
kettle_file_info_t file = batch.pFiles[x];
kettle_compiler_t *pCompiler =
kettle_input_get_compiler(&inputProcessed, e_kettle_compiler_dxc);
if (pCompiler == NULL) {
printf("> Error: Failed to find compatible DXC compiler!\n");
exit(EXIT_FAILURE);
}
printf("> %s\n", kettle_hlsl_compile(pCompiler, &batch, &file));
}
}
}