aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-26 22:56:32 +0100
committergingerBill <bill@gingerbill.org>2021-04-26 22:56:32 +0100
commit06e0da97b7a7fbda942141818ac2fd34e6dde6eb (patch)
treeb6dbad76227d32129f81eb55c755d6fb0673599e /src
parent04535b291310ff53c19fdc96817f2a651b540907 (diff)
Implement `ODIN_ROOT` #913
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp33
-rw-r--r--src/main.cpp22
2 files changed, 52 insertions, 3 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 5fbf75126..82ed24f83 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -450,8 +450,35 @@ bool find_library_collection_path(String name, String *path) {
String const WIN32_SEPARATOR_STRING = {cast(u8 *)"\\", 1};
String const NIX_SEPARATOR_STRING = {cast(u8 *)"/", 1};
-#if defined(GB_SYSTEM_WINDOWS)
+
+String internal_odin_root_dir(void);
String odin_root_dir(void) {
+ if (global_module_path_set) {
+ return global_module_path;
+ }
+
+ gbAllocator a = heap_allocator();
+ char const *found = gb_get_env("ODIN_ROOT", a);
+ if (found) {
+ String path = path_to_full_path(a, make_string_c(found));
+ if (path[path.len-1] != '/' && path[path.len-1] != '\\') {
+ #if defined(GB_SYSTEM_WINDOWS)
+ path = concatenate_strings(a, path, WIN32_SEPARATOR_STRING);
+ #else
+ path = concatenate_strings(a, path, NIX_SEPARATOR_STRING);
+ #endif
+ }
+
+ global_module_path = path;
+ global_module_path_set = true;
+ return global_module_path;
+ }
+ return internal_odin_root_dir();
+}
+
+
+#if defined(GB_SYSTEM_WINDOWS)
+String internal_odin_root_dir(void) {
String path = global_module_path;
isize len, i;
gbTempArenaMemory tmp;
@@ -510,7 +537,7 @@ String odin_root_dir(void) {
String path_to_fullpath(gbAllocator a, String s);
-String odin_root_dir(void) {
+String internal_odin_root_dir(void) {
String path = global_module_path;
isize len, i;
gbTempArenaMemory tmp;
@@ -568,7 +595,7 @@ String odin_root_dir(void) {
String path_to_fullpath(gbAllocator a, String s);
-String odin_root_dir(void) {
+String internal_odin_root_dir(void) {
String path = global_module_path;
isize len, i;
gbTempArenaMemory tmp;
diff --git a/src/main.cpp b/src/main.cpp
index fbce4838c..251616b56 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1916,6 +1916,24 @@ void print_show_unused(Checker *c) {
print_usage_line(0, "");
}
+bool check_env(void) {
+ gbAllocator a = heap_allocator();
+ char const *odin_root = gb_get_env("ODIN_ROOT", a);
+ defer (gb_free(a, cast(void *)odin_root));
+ if (odin_root) {
+ if (!gb_file_exists(odin_root)) {
+ gb_printf_err("Invalid ODIN_ROOT, directory does not exist, got %s\n", odin_root);
+ return false;
+ }
+ String path = make_string_c(odin_root);
+ if (!path_is_directory(path)) {
+ gb_printf_err("Invalid ODIN_ROOT, expected a directory, got %s\n", odin_root);
+ return false;
+ }
+ }
+ return true;
+}
+
int main(int arg_count, char const **arg_ptr) {
if (arg_count < 2) {
@@ -1939,6 +1957,10 @@ int main(int arg_count, char const **arg_ptr) {
init_keyword_hash_table();
global_big_int_init();
+ if (!check_env()) {
+ return 1;
+ }
+
array_init(&library_collections, heap_allocator());
// NOTE(bill): 'core' cannot be (re)defined by the user
add_library_collection(str_lit("core"), get_fullpath_relative(heap_allocator(), odin_root_dir(), str_lit("core")));