This commit is contained in:
Hunter 2024-09-27 20:02:30 -04:00
commit 45c2bf9426
25 changed files with 1692 additions and 0 deletions

14
.gdb_history Normal file
View file

@ -0,0 +1,14 @@
q
r
up
up
up
up
up
up
up
up
up
up
bt
q

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
build/
.cache
vendor/

9
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,9 @@
{
"Lua.diagnostics.globals": [
"grbc_file",
"grbc_executable",
"grbc_want_version",
"grbc_build",
"grbc_load_platform"
]
}

11
CMakeLists.txt Normal file
View file

@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.28)
project(grbc)
add_subdirectory("vendor/sol2")
include_directories("include")
include_directories("vendor/sol2/include")
add_executable(grbc src/main.cc src/utils.cc src/file.cc src/target_exe.cc src/platform.cc src/ninja.cc src/generator.cc)
target_link_libraries(grbc sol2 lua)

33
HConfig Normal file
View file

@ -0,0 +1,33 @@
grbc_want_version("1.0")
grbc_load_platform("platform.hcfg")
local grbc_exe = grbc_executable(ExecutableConfig.new({
name = "grbc",
language_type = LanguageType.Cpp,
files = {
grbc_file("src/main.cc"),
grbc_file("src/file.cc"),
grbc_file("src/ninja.cc"),
grbc_file("src/platform.cc"),
grbc_file("src/target_exe.cc"),
grbc_file("src/utils.cc"),
grbc_file("src/generator.cc")
},
requirements = {
Package.new({
name = "lua",
compiler_flags = "",
linker_flags = "-llua -lm -ldl"
})
},
compile_flags = {},
linker_flags = {},
include_dirs = {
grbc_file("include"),
grbc_file("vendor/sol2/include")
}
}))
-- Output the final build script
grbc_build("ninja")

5
README.md Normal file
View file

@ -0,0 +1,5 @@
# GRBC
GRaphite Build Configurator
## About
GRBC is a predictable build system.

77
build.ninja Normal file
View file

@ -0,0 +1,77 @@
### GRBC BUILT-IN NINJA GENERATOR ###
## Default variables ##
builddir = build
## build_rule_compile_cc ##
cc_path = /usr/lib64/ccache/gcc
rule cc
command = $cc_path -MMD -MT $out -MF $out.d $p_cflags -c $in -o $out
description = Compiling C object $in
depfile = $out.d
deps = gcc
## build_rule_compile_cxx ##
cxx_path = /usr/lib64/ccache/g++
rule cxx
command = $cxx_path -MMD -MT $out -MF $out.d $p_cflags -c $in -o $out
description = Compiling C++ object $in
depfile = $out.d
deps = gcc
## build_rule_link_cc ##
rule link_cc
command = $cc_path $p_cflags -o $out $in $p_linker_flags
description = Linking C executables $out
## build_rule_link_cxx ##
rule link_cxx
command = $cxx_path $p_cflags -o $out $in $p_linker_flags
description = Linking C++ executables $out
## Compile: src/main.cc ##
build $builddir/src/main.o: cxx src/main.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/file.cc ##
build $builddir/src/file.o: cxx src/file.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/ninja.cc ##
build $builddir/src/ninja.o: cxx src/ninja.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/platform.cc ##
build $builddir/src/platform.o: cxx src/platform.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/target_exe.cc ##
build $builddir/src/target_exe.o: cxx src/target_exe.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/utils.cc ##
build $builddir/src/utils.o: cxx src/utils.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Compile: src/generator.cc ##
build $builddir/src/generator.o: cxx src/generator.cc
p_cflags = -Iinclude -Ivendor/sol2/include
## Link: grbc ##
build grbc: link_cxx $builddir/src/main.o $builddir/src/file.o $builddir/src/ninja.o $builddir/src/platform.o $builddir/src/target_exe.o $builddir/src/utils.o $builddir/src/generator.o
p_linker_flags = -llua -lm -ldl
p_cflags =

506
compile_commands.json Normal file
View file

