Browse Source

Implement `ODIN_ROOT` #913

gingerBill 4 years ago
parent
commit
06e0da97b7
2 changed files with 52 additions and 3 deletions
  1. 30 3
      src/build_settings.cpp
  2. 22 0
      src/main.cpp

+ 30 - 3
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;

+ 22 - 0
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")));