aboutsummaryrefslogtreecommitdiff
path: root/src/build_settings.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2020-09-15 10:12:42 +0100
committerGitHub <noreply@github.com>2020-09-15 10:12:42 +0100
commit3211e60018767ba047688c89a84aa03b8fb5069d (patch)
tree64859db158ef1c307480268a5efaa0dc5d14051e /src/build_settings.cpp
parent775bd66382cb3c022fbb257a4a28c310bc9e3693 (diff)
parenta13eed98947b6d6694fc68db22b3c27d50d5e588 (diff)
Merge pull request #734 from krixano/FreeBSD
FreeBSD Support
Diffstat (limited to 'src/build_settings.cpp')
-rw-r--r--src/build_settings.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index d6ac55ac8..39deb4063 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -1,3 +1,8 @@
+#if defined(GB_SYSTEM_FREEBSD)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
enum TargetOsKind {
TargetOs_Invalid,
@@ -6,6 +11,7 @@ enum TargetOsKind {
TargetOs_linux,
TargetOs_essence,
TargetOs_js,
+ TargetOs_freebsd,
TargetOs_COUNT,
};
@@ -36,6 +42,7 @@ String target_os_names[TargetOs_COUNT] = {
str_lit("linux"),
str_lit("essence"),
str_lit("js"),
+ str_lit("freebsd"),
};
String target_arch_names[TargetArch_COUNT] = {
@@ -204,6 +211,23 @@ gb_global TargetMetrics target_darwin_amd64 = {
str_lit("e-m:o-i64:64-f80:128-n8:16:32:64-S128"),
};
+gb_global TargetMetrics target_freebsd_386 = {
+ TargetOs_freebsd,
+ TargetArch_386,
+ 4,
+ 8,
+ str_lit("i386-unknown-freebsd-elf"),
+};
+
+gb_global TargetMetrics target_freebsd_amd64 = {
+ TargetOs_freebsd,
+ TargetArch_amd64,
+ 8,
+ 16,
+ str_lit("x86_64-unknown-freebsd-elf"),
+ str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
+};
+
gb_global TargetMetrics target_essence_amd64 = {
TargetOs_essence,
TargetArch_amd64,
@@ -235,6 +259,8 @@ gb_global NamedTargetMetrics named_targets[] = {
{ str_lit("linux_amd64"), &target_linux_amd64 },
{ str_lit("windows_386"), &target_windows_386 },
{ str_lit("windows_amd64"), &target_windows_amd64 },
+ { str_lit("freebsd_386"), &target_freebsd_386 },
+ { str_lit("freebsd_amd64"), &target_freebsd_amd64 },
};
NamedTargetMetrics *selected_target_metrics;
@@ -476,7 +502,21 @@ String odin_root_dir(void) {
// of this compiler, it should be _good enough_.
// That said, there's no solid 100% method on Linux to get the program's
// path without checking this link. Sorry.
+#if defined(GB_SYSTEM_FREEBSD)
+ int mib[4];
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PATHNAME;
+ mib[3] = -1;
+ len = path_buf.count;
+ sysctl(mib, 4, &path_buf[0], (size_t *) &len, NULL, 0);
+#elif defined(GB_SYSTEM_NETBSD)
+ len = readlink("/proc/curproc/exe", &path_buf[0], path_buf.count);
+#elif defined(GB_SYSTEM_DRAGONFLYBSD)
+ len = readlink("/proc/curproc/file", &path_buf[0], path_buf.count);
+#else
len = readlink("/proc/self/exe", &path_buf[0], path_buf.count);
+#endif
if(len == 0) {
return make_string(nullptr, 0);
}
@@ -613,6 +653,8 @@ void init_build_context(TargetMetrics *cross_target) {
metrics = &target_windows_amd64;
#elif defined(GB_SYSTEM_OSX)
metrics = &target_darwin_amd64;
+ #elif defined(GB_SYSTEM_FREEBSD)
+ metrics = &target_freebsd_amd64;
#else
metrics = &target_linux_amd64;
#endif
@@ -621,6 +663,8 @@ void init_build_context(TargetMetrics *cross_target) {
metrics = &target_windows_386;
#elif defined(GB_SYSTEM_OSX)
#error "Build Error: Unsupported architecture"
+ #elif defined(GB_SYSTEM_FREEBSD)
+ metrics = &target_freebsd_386;
#else
metrics = &target_linux_386;
#endif
@@ -669,6 +713,9 @@ void init_build_context(TargetMetrics *cross_target) {
case TargetOs_linux:
bc->link_flags = str_lit("-arch x86-64 ");
break;
+ case TargetOs_freebsd:
+ bc->link_flags = str_lit("-arch x86-64");
+ break;
}
} else if (bc->metrics.arch == TargetArch_386) {
llc_flags = gb_string_appendc(llc_flags, "-march=x86 ");
@@ -684,6 +731,9 @@ void init_build_context(TargetMetrics *cross_target) {
case TargetOs_linux:
bc->link_flags = str_lit("-arch x86 ");
break;
+ case TargetOs_freebsd:
+ bc->link_flags = str_lit("-arch x86");
+ break;
}
} else if (bc->metrics.arch == TargetArch_wasm32) {
bc->link_flags = str_lit("--no-entry --export-table --export-all --allow-undefined ");