@ -0,0 +1,506 @@
[
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/grbc.dir",
"output": "cmake_object_order_depends_target_grbc"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/main.cc.o -MF CMakeFiles/grbc.dir/src/main.cc.o.d -o CMakeFiles/grbc.dir/src/main.cc.o -c /home/interfiber/dev/grbc/src/main.cc",
"file": "/home/interfiber/dev/grbc/src/main.cc",
"output": "CMakeFiles/grbc.dir/src/main.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/utils.cc.o -MF CMakeFiles/grbc.dir/src/utils.cc.o.d -o CMakeFiles/grbc.dir/src/utils.cc.o -c /home/interfiber/dev/grbc/src/utils.cc",
"file": "/home/interfiber/dev/grbc/src/utils.cc",
"output": "CMakeFiles/grbc.dir/src/utils.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/file.cc.o -MF CMakeFiles/grbc.dir/src/file.cc.o.d -o CMakeFiles/grbc.dir/src/file.cc.o -c /home/interfiber/dev/grbc/src/file.cc",
"file": "/home/interfiber/dev/grbc/src/file.cc",
"output": "CMakeFiles/grbc.dir/src/file.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/target_exe.cc.o -MF CMakeFiles/grbc.dir/src/target_exe.cc.o.d -o CMakeFiles/grbc.dir/src/target_exe.cc.o -c /home/interfiber/dev/grbc/src/target_exe.cc",
"file": "/home/interfiber/dev/grbc/src/target_exe.cc",
"output": "CMakeFiles/grbc.dir/src/target_exe.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/platform.cc.o -MF CMakeFiles/grbc.dir/src/platform.cc.o.d -o CMakeFiles/grbc.dir/src/platform.cc.o -c /home/interfiber/dev/grbc/src/platform.cc",
"file": "/home/interfiber/dev/grbc/src/platform.cc",
"output": "CMakeFiles/grbc.dir/src/platform.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/ninja.cc.o -MF CMakeFiles/grbc.dir/src/ninja.cc.o.d -o CMakeFiles/grbc.dir/src/ninja.cc.o -c /home/interfiber/dev/grbc/src/ninja.cc",
"file": "/home/interfiber/dev/grbc/src/ninja.cc",
"output": "CMakeFiles/grbc.dir/src/ninja.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/lib64/ccache/g++ -I/home/interfiber/dev/grbc/include -isystem /home/interfiber/dev/grbc/vendor/sol2/include -g -MD -MT CMakeFiles/grbc.dir/src/generator.cc.o -MF CMakeFiles/grbc.dir/src/generator.cc.o.d -o CMakeFiles/grbc.dir/src/generator.cc.o -c /home/interfiber/dev/grbc/src/generator.cc",
"file": "/home/interfiber/dev/grbc/src/generator.cc",
"output": "CMakeFiles/grbc.dir/src/generator.cc.o"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": ": && /usr/lib64/ccache/g++ -g CMakeFiles/grbc.dir/src/main.cc.o CMakeFiles/grbc.dir/src/utils.cc.o CMakeFiles/grbc.dir/src/file.cc.o CMakeFiles/grbc.dir/src/target_exe.cc.o CMakeFiles/grbc.dir/src/platform.cc.o CMakeFiles/grbc.dir/src/ninja.cc.o CMakeFiles/grbc.dir/src/generator.cc.o -o grbc -llua && :",
"file": "CMakeFiles/grbc.dir/src/main.cc.o",
"output": "grbc"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/edit_cache.util",
"output": "edit_cache"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/rebuild_cache.util",
"output": "rebuild_cache"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build && /usr/bin/cmake -P cmake_install.cmake",
"file": "all",
"output": "CMakeFiles/install.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/install.util",
"output": "install"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build && /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake",
"file": "all",
"output": "CMakeFiles/install/local.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/install/local.util",
"output": "install/local"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build && /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake",
"file": "all",
"output": "CMakeFiles/install/strip.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "CMakeFiles/install/strip.util",
"output": "install/strip"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/Experimental",
"output": "vendor/sol2/Experimental"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/Nightly",
"output": "vendor/sol2/Nightly"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/Continuous",
"output": "vendor/sol2/Continuous"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyMemoryCheck",
"output": "vendor/sol2/NightlyMemoryCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyStart",
"output": "vendor/sol2/NightlyStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyUpdate",
"output": "vendor/sol2/NightlyUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyConfigure",
"output": "vendor/sol2/NightlyConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyBuild",
"output": "vendor/sol2/NightlyBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyTest",
"output": "vendor/sol2/NightlyTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyCoverage",
"output": "vendor/sol2/NightlyCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlyMemCheck",
"output": "vendor/sol2/NightlyMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/NightlySubmit",
"output": "vendor/sol2/NightlySubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalStart",
"output": "vendor/sol2/ExperimentalStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalUpdate",
"output": "vendor/sol2/ExperimentalUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalConfigure",
"output": "vendor/sol2/ExperimentalConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalBuild",
"output": "vendor/sol2/ExperimentalBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalTest",
"output": "vendor/sol2/ExperimentalTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalCoverage",
"output": "vendor/sol2/ExperimentalCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalMemCheck",
"output": "vendor/sol2/ExperimentalMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ExperimentalSubmit",
"output": "vendor/sol2/ExperimentalSubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousStart",
"output": "vendor/sol2/ContinuousStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousUpdate",
"output": "vendor/sol2/ContinuousUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousConfigure",
"output": "vendor/sol2/ContinuousConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousBuild",
"output": "vendor/sol2/ContinuousBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousTest",
"output": "vendor/sol2/ContinuousTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousCoverage",
"output": "vendor/sol2/ContinuousCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousMemCheck",
"output": "vendor/sol2/ContinuousMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/ContinuousSubmit",
"output": "vendor/sol2/ContinuousSubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/edit_cache.util",
"output": "vendor/sol2/edit_cache"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/rebuild_cache.util",
"output": "vendor/sol2/rebuild_cache"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build/vendor/sol2 && /usr/bin/cmake -P cmake_install.cmake",
"file": "vendor/sol2/all",
"output": "vendor/sol2/CMakeFiles/install.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/install.util",
"output": "vendor/sol2/install"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build/vendor/sol2 && /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake",
"file": "vendor/sol2/all",
"output": "vendor/sol2/CMakeFiles/install/local.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/install/local.util",
"output": "vendor/sol2/install/local"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "cd /home/interfiber/dev/grbc/build/vendor/sol2 && /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake",
"file": "vendor/sol2/all",
"output": "vendor/sol2/CMakeFiles/install/strip.util"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/CMakeFiles/install/strip.util",
"output": "vendor/sol2/install/strip"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/Continuous",
"output": "Continuous"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousBuild",
"output": "ContinuousBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousConfigure",
"output": "ContinuousConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousCoverage",
"output": "ContinuousCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousMemCheck",
"output": "ContinuousMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousStart",
"output": "ContinuousStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousSubmit",
"output": "ContinuousSubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousTest",
"output": "ContinuousTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ContinuousUpdate",
"output": "ContinuousUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/Experimental",
"output": "Experimental"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalBuild",
"output": "ExperimentalBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalConfigure",
"output": "ExperimentalConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalCoverage",
"output": "ExperimentalCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalMemCheck",
"output": "ExperimentalMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalStart",
"output": "ExperimentalStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalSubmit",
"output": "ExperimentalSubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalTest",
"output": "ExperimentalTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/ExperimentalUpdate",
"output": "ExperimentalUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/Nightly",
"output": "Nightly"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyBuild",
"output": "NightlyBuild"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyConfigure",
"output": "NightlyConfigure"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyCoverage",
"output": "NightlyCoverage"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyMemCheck",
"output": "NightlyMemCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyMemoryCheck",
"output": "NightlyMemoryCheck"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyStart",
"output": "NightlyStart"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlySubmit",
"output": "NightlySubmit"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyTest",
"output": "NightlyTest"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "vendor/sol2/NightlyUpdate",
"output": "NightlyUpdate"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "",
"file": "grbc",
"output": "all"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/bin/cmake -P /home/interfiber/dev/grbc/build/CMakeFiles/VerifyGlobs.cmake",
"file": "/home/interfiber/dev/grbc/build/CMakeFiles/VerifyGlobs.cmake_force",
"output": "/home/interfiber/dev/grbc/build/CMakeFiles/cmake.verify_globs"
},
{
"directory": "/home/interfiber/dev/grbc/build",
"command": "/usr/bin/cmake --regenerate-during-build -S/home/interfiber/dev/grbc -B/home/interfiber/dev/grbc/build",
"file": "/home/interfiber/dev/grbc/build/CMakeFiles/cmake.verify_globs",
"output": "build.ninja"
}
]

46
include/grbc/generator.h Normal file
View file

@ -0,0 +1,46 @@
#pragma once
#include "grbc/spec.h"
#include <string>
#include <vector>
struct GeneratorResult {
std::string file_name;
std::string content;
};
struct GeneratorCompileCommand {
LanguageType language_type;
std::string source_file;
std::string object_file;
std::string compiler_flags;
};
struct GeneratorLinkExecutableCommand {
std::vector<std::string> object_files;
std::string output_exe;
std::string linker_flags;
};
struct GeneratorTarget {
std::vector<GeneratorCompileCommand> compile_commands;
std::vector<GeneratorLinkExecutableCommand> link_executable_commands;
};
typedef GeneratorResult (*Generator_Run)();
struct Generator {
/// Name of the generator, used in grbc_build(...)
std::string name;
/// Function pointer for this generator
Generator_Run func;
};
/**
* Ninja generator main function
*/
GeneratorResult ninja_generator();

21
include/grbc/helpers.h Normal file
View file

@ -0,0 +1,21 @@
#pragma once
#include <string>
#include <vector>
#define log_msg(message) printf("> %s\n", message);
inline std::vector<std::string> split_string(std::string s,
std::string delimiter) {
size_t pos_start = 0, pos_end, delim_len = delimiter.length();
std::string token;
std::vector<std::string> res;
while ((pos_end = s.find(delimiter, pos_start)) != std::string::npos) {
token = s.substr(pos_start, pos_end - pos_start);
pos_start = pos_end + delim_len;
res.push_back(token);
}
res.push_back(s.substr(pos_start));
return res;
}

40
include/grbc/ninja.h Normal file
View file

@ -0,0 +1,40 @@
#pragma once
#include "grbc/generator.h"
#include <string>
/**
* Generate the build rule for compiling c++ files
*/
std::string ninja_build_rule_compile_cxx();
/**
* Generate the build rule for compiling c files
*/
std::string ninja_build_rule_compile_cc();
/**
* Generate the build rule for linking c++ object files
*/
std::string ninja_build_rule_link_cxx();
/**
* Generate the build rule for linking c object files
*/
std::string ninja_build_rule_link_cc();
/**
* Generate a line which builds the given file
*/
std::string
ninja_build_rule_compile_file(const GeneratorCompileCommand &compile_cmd);
/**
* Default variables such as builddir
*/
std::string ninja_build_default_variables();
/**
* Generate a line which links the given file
*/
std::string ninja_build_rule_link_exe_target(
const GeneratorLinkExecutableCommand &link_cmd);

