work on compile command generation
This commit is contained in:
parent
5070d51ad6
commit
17d0b7bb2b
23
README.md
Normal file
23
README.md
Normal 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
|
||||||
|
```
|
106
kettle.c
106
kettle.c
|
@ -1,8 +1,10 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kettle - Build system for HLSL and GLSL shaders
|
* Kettle - Build system for HLSL and GLSL shaders
|
||||||
|
@ -11,7 +13,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/// Type of file
|
/// 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;
|
typedef enum { e_kettle_compiler_dxc, e_kettle_compiler_glslc } kettle_compiler;
|
||||||
|
|
||||||
|
@ -64,6 +70,16 @@ typedef struct {
|
||||||
char **pArgs;
|
char **pArgs;
|
||||||
} kettle_arg_list_t;
|
} 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() {
|
void kettle_help() {
|
||||||
printf("Kettle Build System\n");
|
printf("Kettle Build System\n");
|
||||||
printf("Description: Compiles kettle information files and prints the result "
|
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;
|
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) {
|
kettle_arg_list_t kettle_make_arg_list(const char *pInput) {
|
||||||
int size = strlen(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");
|
printf("> Error: Cannot add shader when no compiler batch is active!\n");
|
||||||
exit(EXIT_FAILURE);
|
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 {
|
} else {
|
||||||
printf("> Warning: Cannot process unknown compiler command '%s'\n", pCmd);
|
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;
|
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) {
|
int main(int argc, char **argv) {
|
||||||
if (argc <= 1) {
|
if (argc <= 1) {
|
||||||
kettle_help();
|
kettle_help();
|
||||||
|
@ -294,5 +367,34 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
printf("> Will process input file: %s\n", inFile);
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue