From cbcf94669e138a1afcfc8d581257e81b138fbdb9 Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Mon, 24 Apr 2023 12:57:34 +0100 Subject: Add get_current_directory() --- src/path.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index 49a2d4a4f..baae94670 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -1,6 +1,8 @@ /* Path handling utilities. */ +#include + gb_internal String remove_extension_from_path(String const &s) { if (s.len != 0 && s.text[s.len-1] == '.') { return s; @@ -25,6 +27,16 @@ gb_internal String remove_directory_from_path(String const &s) { return substring(s, s.len-len, s.len); } +// NOTE(Mark Naughton): getcwd as String +gb_internal String get_current_directory(void) { + gbAllocator a = heap_allocator(); + + char cwd[256]; + getcwd(cwd, 256); + + return make_string_c(cwd); +} + gb_internal bool path_is_directory(String path); gb_internal String directory_from_path(String const &s) { -- cgit v1.2.3 From 67b6a8ee89f5138f3e10d1d40111ac755ba34149 Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Mon, 24 Apr 2023 14:26:53 +0100 Subject: Add Windows equivalent of get_current_directory --- src/path.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index baae94670..414a90c39 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -1,7 +1,9 @@ /* Path handling utilities. */ +#if !defined(GB_SYSTEM_WINDOWS) #include +#endif gb_internal String remove_extension_from_path(String const &s) { if (s.len != 0 && s.text[s.len-1] == '.') { @@ -27,7 +29,9 @@ gb_internal String remove_directory_from_path(String const &s) { return substring(s, s.len-len, s.len); } + // NOTE(Mark Naughton): getcwd as String +#if !defined(GB_SYSTEM_WINDOWS) gb_internal String get_current_directory(void) { gbAllocator a = heap_allocator(); @@ -37,6 +41,17 @@ gb_internal String get_current_directory(void) { return make_string_c(cwd); } +#else +gb_internal String get_current_directory(void) { + gbAllocator a = heap_allocator(); + + wchar_t cwd[256]; + GetCurrentDirectoryW(256, cwd); + + return make_string_c(cwd); +} +#endif + gb_internal bool path_is_directory(String path); gb_internal String directory_from_path(String const &s) { -- cgit v1.2.3 From 5151403aaa500fc7a60c5f234f53d46d0b446b03 Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Tue, 25 Apr 2023 12:08:15 +0100 Subject: Fix Windows version of get_current_directory --- src/path.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index 414a90c39..7664380a4 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -33,8 +33,6 @@ gb_internal String remove_directory_from_path(String const &s) { // NOTE(Mark Naughton): getcwd as String #if !defined(GB_SYSTEM_WINDOWS) gb_internal String get_current_directory(void) { - gbAllocator a = heap_allocator(); - char cwd[256]; getcwd(cwd, 256); @@ -48,7 +46,9 @@ gb_internal String get_current_directory(void) { wchar_t cwd[256]; GetCurrentDirectoryW(256, cwd); - return make_string_c(cwd); + String16 wstr = make_string16_c(cwd); + + return string16_to_string(a, wstr); } #endif -- cgit v1.2.3 From 413077a5d9ce55850bbb64747e1e7a813e356e5b Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Thu, 18 May 2023 13:23:17 +0100 Subject: Fix single-file package case --- src/build_settings.cpp | 7 +++++++ src/path.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src/path.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index b74207b85..e690b9ea2 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1499,13 +1499,20 @@ gb_internal bool init_build_paths(String init_filename) { } else if (build_context.build_mode == BuildMode_Executable) { // By default use no executable extension. output_extension = make_string(nullptr, 0); + String const single_file_extension = str_lit(".odin"); if (build_context.metrics.os == TargetOs_windows) { output_extension = STR_LIT("exe"); + } else if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) { + output_extension = make_string(nullptr, 0); } else if (path_is_directory(last_path_element(bc->build_paths[BuildPath_Main_Package].basename))) { // Add .bin extension to avoid collision // with package directory name output_extension = STR_LIT("bin"); + } else if (string_ends_with(init_filename, single_file_extension) && path_is_directory(remove_extension_from_path(init_filename))) { + // Add bin extension if compiling single-file package + // with same output name as a directory + output_extension = STR_LIT("bin"); } } else if (build_context.build_mode == BuildMode_DynamicLibrary) { // By default use a .so shared library extension. diff --git a/src/path.cpp b/src/path.cpp index 7664380a4..3054e3b57 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -2,7 +2,7 @@ Path handling utilities. */ #if !defined(GB_SYSTEM_WINDOWS) -#include +#include #endif gb_internal String remove_extension_from_path(String const &s) { -- cgit v1.2.3 From 018904f0ec59244645187b72f01bedcf716ab40c Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Fri, 19 May 2023 18:37:55 +0100 Subject: Add write permissions check on output folder --- src/build_settings.cpp | 19 ++++++++++++++++++- src/path.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) (limited to 'src/path.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e690b9ea2..018c3741a 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1504,7 +1504,8 @@ gb_internal bool init_build_paths(String init_filename) { if (build_context.metrics.os == TargetOs_windows) { output_extension = STR_LIT("exe"); } else if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) { - output_extension = make_string(nullptr, 0); + // Do nothing: we don't want the .bin extension + // when cross compiling } else if (path_is_directory(last_path_element(bc->build_paths[BuildPath_Main_Package].basename))) { // Add .bin extension to avoid collision // with package directory name @@ -1624,6 +1625,22 @@ gb_internal bool init_build_paths(String init_filename) { return false; } + if (path_is_directory(bc->build_paths[BuildPath_Output])) { + String output_file = path_to_string(ha, bc->build_paths[BuildPath_Output]); + defer (gb_free(ha, output_file.text)); + gb_printf_err("Output path %.*s is a directory.\n", LIT(output_file)); + return false; + } + //nocheckin char const *pathname = (char *)bc->build_paths[BuildPath_Output].basename.text; + + if (!write_directory(bc->build_paths[BuildPath_Output].basename)) { + String output_file = path_to_string(ha, bc->build_paths[BuildPath_Output]); + defer (gb_free(ha, output_file.text)); + gb_printf_err("No write permissions for output path: %.*s\n", LIT(output_file)); + return false; + } + + if (bc->target_features_string.len != 0) { enable_target_feature({}, bc->target_features_string); } diff --git a/src/path.cpp b/src/path.cpp index 3054e3b57..c9887e9ca 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -419,7 +419,43 @@ gb_internal ReadDirectoryError read_directory(String path, Array *fi) return ReadDirectory_None; } + + #else #error Implement read_directory #endif +#if !defined(GB_SYSTEM_WINDOWS) +gb_internal bool write_directory(String path) { + char const *pathname = (char *) path.text; + + if (access(pathname, W_OK) < 0) { + return false; + } + + return true; +} +#else +gb_internal bool write_directory(String path) { + String16wstr = string_to_string16(heap_allocator(), path); + LPCWSTR wdirectory_name = wstr.text; + + HANDLE directory = CreateFileW(wdirectory_name, + GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if (directory == INVALID_HANDLE_VALUE) { + DWORD error_code = GetLastError(); + if (error_code == ERROR_ACCESS_DENIED) { + return false; + } + } + + CloseHandle(directory); + return true; +} +#endif -- cgit v1.2.3 From 775a488a3688a1ce3157366a368349de32279f8c Mon Sep 17 00:00:00 2001 From: Mark Naughton Date: Fri, 19 May 2023 18:53:43 +0100 Subject: Fix windows write_directory() --- src/path.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index c9887e9ca..de80c9def 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -437,7 +437,7 @@ gb_internal bool write_directory(String path) { } #else gb_internal bool write_directory(String path) { - String16wstr = string_to_string16(heap_allocator(), path); + String16 wstr = string_to_string16(heap_allocator(), path); LPCWSTR wdirectory_name = wstr.text; HANDLE directory = CreateFileW(wdirectory_name, -- cgit v1.2.3