150
include/grbc/spec.h Normal file
View file

@ -0,0 +1,150 @@
#pragma once
#include <sol/table.hpp>
#include <string>
#include <vector>
#define GRBC_VERSION "1.0"
enum LanguageType { LanguageType_CPP, LanguageType_C };
struct TargetInfo {
/// Name of the target
std::string name;
};
struct Package {
Package(const sol::table &table) {
name = table.get<std::string>("name");
compiler_flags = table.get<std::string>("compiler_flags");
linker_flags = table.get<std::string>("linker_flags");
}
std::string name;
std::string compiler_flags;
std::string linker_flags;
};
struct PackageConfig {
std::string name;
std::vector<Package> libraries;
std::vector<std::string> include_dirs;
std::vector<std::string> compile_flags;
std::vector<std::string> linker_flags;
};
enum PlatformType { PlatformType_Win32, PlatformType_Linux };
struct GlobalConfig {
/// Version of the grbc executable
std::string engine_version = GRBC_VERSION;
/// Architecture string
std::string architecture;
/// Build directory
std::string build_dir = "build";
/// System that we are targetting
PlatformType target;
/// Path to the target.hcfg
std::string target_config;
};
struct ExecutableConfig {
ExecutableConfig(const sol::table &table) {
name = table.get<std::string>("name");
files = table.get<std::vector<std::string>>("files");
requirements = table.get<std::vector<Package>>("requirements");
compile_flags = table.get<std::vector<std::string>>("compile_flags");
linker_flags = table.get<std::vector<std::string>>("linker_flags");
include_dirs = table.get<std::vector<std::string>>("include_dirs");
language_type = table.get<LanguageType>("language_type");
}
/// Name of the executable
std::string name;
/// Type of language
LanguageType language_type;
/// List of files to compile
std::vector<std::string> files;
/// Requirments of the executable
std::vector<Package> requirements;
/// Compiler flags
std::vector<std::string> compile_flags;
/// Linker flags
std::vector<std::string> linker_flags;
/// Include directories
std::vector<std::string> include_dirs;
};
struct Platform {
/// Name of the platform
std::string name;
/// C++ compiler
std::string cxx_compiler;
/// C compiler
std::string cc_compiler;
/// Is this platform 64-bit?
bool is_64bit = true;
/// Type of the platform
PlatformType platform_type;
};
/// Functions
void grbc_want_version(const std::string &version);
void grbc_exception(const std::string &exception_string);
GlobalConfig grbc_get_config();
std::string grbc_file(const std::string &file_path);
TargetInfo grbc_executable(const ExecutableConfig &executable_config);
void grbc_load_platform(const std::string &file_path);
void grbc_set_platform(const Platform &platform);
std::string grbc_find_compiler(const std::string &compiler_name);
void grbc_build(const std::string &generator_id);
std::string grbc_object_file(const std::string &file_path);
std::string grbc_replace_string(const std::string &string, char substring,
char replacement);
std::string
grbc_include_dirs_to_cflags(const std::vector<std::string> &include_dirs);
void grbc_log(const std::string &message);
bool grbc_is_win32();
bool grbc_is_linux();
PlatformType grbc_get_platform();
bool grbc_is_64bit();
bool grbc_is_32bit();

21
include/grbc/state.h Normal file
View file

@ -0,0 +1,21 @@
#pragma once
#include "grbc/generator.h"
#include "grbc/spec.h"
#include <sol/sol.hpp>
struct GState {
Platform current_platform;
sol::state lua;
std::vector<GeneratorTarget> targets;
std::vector<Generator> generators;
std::string ninja_output;
static GState& get() {
static GState state{};
return state;
}
};

12
platform.hcfg Normal file
View file

@ -0,0 +1,12 @@
-- Linux platform
local platform = Platform.new()
platform.name = "Linux64"
platform.cxx_compiler = grbc_find_compiler("g++")
platform.cc_compiler = grbc_find_compiler("gcc")
platform.is_64bit = true -- If set to false the compiler will need to produce 32bit code
platform.platform_type = PlatformType.Linux
return platform

165
spec/datatypes.md Normal file
View file

