aboutsummaryrefslogtreecommitdiff
path: root/src/build_settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/build_settings.cpp')
-rw-r--r--src/build_settings.cpp254
1 files changed, 159 insertions, 95 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index c941e0f68..05709902a 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -31,6 +31,24 @@ enum TargetOsKind : u16 {
TargetOs_COUNT,
};
+gb_global String target_os_names[TargetOs_COUNT] = {
+ str_lit(""),
+ str_lit("windows"),
+ str_lit("darwin"),
+ str_lit("linux"),
+ str_lit("essence"),
+ str_lit("freebsd"),
+ str_lit("openbsd"),
+ str_lit("netbsd"),
+ str_lit("haiku"),
+
+ str_lit("wasi"),
+ str_lit("js"),
+ str_lit("orca"),
+
+ str_lit("freestanding"),
+};
+
enum TargetArchKind : u16 {
TargetArch_Invalid,
@@ -45,6 +63,17 @@ enum TargetArchKind : u16 {
TargetArch_COUNT,
};
+gb_global String target_arch_names[TargetArch_COUNT] = {
+ str_lit(""),
+ str_lit("amd64"),
+ str_lit("i386"),
+ str_lit("arm32"),
+ str_lit("arm64"),
+ str_lit("wasm32"),
+ str_lit("wasm64p32"),
+ str_lit("riscv64"),
+};
+
enum TargetEndianKind : u8 {
TargetEndian_Little,
TargetEndian_Big,
@@ -52,6 +81,11 @@ enum TargetEndianKind : u8 {
TargetEndian_COUNT,
};
+gb_global String target_endian_names[TargetEndian_COUNT] = {
+ str_lit("little"),
+ str_lit("big"),
+};
+
enum TargetABIKind : u16 {
TargetABI_Default,
@@ -61,7 +95,14 @@ enum TargetABIKind : u16 {
TargetABI_COUNT,
};
+gb_global String target_abi_names[TargetABI_COUNT] = {
+ str_lit(""),
+ str_lit("win64"),
+ str_lit("sysv"),
+};
+
enum Windows_Subsystem : u8 {
+ Windows_Subsystem_UNKNOWN,
Windows_Subsystem_BOOT_APPLICATION,
Windows_Subsystem_CONSOLE, // Default,
Windows_Subsystem_EFI_APPLICATION,
@@ -75,38 +116,23 @@ enum Windows_Subsystem : u8 {
Windows_Subsystem_COUNT,
};
-struct MicroarchFeatureList {
- String microarch;
- String features;
-};
-
-gb_global String target_os_names[TargetOs_COUNT] = {
+gb_global String windows_subsystem_names[Windows_Subsystem_COUNT] = {
str_lit(""),
- str_lit("windows"),
- str_lit("darwin"),
- str_lit("linux"),
- str_lit("essence"),
- str_lit("freebsd"),
- str_lit("openbsd"),
- str_lit("netbsd"),
- str_lit("haiku"),
-
- str_lit("wasi"),
- str_lit("js"),
- str_lit("orca"),
-
- str_lit("freestanding"),
+ str_lit("BOOT_APPLICATION"),
+ str_lit("CONSOLE"), // Default
+ str_lit("EFI_APPLICATION"),
+ str_lit("EFI_BOOT_SERVICE_DRIVER"),
+ str_lit("EFI_ROM"),
+ str_lit("EFI_RUNTIME_DRIVER"),
+ str_lit("NATIVE"),
+ str_lit("POSIX"),
+ str_lit("WINDOWS"),
+ str_lit("WINDOWSCE"),
};
-gb_global String target_arch_names[TargetArch_COUNT] = {
- str_lit(""),
- str_lit("amd64"),
- str_lit("i386"),
- str_lit("arm32"),
- str_lit("arm64"),
- str_lit("wasm32"),
- str_lit("wasm64p32"),
- str_lit("riscv64"),
+struct MicroarchFeatureList {
+ String microarch;
+ String features;
};
#if defined(GB_SYSTEM_WINDOWS)
@@ -114,20 +140,8 @@ gb_global String target_arch_names[TargetArch_COUNT] = {
#else
#include <llvm/Config/llvm-config.h>
#endif
-
#include "build_settings_microarch.cpp"
-gb_global String target_endian_names[TargetEndian_COUNT] = {
- str_lit("little"),
- str_lit("big"),
-};
-
-gb_global String target_abi_names[TargetABI_COUNT] = {
- str_lit(""),
- str_lit("win64"),
- str_lit("sysv"),
-};
-
gb_global TargetEndianKind target_endians[TargetArch_COUNT] = {
TargetEndian_Little,
TargetEndian_Little,
@@ -138,19 +152,6 @@ gb_global TargetEndianKind target_endians[TargetArch_COUNT] = {
TargetEndian_Little,
};
-gb_global String windows_subsystem_names[Windows_Subsystem_COUNT] = {
- str_lit("BOOT_APPLICATION"),
- str_lit("CONSOLE"), // Default
- str_lit("EFI_APPLICATION"),
- str_lit("EFI_BOOT_SERVICE_DRIVER"),
- str_lit("EFI_ROM"),
- str_lit("EFI_RUNTIME_DRIVER"),
- str_lit("NATIVE"),
- str_lit("POSIX"),
- str_lit("WINDOWS"),
- str_lit("WINDOWSCE"),
-};
-
#ifndef ODIN_VERSION_RAW
#define ODIN_VERSION_RAW "dev-unknown-unknown"
#endif
@@ -287,7 +288,7 @@ enum BuildPath : u8 {
BuildPath_VS_LIB, // vs_library_path
BuildPath_Output, // Output Path for .exe, .dll, .so, etc. Can be overridden with `-out:`.
- BuildPath_PDB, // Output Path for .pdb file, can be overridden with `-pdb-name:`.
+ BuildPath_Symbols, // Output Path for .pdb or .dSym file, can be overridden with `-pdb-name:`.
BuildPathCOUNT,
};
@@ -393,17 +394,17 @@ String linker_choices[Linker_COUNT] = {
// This stores the information for the specify architecture of this build
struct BuildContext {
// Constants
- String ODIN_OS; // Target operating system
- String ODIN_ARCH; // Target architecture
- String ODIN_VENDOR; // Compiler vendor
- String ODIN_VERSION; // Compiler version
- String ODIN_ROOT; // Odin ROOT
- String ODIN_BUILD_PROJECT_NAME; // Odin main/initial package's directory name
- String ODIN_WINDOWS_SUBSYSTEM; // Empty string for non-Windows targets
- bool ODIN_DEBUG; // Odin in debug mode
- bool ODIN_DISABLE_ASSERT; // Whether the default 'assert' et al is disabled in code or not
- bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing)
- bool ODIN_DEFAULT_TO_PANIC_ALLOCATOR; // Whether the default allocator is a "panic" allocator or not (i.e. panics on any call to it)
+ String ODIN_OS; // Target operating system
+ String ODIN_ARCH; // Target architecture
+ String ODIN_VENDOR; // Compiler vendor
+ String ODIN_VERSION; // Compiler version
+ String ODIN_ROOT; // Odin ROOT
+ String ODIN_BUILD_PROJECT_NAME; // Odin main/initial package's directory name
+ Windows_Subsystem ODIN_WINDOWS_SUBSYSTEM; // .Console, .Windows
+ bool ODIN_DEBUG; // Odin in debug mode
+ bool ODIN_DISABLE_ASSERT; // Whether the default 'assert' et al is disabled in code or not
+ bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing)
+ bool ODIN_DEFAULT_TO_PANIC_ALLOCATOR; // Whether the default allocator is a "panic" allocator or not (i.e. panics on any call to it)
bool ODIN_FOREIGN_ERROR_PROCEDURES;
bool ODIN_VALGRIND_SUPPORT;
@@ -441,6 +442,7 @@ struct BuildContext {
String extra_assembler_flags;
String microarch;
BuildModeKind build_mode;
+ bool keep_executable;
bool generate_docs;
bool custom_optimization_level;
i32 optimization_level;
@@ -459,6 +461,7 @@ struct BuildContext {
bool ignore_unknown_attributes;
bool no_bounds_check;
bool no_type_assert;
+ bool dynamic_literals; // Opt-in to `#+feature dynamic-literals` project-wide.
bool no_output_files;
bool no_crt;
bool no_rpath;
@@ -1786,8 +1789,8 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
}
// Default to subsystem:CONSOLE on Windows targets
- if (bc->ODIN_WINDOWS_SUBSYSTEM == "" && bc->metrics.os == TargetOs_windows) {
- bc->ODIN_WINDOWS_SUBSYSTEM = windows_subsystem_names[Windows_Subsystem_CONSOLE];
+ if (bc->ODIN_WINDOWS_SUBSYSTEM == Windows_Subsystem_UNKNOWN && bc->metrics.os == TargetOs_windows) {
+ bc->ODIN_WINDOWS_SUBSYSTEM = Windows_Subsystem_CONSOLE;
}
if (subtarget == Subtarget_Android) {
@@ -1915,12 +1918,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
}
- // TODO: Static map calls are bugged on `amd64sysv` abi.
- if (bc->metrics.os != TargetOs_windows && bc->metrics.arch == TargetArch_amd64) {
- // ENFORCE DYNAMIC MAP CALLS
- bc->dynamic_map_calls = true;
- }
-
bc->ODIN_VALGRIND_SUPPORT = false;
if (build_context.metrics.os != TargetOs_windows) {
switch (bc->metrics.arch) {
@@ -2026,6 +2023,39 @@ gb_internal bool check_target_feature_is_superset_of(String const &superset, Str
return true;
}
+gb_internal String infer_object_extension_from_build_context() {
+ String output_extension = {};
+ if (is_arch_wasm()) {
+ output_extension = STR_LIT("wasm.o");
+ } else {
+ switch (build_context.metrics.os) {
+ case TargetOs_windows:
+ output_extension = STR_LIT("obj");
+ break;
+ default:
+ case TargetOs_darwin:
+ case TargetOs_linux:
+ case TargetOs_essence:
+ output_extension = STR_LIT("o");
+ break;
+
+ case TargetOs_freestanding:
+ switch (build_context.metrics.abi) {
+ default:
+ case TargetABI_Default:
+ case TargetABI_SysV:
+ output_extension = STR_LIT("o");
+ break;
+ case TargetABI_Win64:
+ output_extension = STR_LIT("obj");
+ break;
+ }
+ break;
+ }
+ }
+ return output_extension;
+}
+
// NOTE(Jeroen): Set/create the output and other paths and report an error as appropriate.
// We've previously called `parse_build_flags`, so `out_filepath` should be set.
gb_internal bool init_build_paths(String init_filename) {
@@ -2069,10 +2099,6 @@ gb_internal bool init_build_paths(String init_filename) {
}
}
- if (bc->pdb_filepath.len > 0) {
- bc->build_paths[BuildPath_PDB] = path_from_string(ha, bc->pdb_filepath);
- }
-
if ((bc->command_kind & Command__does_build) && (!bc->ignore_microsoft_magic)) {
// NOTE(ic): It would be nice to extend this so that we could specify the Visual Studio version that we want instead of defaulting to the latest.
Find_Result find_result = find_visual_studio_and_windows_sdk();
@@ -2162,13 +2188,8 @@ gb_internal bool init_build_paths(String init_filename) {
if (build_context.metrics.os == TargetOs_windows) {
output_extension = STR_LIT("lib");
}
- }else if (build_context.build_mode == BuildMode_Object) {
- // By default use a .o object extension.
- output_extension = STR_LIT("o");
-
- if (build_context.metrics.os == TargetOs_windows) {
- output_extension = STR_LIT("obj");
- }
+ } else if (build_context.build_mode == BuildMode_Object) {
+ output_extension = infer_object_extension_from_build_context();
} else if (build_context.build_mode == BuildMode_Assembly) {
// By default use a .S asm extension.
output_extension = STR_LIT("S");
@@ -2188,7 +2209,7 @@ gb_internal bool init_build_paths(String init_filename) {
return false;
} else if (bc->build_paths[BuildPath_Output].ext.len == 0) {
gb_printf_err("Output path %.*s must have an appropriate extension.\n", LIT(output_file));
- return false;
+ return false;
}
}
} else {
@@ -2214,11 +2235,34 @@ gb_internal bool init_build_paths(String init_filename) {
while (output_name.len > 0 && (output_name[output_name.len-1] == '/' || output_name[output_name.len-1] == '\\')) {
output_name.len -= 1;
}
+ // Only trim the extension if it's an Odin source file.
+ // This lets people build folders with extensions or files beginning with dots.
+ if (path_extension(output_name) == ".odin" && !path_is_directory(output_name)) {
+ output_name = remove_extension_from_path(output_name);
+ }
output_name = remove_directory_from_path(output_name);
- output_name = remove_extension_from_path(output_name);
output_name = copy_string(ha, string_trim_whitespace(output_name));
- output_path = path_from_string(ha, output_name);
-
+ // This is `path_from_string` without the extension trimming.
+ Path res = {};
+ if (output_name.len > 0) {
+ String fullpath = path_to_full_path(ha, output_name);
+ defer (gb_free(ha, fullpath.text));
+
+ res.basename = directory_from_path(fullpath);
+ res.basename = copy_string(ha, res.basename);
+
+ if (path_is_directory(fullpath)) {
+ if (res.basename.len > 0 && res.basename.text[res.basename.len - 1] == '/') {
+ res.basename.len--;
+ }
+ } else {
+ isize name_start = (res.basename.len > 0) ? res.basename.len + 1 : res.basename.len;
+ res.name = substring(fullpath, name_start, fullpath.len);
+ res.name = copy_string(ha, res.name);
+ }
+ }
+ output_path = res;
+
// Note(Dragos): This is a fix for empty filenames
// Turn the trailing folder into the file name
if (output_path.name.len == 0) {
@@ -2248,6 +2292,26 @@ gb_internal bool init_build_paths(String init_filename) {
bc->build_paths[BuildPath_Output] = output_path;
}
+ if (build_context.ODIN_DEBUG) {
+ if (build_context.metrics.os == TargetOs_windows) {
+ if (bc->pdb_filepath.len > 0) {
+ bc->build_paths[BuildPath_Symbols] = path_from_string(ha, bc->pdb_filepath);
+ } else {
+ Path symbol_path;
+ symbol_path.basename = copy_string(ha, bc->build_paths[BuildPath_Output].basename);
+ symbol_path.name = copy_string(ha, bc->build_paths[BuildPath_Output].name);
+ symbol_path.ext = copy_string(ha, STR_LIT("pdb"));
+ bc->build_paths[BuildPath_Symbols] = symbol_path;
+ }
+ } else if (build_context.metrics.os == TargetOs_darwin) {
+ Path symbol_path;
+ symbol_path.basename = copy_string(ha, bc->build_paths[BuildPath_Output].basename);
+ symbol_path.name = copy_string(ha, bc->build_paths[BuildPath_Output].name);
+ symbol_path.ext = copy_string(ha, STR_LIT("dSYM"));
+ bc->build_paths[BuildPath_Symbols] = symbol_path;
+ }
+ }
+
// Do we have an extension? We might not if the output filename was supplied.
if (bc->build_paths[BuildPath_Output].ext.len == 0) {
if (build_context.metrics.os == TargetOs_windows || is_arch_wasm() || build_context.build_mode != BuildMode_Executable) {
@@ -2283,9 +2347,10 @@ gb_internal bool init_build_paths(String init_filename) {
case TargetOs_windows:
case TargetOs_linux:
case TargetOs_darwin:
+ case TargetOs_freebsd:
break;
default:
- gb_printf_err("-sanitize:address is only supported on windows, linux, and darwin\n");
+ gb_printf_err("-sanitize:address is only supported on Windows, Linux, Darwin, and FreeBSD\n");
return false;
}
}
@@ -2293,12 +2358,10 @@ gb_internal bool init_build_paths(String init_filename) {
if (build_context.sanitizer_flags & SanitizerFlag_Memory) {
switch (build_context.metrics.os) {
case TargetOs_linux:
+ case TargetOs_freebsd:
break;
default:
- gb_printf_err("-sanitize:memory is only supported on linux\n");
- return false;
- }
- if (build_context.metrics.os != TargetOs_linux) {
+ gb_printf_err("-sanitize:memory is only supported on Linux and FreeBSD\n");
return false;
}
}
@@ -2307,9 +2370,10 @@ gb_internal bool init_build_paths(String init_filename) {
switch (build_context.metrics.os) {
case TargetOs_linux:
case TargetOs_darwin:
+ case TargetOs_freebsd:
break;
default:
- gb_printf_err("-sanitize:thread is only supported on linux and darwin\n");
+ gb_printf_err("-sanitize:thread is only supported on Linux, Darwin, and FreeBSD\n");
return false;
}
}