From c067b90403ab8493daa0bf5867b2bd92319feea5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 26 May 2018 23:12:55 +0100 Subject: Add basic package support (no IR support yet) --- src/build_settings.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 3 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index c58eb9ed8..13776dedb 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1,3 +1,38 @@ +enum TargetOsKind { + TargetOs_Invalid, + + TargetOs_windows, + TargetOs_osx, + TargetOs_linux, + TargetOs_essence, + + TargetOs_COUNT, +}; + +enum TargetArchKind { + TargetArch_Invalid, + + TargetArch_amd64, + TargetArch_x64, + + TargetArch_COUNT, +}; + +String target_os_names[TargetOs_COUNT] = { + str_lit(""), + str_lit("windows"), + str_lit("osx"), + str_lit("linux"), + str_lit("essence"), +}; + +String target_arch_names[TargetArch_COUNT] = { + str_lit(""), + str_lit("amd64"), + str_lit("x86"), +}; + + // This stores the information for the specify architecture of this build struct BuildContext { // Constants @@ -15,6 +50,9 @@ struct BuildContext { String command; + TargetOsKind target_os; + TargetArchKind target_arch; + String out_filepath; String resource_filepath; bool has_resource; @@ -37,6 +75,72 @@ struct BuildContext { gb_global BuildContext build_context = {0}; +TargetOsKind get_target_os_from_string(String str) { + for (isize i = 0; i < TargetOs_COUNT; i++) { + if (target_os_names[i] == str) { + return cast(TargetOsKind)i; + } + } + return TargetOs_Invalid; +} + +TargetArchKind get_target_arch_from_string(String str) { + for (isize i = 0; i < TargetArch_COUNT; i++) { + if (target_os_names[i] == str) { + return cast(TargetArchKind)i; + } + } + return TargetArch_Invalid; +} + +bool is_excluded_target_filename(String name) { + String const ext = str_lit(".odin"); + GB_ASSERT(string_ends_with(name, ext)); + name = substring(name, 0, name.len-ext.len); + + String str1 = {}; + String str2 = {}; + isize n = 0; + + str1 = name; + n = str1.len; + for (isize i = str1.len-1; i >= 0 && str1[i] != '_'; i--) { + n -= 1; + } + str1 = substring(str1, n, str1.len); + + str2 = str1; + n = str2.len; + for (isize i = str2.len-1; i >= 0 && str2[i] != '_'; i--) { + n -= 1; + } + str2 = substring(str2, n, str2.len); + + if (str1 == name) { + return false; + } + + + TargetOsKind os1 = get_target_os_from_string(str1); + TargetArchKind arch1 = get_target_arch_from_string(str1); + TargetOsKind os2 = get_target_os_from_string(str2); + TargetArchKind arch2 = get_target_arch_from_string(str2); + + if (arch1 != TargetArch_Invalid && os2 != TargetOs_Invalid) { + return arch1 != build_context.target_arch || os2 != build_context.target_os; + } else if (arch1 != TargetArch_Invalid && os1 != TargetOs_Invalid) { + return arch2 != build_context.target_arch || os1 != build_context.target_os; + } else if (os1 != TargetOs_Invalid) { + return os1 != build_context.target_os; + } else if (arch1 != TargetArch_Invalid) { + return arch1 != build_context.target_arch; + } + + return false; +} + + + struct LibraryCollections { String name; String path; @@ -327,11 +431,14 @@ void init_build_context(void) { bc->ODIN_ROOT = odin_root_dir(); #if defined(GB_SYSTEM_WINDOWS) - bc->ODIN_OS = str_lit("windows"); + bc->ODIN_OS = str_lit("windows"); + bc->target_os = TargetOs_windows; #elif defined(GB_SYSTEM_OSX) - bc->ODIN_OS = str_lit("osx"); + bc->ODIN_OS = str_lit("osx"); + bc->target_os = TargetOs_osx; #else - bc->ODIN_OS = str_lit("linux"); + bc->ODIN_OS = str_lit("linux"); + bc->target_os = TargetOs_linux; #endif if (cross_compile_target.len) { @@ -340,8 +447,10 @@ void init_build_context(void) { #if defined(GB_ARCH_64_BIT) bc->ODIN_ARCH = str_lit("amd64"); + bc->target_arch = TargetArch_amd64; #else bc->ODIN_ARCH = str_lit("x86"); + bc->target_arch = TargetArch_x86; #endif { -- cgit v1.2.3