@ -0,0 +1,165 @@
# GRBC datatypes
## PackageConfig
```c++
struct PackageConfig {
/// Name of the package
string name;
/// List of libraries to include
Array<TargetInfo> libraries;
/// List of include directories
Array<path> include_dirs;
/// Extra compiler flags
Array<string> compile_flags;
/// Extra linker flags
Array<string> linker_flags;
};
```
## Package
```c++
struct Package {
/// Name of the package
string name;
/// Compiler flags used in this package
string compile_flags;
/// Linker flags used in this package
string linker_flags;
};
```
## LibraryConfig
```c++
struct LibraryConfig {
/// Name of the library
string name;
/// List of files to compile
Array<path> files;
/// Type of library
LibraryType lib_type;
/// Requirments of the library
Array<Package> requirements;
/// Compiler flags
Array<string> compile_flags;
/// Linker flags
Array<string> linker_flags;
/// Include directories
Array<string> include_dirs;
};
```
## LibraryType
```c++
enum LibraryType {
LibraryType_Shared,
LibraryType_Static
};
```
## ExecutableConfig
```c++
struct ExecutableConfig {
/// Name of the executable
string name;
/// Type of language
LanguageType language_type;
/// List of files to compile
Array<path> files;
/// Requirments of the executable
Array<Package> requirements;
/// Compiler flags
Array<string> compile_flags;
/// Linker flags
Array<string> linker_flags;
/// Include directories
Array<string> include_dirs;
};
```
## TargetInfo
```c++
struct TargetInfo {
/// Name of the target
string name;
/// List of compile commands for this target. should produce an executable, or library.
Array<string> compile_commands;
};
```
## PlatformType
```c++
enum PlatformType {
PlatformType_Win32,
PlatformType_Linux
};
```
## GlobalConfig
```c++
struct GlobalConfig {
/// Version of the grbc executable
string engine_version;
/// Architecture string
string architecture;
/// Platform to target (pulled from the target config)
PlatformTarget target;
/// Path to the target.hcfg
path target_config;
};
```
## OptionalFileType
```
enum OptionalFileType {
OFileType_IsWin32,
OFileType_IsUnix,
OFileType_IsLinux
};
```
## Platform
```c++
struct Platform {
/// Name of the platform
string name;
/// C++ compiler
string cxx_compiler;
/// C compiler
string cc_compiler;
/// Type of the platform
PlatformType platform_type;
};
```
## LanguageType
```c++
enum LanguageType {
LanguageType_CPP,
LanguageType_C
};
```

16
spec/ext.md Normal file
View file

