diff --git a/.gdb_history b/.gdb_history index 0084caf..9db2813 100644 --- a/.gdb_history +++ b/.gdb_history @@ -48,3 +48,7 @@ up up up q +q +q +r gen -compiler_profile release +q diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e91ebc..91eb28a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,12 @@ cmake_minimum_required(VERSION 3.28) project(grbc) +message(${CMAKE_CXX_FLAGS_RELEASE}) + 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 src/target_lib.cc src/package.cc src/ext.cc src/ext_pkg_config.cc src/task.cc src/ext_profiles.cc) -target_link_libraries(grbc sol2 lua) \ No newline at end of file +target_link_libraries(grbc sol2 lua) diff --git a/HConfig b/HConfig index 8b10ad9..c3e2330 100644 --- a/HConfig +++ b/HConfig @@ -2,8 +2,6 @@ grbc_want_version("1.0") grbc_ext("GRBC_EXT_pkg_config") grbc_ext("GRBC_EXT_profiles") -grbc_set_profile("release") - local grbc_extensions = grbc_library(LibraryConfig.new({ name = "libgrbc_extensions", language_type = LanguageType.Cpp, @@ -47,7 +45,8 @@ local grbc_lib = grbc_library(LibraryConfig.new({ grbc_file("src/target_lib.cc"), grbc_file("src/package.cc"), grbc_file("src/ext.cc"), - grbc_file("src/task.cc") + grbc_file("src/task.cc"), + grbc_file("src/options.cc") }, lib_type = LibraryType.Static, diff --git a/build.ninja b/build.ninja index dd58c6b..e3fbcec 100644 --- a/build.ninja +++ b/build.ninja @@ -1,5 +1,5 @@ ### GENERATED BY THE GRBC BUILT-IN NINJA GENERATOR ### -### GENERATED ON: 1727637831 ### +### GENERATED ON: 1727642123 ### ## Default variables ## @@ -44,12 +44,12 @@ rule archive ## Compile: src/ext_pkg_config.cc ## build $builddir/src/ext_pkg_config.o: cxx src/ext_pkg_config.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/ext_profiles.cc ## build $builddir/src/ext_profiles.o: cxx src/ext_profiles.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Link: libgrbc_extensions.a ## @@ -58,67 +58,72 @@ build $builddir/libgrbc_extensions.a: archive $builddir/src/ext_pkg_config.o $bu ## Compile: src/file.cc ## build $builddir/src/file.o: cxx src/file.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/ninja.cc ## build $builddir/src/ninja.o: cxx src/ninja.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/platform.cc ## build $builddir/src/platform.o: cxx src/platform.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/target_exe.cc ## build $builddir/src/target_exe.o: cxx src/target_exe.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/utils.cc ## build $builddir/src/utils.o: cxx src/utils.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/generator.cc ## build $builddir/src/generator.o: cxx src/generator.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/target_lib.cc ## build $builddir/src/target_lib.o: cxx src/target_lib.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/package.cc ## build $builddir/src/package.o: cxx src/package.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/ext.cc ## build $builddir/src/ext.o: cxx src/ext.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Compile: src/task.cc ## build $builddir/src/task.o: cxx src/task.cc - p_cflags = -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 + +## Compile: src/options.cc ## + +build $builddir/src/options.o: cxx src/options.cc + p_cflags = -Iinclude -Ivendor/sol2/include -g -O1 ## Link: libgrbc.a ## -build $builddir/libgrbc.a: archive $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 $builddir/src/target_lib.o $builddir/src/package.o $builddir/src/ext.o $builddir/src/task.o +build $builddir/libgrbc.a: archive $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 $builddir/src/target_lib.o $builddir/src/package.o $builddir/src/ext.o $builddir/src/task.o $builddir/src/options.o ## Compile: src/main.cc ## build $builddir/src/main.o: cxx src/main.cc - p_cflags = -Iinclude -Ivendor/sol2/include -Iinclude -Ivendor/sol2/include + p_cflags = -Iinclude -Ivendor/sol2/include -Iinclude -Ivendor/sol2/include -g -O1 ## Link: grbc ## build $builddir/grbc: link_cxx $builddir/src/main.o | $builddir/libgrbc.a $builddir/libgrbc_extensions.a - p_linker_flags = -llua -lm -ldl build/libgrbc.a build/libgrbc_extensions.a -O3 -Lbuild -Wl,-rpath,build:. - p_cflags = + p_linker_flags = -llua -lm -ldl build/libgrbc.a build/libgrbc_extensions.a -Lbuild -Wl,-rpath,build:. + p_cflags = -g -O1 ## clean ## rule clean_task diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..ec49990 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,110 @@ +[ + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/ext_pkg_config.o -MF build/src/ext_pkg_config.o.d -Iinclude -Ivendor/sol2/include -c src/ext_pkg_config.cc -o build/src/ext_pkg_config.o", + "file": "src/ext_pkg_config.cc", + "output": "build/src/ext_pkg_config.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/ext_profiles.o -MF build/src/ext_profiles.o.d -Iinclude -Ivendor/sol2/include -c src/ext_profiles.cc -o build/src/ext_profiles.o", + "file": "src/ext_profiles.cc", + "output": "build/src/ext_profiles.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "rm -f build/libgrbc_extensions.a; ar crs build/libgrbc_extensions.a build/src/ext_pkg_config.o build/src/ext_profiles.o", + "file": "build/src/ext_pkg_config.o", + "output": "build/libgrbc_extensions.a" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/file.o -MF build/src/file.o.d -Iinclude -Ivendor/sol2/include -c src/file.cc -o build/src/file.o", + "file": "src/file.cc", + "output": "build/src/file.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/ninja.o -MF build/src/ninja.o.d -Iinclude -Ivendor/sol2/include -c src/ninja.cc -o build/src/ninja.o", + "file": "src/ninja.cc", + "output": "build/src/ninja.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/platform.o -MF build/src/platform.o.d -Iinclude -Ivendor/sol2/include -c src/platform.cc -o build/src/platform.o", + "file": "src/platform.cc", + "output": "build/src/platform.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/target_exe.o -MF build/src/target_exe.o.d -Iinclude -Ivendor/sol2/include -c src/target_exe.cc -o build/src/target_exe.o", + "file": "src/target_exe.cc", + "output": "build/src/target_exe.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/utils.o -MF build/src/utils.o.d -Iinclude -Ivendor/sol2/include -c src/utils.cc -o build/src/utils.o", + "file": "src/utils.cc", + "output": "build/src/utils.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/generator.o -MF build/src/generator.o.d -Iinclude -Ivendor/sol2/include -c src/generator.cc -o build/src/generator.o", + "file": "src/generator.cc", + "output": "build/src/generator.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/target_lib.o -MF build/src/target_lib.o.d -Iinclude -Ivendor/sol2/include -c src/target_lib.cc -o build/src/target_lib.o", + "file": "src/target_lib.cc", + "output": "build/src/target_lib.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/package.o -MF build/src/package.o.d -Iinclude -Ivendor/sol2/include -c src/package.cc -o build/src/package.o", + "file": "src/package.cc", + "output": "build/src/package.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/ext.o -MF build/src/ext.o.d -Iinclude -Ivendor/sol2/include -c src/ext.cc -o build/src/ext.o", + "file": "src/ext.cc", + "output": "build/src/ext.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/task.o -MF build/src/task.o.d -Iinclude -Ivendor/sol2/include -c src/task.cc -o build/src/task.o", + "file": "src/task.cc", + "output": "build/src/task.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/options.o -MF build/src/options.o.d -Iinclude -Ivendor/sol2/include -c src/options.cc -o build/src/options.o", + "file": "src/options.cc", + "output": "build/src/options.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "rm -f build/libgrbc.a; ar crs build/libgrbc.a build/src/file.o build/src/ninja.o build/src/platform.o build/src/target_exe.o build/src/utils.o build/src/generator.o build/src/target_lib.o build/src/package.o build/src/ext.o build/src/task.o build/src/options.o", + "file": "build/src/file.o", + "output": "build/libgrbc.a" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -MMD -MT build/src/main.o -MF build/src/main.o.d -Iinclude -Ivendor/sol2/include -Iinclude -Ivendor/sol2/include -c src/main.cc -o build/src/main.o", + "file": "src/main.cc", + "output": "build/src/main.o" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "/usr/lib64/ccache/g++ -o build/grbc build/src/main.o -llua -lm -ldl build/libgrbc.a build/libgrbc_extensions.a -O3 -DNDEBUG -Lbuild -Wl,-rpath,build:. ", + "file": "build/src/main.o", + "output": "build/grbc" + }, + { + "directory": "/home/interfiber/dev/grbc", + "command": "", + "file": "build/libgrbc_extensions.a", + "output": "all" + } +] diff --git a/include/grbc/spec.h b/include/grbc/spec.h index 83fc198..1cb9e17 100644 --- a/include/grbc/spec.h +++ b/include/grbc/spec.h @@ -272,4 +272,8 @@ std::string grbc_platform_file(PlatformType platform_type, bool grbc_is_ext_loaded(const std::string &extension_name); -void grbc_task(const TaskConfig &config); \ No newline at end of file +void grbc_task(const TaskConfig &config); + +bool grbc_has_option(const std::string &option_name); + +std::string grbc_get_option(const std::string &option_name); \ No newline at end of file diff --git a/include/grbc/state.h b/include/grbc/state.h index fdf06d6..19df9fe 100644 --- a/include/grbc/state.h +++ b/include/grbc/state.h @@ -2,31 +2,34 @@ #include "grbc/ext.h" #include "grbc/generator.h" #include "grbc/spec.h" +#include #include #include #include #include struct GState { - Platform current_platform{}; - sol::state lua; + Platform current_platform{}; + sol::state lua; - std::vector tasks; - std::vector targets; - std::vector generators; + std::vector tasks; + std::vector targets; + std::vector generators; - std::unordered_map packages; + std::map options; - std::vector extensions; + std::unordered_map packages; - std::string global_compiler_flags = ""; - std::string global_linker_flags = " "; + std::vector extensions; - std::string ninja_output; + std::string global_compiler_flags = ""; + std::string global_linker_flags = " "; - static GState& get() { - static GState state{}; + std::string ninja_output; - return state; - } + static GState &get() { + static GState state{}; + + return state; + } }; \ No newline at end of file diff --git a/spec/functions.md b/spec/functions.md index 49e6450..7d7bda3 100644 --- a/spec/functions.md +++ b/spec/functions.md @@ -83,4 +83,10 @@ Get the given extension for a library file on the current platform Convert a PackageConfig into a Package ## [X] grbc_task(config: TaskConfig) -> Void -Create a task and add it to the build script \ No newline at end of file +Create a task and add it to the build script + +## [X] grbc_has_option(option_name: String) -> Boolean +Check if the given option was set on the command line + +## [X] grbc_get_option(option_name: String) -> String +Get the value of an option \ No newline at end of file diff --git a/src/ext_profiles.cc b/src/ext_profiles.cc index eb9c86d..a9477bb 100644 --- a/src/ext_profiles.cc +++ b/src/ext_profiles.cc @@ -51,17 +51,21 @@ void grbc_profiles_init(sol::state &lua) { Profile release_with_debug_symbols_profile{}; release_with_debug_symbols_profile.name = "release_with_debug_symbols"; - release_with_debug_symbols_profile.compiler_flags = {"-g", "-O3"}; + release_with_debug_symbols_profile.compiler_flags = {"-g", "-O3", "-DNDEBUG"}; Profile release_profile{}; release_profile.name = "release"; - release_profile.linker_flags = {"-O3"}; + release_profile.linker_flags = {"-O3", "-DNDEBUG"}; EXT_profiles_get_profiles().push_back(debug_profile); EXT_profiles_get_profiles().push_back(release_with_debug_symbols_profile); EXT_profiles_get_profiles().push_back(release_profile); - EXT_profiles_set("debug"); // Always use debug as the default profile + if (!grbc_has_option("compiler_profile")) { + EXT_profiles_set("debug"); // Always use debug as the default profile + } else { + EXT_profiles_set(grbc_get_option("compiler_profile")); + } lua.set("grbc_set_profile", EXT_profiles_set); diff --git a/src/main.cc b/src/main.cc index 8690e95..fbf2786 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,155 +1,196 @@ #include "grbc/ext_pkg_config.h" #include "grbc/ext_profiles.h" -#include "grbc/state.h" -#include -#include -#define SOL_ALL_SAFETIES_ON 1 - #include "grbc/helpers.h" #include "grbc/spec.h" +#include "grbc/state.h" +#include +#include +#include #include +#include -int main() { - log_msg("opening lua libraries..."); +void print_help() { + printf("GRBC - Graphite Build Configurator\n"); + printf("Author: Interfiber \n"); + printf("Commands:\n"); + printf(" gen - Generate build configuration from HConfig\n"); +} - auto &lua = GState::get().lua; +int main(int argc, char **argv) { + if (argc == 1) { + print_help(); - lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::string, - sol::lib::io, sol::lib::package, sol::lib::math); + std::exit(EXIT_FAILURE); + } - log_msg("setting up runtime..."); + std::map options; - // TargetInfo - lua.new_usertype("TargetInfo", "name", &TargetInfo::name); + for (int i = 0; i < argc; i++) { + std::string arg = argv[i]; - // PackageConfig - lua.new_usertype( - "PackageConfig", sol::constructors(), "name", - &PackageConfig::name, "libraries", &PackageConfig::libraries, - "include_dirs", &PackageConfig::include_dirs, "compile_flags", - &PackageConfig::compile_flags, "linker_flags", - &PackageConfig::linker_flags); + if (arg[0] == '-' && i + 1 < argc) { + if (std::string(argv[i + 1]).empty()) continue; - // GlobalConfig - lua.new_usertype("GlobalConfig", "engine_version", - &GlobalConfig::engine_version, "architecture", - &GlobalConfig::architecture, "target_config", - &GlobalConfig::platform_config); + arg.erase(arg.begin()); - // Platform - lua.new_usertype("Platform", "name", &Platform::name, - "cxx_compiler", &Platform::cxx_compiler, - "cc_compiler", &Platform::cc_compiler, - "platform_type", &Platform::platform_type, - "is_64bit", &Platform::is_64bit); + options.insert({ arg, std::string(argv[i + 1]) }); - // PlatformType - lua.new_enum("PlatformType", {{"Win32", PlatformType_Win32}, - {"Linux", PlatformType_Linux}}); + log_msg(("found option: " + arg + " = " + std::string(argv[i + 1])).c_str()); + } + } - // LanguageType - lua.new_enum( - "LanguageType", {{"Cpp", LanguageType_CPP}, {"C", LanguageType_C}}); + GState::get().options = options; - // LibraryType - lua.new_enum("LibraryType", {{"Static", LibraryType_Static}, - {"Shared", LibraryType_Shared}}); + if (std::string(argv[1]) == "gen") { + log_msg("running grbc generator..."); - // ExecutableConfig - lua.new_usertype( - "ExecutableConfig", sol::constructors(), - "name", &ExecutableConfig::name, "files", &ExecutableConfig::files, - "requirements", &ExecutableConfig::requirements, "compile_flags", - &ExecutableConfig::compile_flags, "linker_flags", - &ExecutableConfig::linker_flags, "include_dirs", - &ExecutableConfig::include_dirs, "language_type", - &ExecutableConfig::language_type); + log_msg("opening lua libraries..."); - // LibraryConfig - lua.new_usertype( - "LibraryConfig", sol::constructors(), "name", - &LibraryConfig::name, "files", &LibraryConfig::files, "requirements", - &LibraryConfig::requirements, "compile_flags", - &LibraryConfig::compile_flags, "linker_flags", - &LibraryConfig::linker_flags, "include_dirs", - &LibraryConfig::include_dirs, "language_type", - &LibraryConfig::language_type, "lib_type", &LibraryConfig::lib_type, - "package_config", &LibraryConfig::package_config); + auto &lua = GState::get().lua; - // Package - lua.new_usertype("Package", sol::constructors(), - "name", &Package::name, "compiler_flags", - &Package::compiler_flags, "linker_flags", - &Package::linker_flags); + lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::string, + sol::lib::io, sol::lib::package, sol::lib::math); - // TaskConfig - lua.new_usertype( - "TaskConfig", sol::constructors(), "name", - &TaskConfig::name, "task_id", &TaskConfig::task_id, "shell_script", - &TaskConfig::shell_script); + log_msg("setting up runtime..."); - 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_library", grbc_library); - 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); - lua.set("grbc_compiler_define", grbc_compiler_define); - lua.set("grbc_get_lib_extension", grbc_get_lib_extension); - lua.set("grbc_bake_package_config", grbc_bake_package_config); - lua.set("grbc_pkg", grbc_pkg); - lua.set("grbc_ext", grbc_ext); - lua.set("grbc_has_ext", grbc_has_ext); - lua.set("grbc_platform_file", grbc_platform_file); - lua.set("grbc_is_ext_loaded", grbc_is_ext_loaded); - lua.set("grbc_task", grbc_task); + // TargetInfo + lua.new_usertype("TargetInfo", "name", &TargetInfo::name); - // Load generators + // PackageConfig + lua.new_usertype( + "PackageConfig", sol::constructors(), "name", + &PackageConfig::name, "libraries", &PackageConfig::libraries, + "include_dirs", &PackageConfig::include_dirs, "compile_flags", + &PackageConfig::compile_flags, "linker_flags", + &PackageConfig::linker_flags); - GState::get().generators.push_back( - {.name = "ninja", .func = ninja_generator}); + // GlobalConfig + lua.new_usertype( + "GlobalConfig", "engine_version", &GlobalConfig::engine_version, + "architecture", &GlobalConfig::architecture, "target_config", + &GlobalConfig::platform_config); - // Load default extensions + // Platform + lua.new_usertype("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", {{"Win32", PlatformType_Win32}, + {"Linux", PlatformType_Linux}}); + + // LanguageType + lua.new_enum( + "LanguageType", {{"Cpp", LanguageType_CPP}, {"C", LanguageType_C}}); + + // LibraryType + lua.new_enum("LibraryType", {{"Static", LibraryType_Static}, + {"Shared", LibraryType_Shared}}); + + // ExecutableConfig + lua.new_usertype( + "ExecutableConfig", sol::constructors(), + "name", &ExecutableConfig::name, "files", &ExecutableConfig::files, + "requirements", &ExecutableConfig::requirements, "compile_flags", + &ExecutableConfig::compile_flags, "linker_flags", + &ExecutableConfig::linker_flags, "include_dirs", + &ExecutableConfig::include_dirs, "language_type", + &ExecutableConfig::language_type); + + // LibraryConfig + lua.new_usertype( + "LibraryConfig", sol::constructors(), "name", + &LibraryConfig::name, "files", &LibraryConfig::files, "requirements", + &LibraryConfig::requirements, "compile_flags", + &LibraryConfig::compile_flags, "linker_flags", + &LibraryConfig::linker_flags, "include_dirs", + &LibraryConfig::include_dirs, "language_type", + &LibraryConfig::language_type, "lib_type", &LibraryConfig::lib_type, + "package_config", &LibraryConfig::package_config); + + // Package + lua.new_usertype( + "Package", sol::constructors(), "name", + &Package::name, "compiler_flags", &Package::compiler_flags, + "linker_flags", &Package::linker_flags); + + // TaskConfig + lua.new_usertype( + "TaskConfig", sol::constructors(), "name", + &TaskConfig::name, "task_id", &TaskConfig::task_id, "shell_script", + &TaskConfig::shell_script); + + 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_library", grbc_library); + 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); + lua.set("grbc_compiler_define", grbc_compiler_define); + lua.set("grbc_get_lib_extension", grbc_get_lib_extension); + lua.set("grbc_bake_package_config", grbc_bake_package_config); + lua.set("grbc_pkg", grbc_pkg); + lua.set("grbc_ext", grbc_ext); + lua.set("grbc_has_ext", grbc_has_ext); + lua.set("grbc_platform_file", grbc_platform_file); + lua.set("grbc_is_ext_loaded", grbc_is_ext_loaded); + lua.set("grbc_task", grbc_task); + lua.set("grbc_has_option", grbc_has_option); + lua.set("grbc_get_option", grbc_get_option); + + // Load generators + + GState::get().generators.push_back( + {.name = "ninja", .func = ninja_generator}); + + // Load default extensions #if !defined(_WIN32) - grbc_register_ext(grbc_pkg_config()); + grbc_register_ext(grbc_pkg_config()); #endif - grbc_register_ext(grbc_profiles()); + grbc_register_ext(grbc_profiles()); - // Detect platform - log_msg("autodetecting platform..."); + // Detect platform + log_msg("autodetecting platform..."); #if defined(WIN32) - GState::get().current_platform.platform_type = PlatformType_Win32; - GState::get().current_platform.name = "Windows"; + GState::get().current_platform.platform_type = PlatformType_Win32; + GState::get().current_platform.name = "Windows"; #elif defined(__linux__) - GState::get().current_platform.platform_type = PlatformType_Linux; - GState::get().current_platform.name = "Linux"; + GState::get().current_platform.platform_type = PlatformType_Linux; + GState::get().current_platform.name = "Linux"; #endif #if defined(ENVIRONMENT32) - GState::get().current_platform.is_64bit = false; + GState::get().current_platform.is_64bit = false; #endif - // Default compiler is g++ - GState::get().current_platform.cc_compiler = grbc_find_compiler("gcc"); - GState::get().current_platform.cxx_compiler = grbc_find_compiler("g++"); + // Default compiler is g++ + GState::get().current_platform.cc_compiler = grbc_find_compiler("gcc"); + GState::get().current_platform.cxx_compiler = grbc_find_compiler("g++"); - log_msg("loading HConfig..."); + log_msg("loading HConfig..."); - lua.script_file("HConfig"); + lua.script_file("HConfig"); + } else { + printf("unknown command\n"); + + std::exit(EXIT_FAILURE); + } } \ No newline at end of file diff --git a/src/options.cc b/src/options.cc new file mode 100644 index 0000000..17351ec --- /dev/null +++ b/src/options.cc @@ -0,0 +1,22 @@ +#include "grbc/spec.h" +#include "grbc/state.h" + +bool grbc_has_option(const std::string &option_name) { + for (auto &k : GState::get().options) { + if (k.first == option_name) + return true; + } + + return false; +} + +std::string grbc_get_option(const std::string &option_name) { + for (auto &k : GState::get().options) { + if (k.first == option_name) + return k.second; + } + + grbc_exception("Failed to find option with name '" + option_name + "'"); + + return ""; +} \ No newline at end of file diff --git a/src/target_lib.cc b/src/target_lib.cc index a3fb820..adc9285 100644 --- a/src/target_lib.cc +++ b/src/target_lib.cc @@ -5,6 +5,10 @@ TargetInfo grbc_library(const LibraryConfig &library_config) { TargetInfo target_config{}; + if (library_config.name[0] != 'l' && library_config.name[1] != 'i' && library_config.name[2] != 'b') { + grbc_exception("library names are mandated to start with 'lib'"); + } + std::string lib_name = library_config.name; lib_name += grbc_get_lib_extension(library_config.lib_type);