Merge pull request #2479 from Naught00/master

Change default executable extension for non-Windows platforms
This commit is contained in:
Jeroen van Rijn
2023-05-19 20:09:39 +02:00
committed by GitHub
2 changed files with 84 additions and 3 deletions
+21 -3
View File
@@ -1501,13 +1501,23 @@ gb_internal bool init_build_paths(String init_filename) {
} else if (is_arch_wasm()) { } else if (is_arch_wasm()) {
output_extension = STR_LIT("wasm"); output_extension = STR_LIT("wasm");
} else if (build_context.build_mode == BuildMode_Executable) { } else if (build_context.build_mode == BuildMode_Executable) {
// By default use a .bin executable extension. // By default use no executable extension.
output_extension = STR_LIT("bin"); output_extension = make_string(nullptr, 0);
String const single_file_extension = str_lit(".odin");
if (build_context.metrics.os == TargetOs_windows) { if (build_context.metrics.os == TargetOs_windows) {
output_extension = STR_LIT("exe"); output_extension = STR_LIT("exe");
} else if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) { } 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
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) { } else if (build_context.build_mode == BuildMode_DynamicLibrary) {
// By default use a .so shared library extension. // By default use a .so shared library extension.
@@ -1619,6 +1629,14 @@ gb_internal bool init_build_paths(String init_filename) {
return false; return false;
} }
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) { if (bc->target_features_string.len != 0) {
enable_target_feature({}, bc->target_features_string); enable_target_feature({}, bc->target_features_string);
} }
+63
View File
@@ -1,6 +1,10 @@
/* /*
Path handling utilities. Path handling utilities.
*/ */
#if !defined(GB_SYSTEM_WINDOWS)
#include <unistd.h>
#endif
gb_internal String remove_extension_from_path(String const &s) { gb_internal String remove_extension_from_path(String const &s) {
if (s.len != 0 && s.text[s.len-1] == '.') { if (s.len != 0 && s.text[s.len-1] == '.') {
return s; return s;
@@ -25,6 +29,29 @@ gb_internal String remove_directory_from_path(String const &s) {
return substring(s, s.len-len, s.len); 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) {
char cwd[256];
getcwd(cwd, 256);
return make_string_c(cwd);
}
#else
gb_internal String get_current_directory(void) {
gbAllocator a = heap_allocator();
wchar_t cwd[256];
GetCurrentDirectoryW(256, cwd);
String16 wstr = make_string16_c(cwd);
return string16_to_string(a, wstr);
}
#endif
gb_internal bool path_is_directory(String path); gb_internal bool path_is_directory(String path);
gb_internal String directory_from_path(String const &s) { gb_internal String directory_from_path(String const &s) {
@@ -392,7 +419,43 @@ gb_internal ReadDirectoryError read_directory(String path, Array<FileInfo> *fi)
return ReadDirectory_None; return ReadDirectory_None;
} }
#else #else
#error Implement read_directory #error Implement read_directory
#endif #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) {
String16 wstr = 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