@ -0,0 +1,16 @@
# GRBC extensions
Extensions can be loaded at runtime using grbc_ext(...), functions are then dumped into the runtime
## How extensions work
Extensions are built into the grbc executable, or can be compiled as a shared library and put into ```/usr/local/share/grbc/extensions```, ```C:\GRBC\Extensions\```, or ```~/.local/share/grbc/extensions```
## Extension list
* GRBC_EXT_pkg_config [NOSUPPORT]
* GRBC_EXT_multi_file [NOSUPPORT]
* GRBC_EXT_cmake [NOSUPPORT]
## GRBC_EXT_pkg_config
Pkg config support. UNIX only
## GRBC_EXT_multi_file
Multi file GRBC scripts, supported on all systems.

View file

@ -0,0 +1,23 @@
# GRBC_EXT_multi_file
Multiple file support
## Support
GRBC_EXT_multi_file is supported on all systems
## Example
```lua
-- No need to check since its always present!
grbc_ext("GRBC_EXT_multi_file")
-- Load a project from a folder which contains an HConfig file
grbc_multi_file_import("FusionVk")
-- Load a project from a file besides HConfig
grbc_multi_file_import("OtherProject.hcfg")
```
## Functions
### grbc_multi_file_import(file_path: String) -> Void
Import a project from the given folder

71
spec/functions.md Normal file
View file

@ -0,0 +1,71 @@
# GRBC functions
See [datatypes.md](./datatypes.md) for data types/structures
## [X] grbc_get_config() -> GlobalConfig
Get the config
## [X] grbc_want_version(version: String) -> Void
Assure grbc is running on ```version```
## [X] grbc_log(message: String) -> Void
Log ```message``` to the console
## grbc_is_win32() -> Boolean
Check if we are targeting win32
## grbc_is_linux() -> Boolean
Check if we are targeting a Linux system
## grbc_get_platform() -> PlatformType
Return the current platform
## grbc_is_64bit() -> Boolean
Check if we are targeting a 64bit system
## grbc_is_32bit() -> Boolean
Check if we are targeting a 32bit system
## [X] grbc_executable(executable_config: ExecutableConfig) -> TargetInfo
Create a new executable and add it to the build list
## grbc_library(library_config: LibraryConfig) -> TargetInfo
Create a new library and add it to the build list
## [X] grbc_create_package(package_config: PackageConfig) -> Package
Create a new package
## [X] grbc_file(file_path: String) -> Path
Used when listing source files, should perform pre-checks on the file and return its path
## grbc_file_optional(file_type: OptionalFileType, file_path: String) -> Path
If file_type is true then file_path is returned, otherwise a blank string
## grbc_has_ext(extension_name: String) -> Boolean
Check if the given extension is supported
## grbc_ext(extension_name: String) -> Void
Load the given extension into the script
## [X] grbc_exception(exception_string: String) -> Void
Throw an exception
## [X] grbc_set_platform(current_platform: Platform) -> Void
Set the current platform
## [X] grbc_load_platform(file_path: String) -> Void
Load a platform config file from file_path
## [X] grbc_find_compiler(compiler_name: String) -> String
Find the given executable in the users PATH, and return the full path
## [X] grbc_build(generator_id: String) -> Void
Output the final build script, using the given generator. "ninja" is the one provided by default
## [X] grbc_object_file(file_path: String) -> String
Convert the given file path to an object file path
## [X] grbc_replace_string(string: String, substring: Char, replacement: Char) -> String
Replace substring in string with replacement
## [X] grbc_include_dirs_to_cflags(include_dirs: Array<String>) -> String
Generate compiler flags to include the given directories

10
src/file.cc Normal file
View file

@ -0,0 +1,10 @@
#include "grbc/spec.h"
#include <filesystem>
std::string grbc_file(const std::string &file_path) {
if (!std::filesystem::exists(file_path)) {
grbc_exception("grbc_file gave path '" + file_path + "', which does not exist!");
}
return file_path;
}

22
src/generator.cc Normal file
View file

@ -0,0 +1,22 @@
#include "grbc/generator.h"
#include "grbc/helpers.h"
#include "grbc/spec.h"
#include "grbc/state.h"
#include <fstream>
void grbc_build(const std::string &generator_id) {
log_msg(("finding generator with name: " + generator_id).c_str());
for (auto &gen : GState::get().generators) {
if (gen.name == generator_id) {
GeneratorResult result = gen.func();
std::ofstream ofs(result.file_name);
ofs << result.content;
return;
}
}
grbc_exception("Could not find valid generator!");
}

93
src/main.cc Normal file
View file

@ -0,0 +1,93 @@
#include "grbc/state.h"
#define SOL_ALL_SAFETIES_ON 1
#include "grbc/helpers.h"
#include "grbc/spec.h"
#include <sol/sol.hpp>
int main() {
log_msg("opening lua libraries...");
auto &lua = GState::get().lua;
lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::string,
sol::lib::io, sol::lib::package, sol::lib::math);
log_msg("setting up runtime...");
// TargetInfo
lua.new_usertype<TargetInfo>("TargetInfo", "name", &TargetInfo::name);
// PackageConfig
lua.new_usertype<PackageConfig>(
"PackageConfig", "name", &PackageConfig::name, "libraries",
&PackageConfig::libraries, "include_dirs", &PackageConfig::include_dirs,
"compile_flags", &PackageConfig::compile_flags, "linker_flags",
&PackageConfig::linker_flags);
// GlobalConfig
lua.new_usertype<GlobalConfig>(
"GlobalConfig", "engine_version", &GlobalConfig::engine_version,
"architecture", &GlobalConfig::architecture, "target",
&GlobalConfig::target, "target_config", &GlobalConfig::target_config);
// Platform
lua.new_usertype<Platform>("Platform", "name", &Platform::name,
"cxx_compiler", &Platform::cxx_compiler,
"cc_compiler", &Platform::cc_compiler,
"platform_type", &Platform::platform_type, "is_64bit", &Platform::is_64bit);
// PlatformType
lua.new_enum<PlatformType>("PlatformType", {{"Win32", PlatformType_Win32},
{"Linux", PlatformType_Linux}});
// LanguageType
lua.new_enum<LanguageType>("LanguageType", {
{ "Cpp", LanguageType_CPP },
{ "C", LanguageType_C }
});
// ExecutableConfig
lua.new_usertype<ExecutableConfig>(
"ExecutableConfig", sol::constructors<ExecutableConfig(sol::table)>(),
"name", &ExecutableConfig::name, "files", &ExecutableConfig::files,
"requirments", &ExecutableConfig::requirements, "compile_flags",
&ExecutableConfig::compile_flags, "linker_flags",
&ExecutableConfig::linker_flags, "include_dirs",
&ExecutableConfig::include_dirs, "language_type", &ExecutableConfig::language_type);
// Package
lua.new_usertype<Package>("Package", sol::constructors<Package(sol::table)>(), "name", &Package::name, "compiler_flags",
&Package::compiler_flags, "linker_flags",
&Package::linker_flags);
lua.set("grbc_want_version", grbc_want_version);
lua.set("grbc_exception", grbc_exception);
lua.set("grbc_get_config", grbc_get_config);
lua.set("grbc_file", grbc_file);
lua.set("grbc_executable", grbc_executable);
lua.set("grbc_load_platform", grbc_load_platform);
lua.set("grbc_set_platform", grbc_set_platform);
lua.set("grbc_find_compiler", grbc_find_compiler);
lua.set("grbc_build", grbc_build);
lua.set("grbc_replace_string", grbc_replace_string);
lua.set("grbc_object_file", grbc_object_file);
lua.set("grbc_include_dirs_to_clflags", grbc_include_dirs_to_cflags);
lua.set("grbc_log", grbc_log);
lua.set("grbc_is_32bit", grbc_is_32bit);
lua.set("grbc_is_64bit", grbc_is_64bit);
lua.set("grbc_is_linux", grbc_is_linux);
lua.set("grbc_is_win32", grbc_is_win32);
lua.set("grbc_get_platform", grbc_get_platform);
// Load generators
GState::get().generators.push_back({
.name = "ninja",
.func = ninja_generator
});
log_msg("loading HConfig...");
lua.script_file("HConfig");
}

128
src/ninja.cc Normal file
View file

@ -0,0 +1,128 @@
#include "grbc/ninja.h"
#include "grbc/generator.h"
#include "grbc/helpers.h"
#include "grbc/spec.h"
#include "grbc/state.h"
std::string ninja_build_rule_compile_cxx() {
std::string compiler_path = GState::get().current_platform.cxx_compiler;
std::string result =
"## build_rule_compile_cxx ##\n\ncxx_path = " + compiler_path + "\n";
result += "rule cxx\n";
result += " command = $cxx_path -MMD -MT $out -MF $out.d $p_cflags -c $in "
"-o $out\n";
result += " description = Compiling C++ object $in\n";
result += " depfile = $out.d\n";
result += " deps = gcc\n";
result += "\n";
return result;
}
std::string ninja_build_rule_compile_cc() {
std::string compiler_path = GState::get().current_platform.cc_compiler;
std::string result =
"## build_rule_compile_cc ##\n\ncc_path = " + compiler_path + "\n";
result += "rule cc\n";
result += " command = $cc_path -MMD -MT $out -MF $out.d $p_cflags -c $in "
"-o $out\n";
result += " description = Compiling C object $in\n";
result += " depfile = $out.d\n";
result += " deps = gcc\n";
result += "\n";
return result;
}
std::string ninja_build_rule_link_cxx() {
std::string result = "## build_rule_link_cxx ##\n\n";
result += "rule link_cxx\n";
result += " command = $cxx_path $p_cflags -o $out $in $p_linker_flags\n";
result += " description = Linking C++ executables $out\n\n";
return result;
}
std::string ninja_build_rule_link_cc() {
std::string result = "## build_rule_link_cc ##\n\n";
result += "rule link_cc\n";
result += " command = $cc_path $p_cflags -o $out $in $p_linker_flags\n";
result += " description = Linking C executables $out\n\n";
return result;
}
std::string
ninja_build_rule_compile_file(const GeneratorCompileCommand &compile_cmd) {
std::string result = "## Compile: " + compile_cmd.source_file + " ##\n\n";
std::string compiler_rule = "cxx";
if (compile_cmd.language_type == LanguageType_C)
compiler_rule = "cc";
result += "build $builddir/" + compile_cmd.object_file + ": " +
compiler_rule + " " + compile_cmd.source_file + "\n";
result += " p_cflags = " + compile_cmd.compiler_flags + "\n\n";
return result;
}
std::string ninja_build_default_variables() {
std::string result = "## Default variables ##\n\n";
result += "builddir = " + grbc_get_config().build_dir + "\n";
result += "\n"; // keep as the last line
return result;
}
std::string ninja_build_rule_link_exe_target(
const GeneratorLinkExecutableCommand &link_cmd) {
std::string result = "## Link: " + link_cmd.output_exe + " ##\n\n";
std::string file_list;
for (auto &file : link_cmd.object_files) {
file_list += "$builddir/" + file + " ";
}
file_list.pop_back();
result += "build " + link_cmd.output_exe + ": link_cxx " + file_list + "\n";
result += " p_linker_flags = " + link_cmd.linker_flags + "\n";
result += " p_cflags = \n\n";
return result;
}
// Ninja generator entry
GeneratorResult ninja_generator() {
GeneratorResult result{};
log_msg("running ninja final generation...");
result.file_name = "build.ninja";
result.content += "### GRBC BUILT-IN NINJA GENERATOR ###\n\n";
result.content += ninja_build_default_variables();
result.content += ninja_build_rule_compile_cc();
result.content += ninja_build_rule_compile_cxx();
result.content += ninja_build_rule_link_cc();
result.content += ninja_build_rule_link_cxx();
for (auto &target : GState::get().targets) {
for (auto &compile_cmd : target.compile_commands) {
result.content += ninja_build_rule_compile_file(compile_cmd);
}
for (auto &link_cmd : target.link_executable_commands) {
result.content += ninja_build_rule_link_exe_target(link_cmd);
}
}
return result;
}

89
src/platform.cc Normal file
View file

@ -0,0 +1,89 @@
#include "grbc/helpers.h"
#include "grbc/spec.h"
#include "grbc/state.h"
#include <cstdlib>
#include <filesystem>
void grbc_set_platform(const Platform &platform) {
GState::get().current_platform = platform;
if (!std::filesystem::exists(platform.cxx_compiler)) {
grbc_exception("C++ compiler path does not exist at '" +
platform.cxx_compiler + "'");
}
if (!std::filesystem::exists(platform.cc_compiler)) {
grbc_exception("C compiler path does not exist at '" +
platform.cc_compiler + "'");
}
log_msg("--- Platform config: ---");
log_msg(("C++ compiler = " + platform.cxx_compiler).c_str());
log_msg(("C compiler = " + platform.cc_compiler).c_str());
}
void grbc_load_platform(const std::string &file_path) {
Platform platform = GState::get().lua.script_file(file_path);
grbc_set_platform(platform);
}
std::string grbc_find_compiler(const std::string &compiler_name) {
#if defined(WIN32)
std::string path_var = std::getenv("Path");
std::vector<std::string> paths = split_string(path_var, ";");
for (auto &current_path : paths) {
if (std::filesystem::exists(
std::filesystem::path(current_path) /
std::filesystem::path(compiler_name + ".exe"))) {
return std::filesystem::path(current_path) /
std::filesystem::path(compiler_name + ".exe");
}
}
grbc_exception("Failed to locate compiler with name '" + compiler_name + "'");
#elif defined(__linux__)
std::string path_var = std::getenv("PATH");
std::vector<std::string> paths = split_string(path_var, ":");
for (auto &current_path : paths) {
if (std::filesystem::exists(std::filesystem::path(current_path) /
std::filesystem::path(compiler_name))) {
return std::filesystem::path(current_path) /
std::filesystem::path(compiler_name);
}
}
grbc_exception("Failed to locate compiler with name '" + compiler_name + "'");
#else
#error Invalid platform for grbc_find_compiler
#endif
return "NoPlatform";
}
bool grbc_is_win32() {
return grbc_get_platform() == PlatformType_Win32;
}
bool grbc_is_linux() {
return grbc_get_platform() == PlatformType_Linux;
}
PlatformType grbc_get_platform() {
return GState::get().current_platform.platform_type;
}
bool grbc_is_64bit() {
return GState::get().current_platform.is_64bit;
}
bool grbc_is_32bit() {
return !grbc_is_64bit();
}

57
src/target_exe.cc Normal file
View file

@ -0,0 +1,57 @@
#include "grbc/generator.h"
#include "grbc/spec.h"
#include "grbc/state.h"
TargetInfo grbc_executable(const ExecutableConfig &executable_config) {
TargetInfo target_config{};
std::string exe_name = executable_config.name;
std::string compiler_args;
std::string linker_args;
for (auto &package : executable_config.requirements) {
compiler_args += package.compiler_flags + " ";
linker_args += package.linker_flags + " ";
}
for (auto &linker_arg : executable_config.linker_flags) {
linker_args += linker_arg + " ";
}
for (auto &compiler_arg : executable_config.compile_flags) {
compiler_args += compiler_arg + " ";
}
// Include directories
compiler_args += grbc_include_dirs_to_cflags(executable_config.include_dirs);
GeneratorTarget target{};
std::vector<std::string> object_files;
for (auto &src_file : executable_config.files) {
GeneratorCompileCommand compile_cmd{};
compile_cmd.source_file = src_file;
compile_cmd.object_file = grbc_object_file(src_file);
compile_cmd.compiler_flags = compiler_args;
compile_cmd.language_type = executable_config.language_type;
object_files.push_back(compile_cmd.object_file);
target.compile_commands.push_back(compile_cmd);
}
// Final executable link
GeneratorLinkExecutableCommand executable_link_cmd{};
executable_link_cmd.linker_flags = linker_args;
executable_link_cmd.object_files = object_files;
executable_link_cmd.output_exe = exe_name;
target.link_executable_commands.push_back(executable_link_cmd);
GState::get().targets.push_back(target);
return target_config;
}

70
src/utils.cc Normal file
View file

@ -0,0 +1,70 @@
#include "grbc/helpers.h"
#include "grbc/spec.h"
#include <cstdlib>
#include <ctime>
#include <filesystem>
void grbc_exception(const std::string &exception_string) {
printf("--- GRBC EXCEPTION: ---\n");
printf("Message: %s\n", exception_string.c_str());
printf("Timestamp: %ld", time(nullptr));
exit(EXIT_FAILURE);
}
void grbc_want_version(const std::string &version) {
if (grbc_get_config().engine_version != version) {
grbc_exception("Expected engine_version " + version + ", got " +
grbc_get_config().engine_version);
}
}
std::string grbc_object_file(const std::string &file_path) {
std::filesystem::path path(file_path);
path.replace_extension(".o");
std::string path_str = path.generic_string();
// Strip out stuff
std::string no_spaces = grbc_replace_string(path_str, ' ', '_');
return no_spaces;
}
std::string grbc_replace_string(const std::string &string, char substring,
char replacement) {
std::string res;
for (char cChar : string) {
if (cChar == substring) {
res += replacement;
} else {
res += cChar;
}
}
return res;
}
GlobalConfig grbc_get_config() {
static GlobalConfig cfg{};
return cfg;
}
std::string grbc_include_dirs_to_cflags(const std::vector<std::string> &include_dirs) {
std::string result;
for (auto &include_dir : include_dirs) {
result += "-I" + include_dir + " ";
}
result.pop_back(); // Remove trailing space
return result;
}
void grbc_log(const std::string &message) {
log_msg(message.c_str());
}