summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--README.md9
-rw-r--r--minicargo.mk7
-rw-r--r--src/expand/proc_macro.cpp2
-rw-r--r--src/include/string_view.hpp3
-rw-r--r--src/main.cpp6
-rw-r--r--src/trans/target.cpp53
-rw-r--r--tools/common/target_detect.h16
-rw-r--r--tools/minicargo/build.cpp25
9 files changed, 103 insertions, 20 deletions
diff --git a/Makefile b/Makefile
index 0d34be43..256bb6c6 100644
--- a/Makefile
+++ b/Makefile
@@ -322,7 +322,7 @@ src/main.cpp: $(PCHS:%=src/%.gch)
$V$(CXX) -std=c++14 -o $@ $< $(CPPFLAGS) -MMD -MP -MF $@.dep
tools/bin/common_lib.a:
- make -C tools/common
+ $(MAKE) -C tools/common
-include $(OBJ:%=%.dep)
diff --git a/README.md b/README.md
index 49677984..bbc34fb6 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,15 @@ Linux
- `make -f minicargo.mk` - Builds `mrustc` and `minicargo`, then builds `libstd`, `libtest`, finally `rustc` and `cargo`
- `make -C run_rustc` - Build libstd and a "hello, world" using the above-built rustc
+BSD
+---
+Similar to Linux, but you might need to
+- specify the rustc default target explicitly
+- specify the compiler
+- use `gmake` to run GNU make
+
+e.g. `gmake CC=cc RUSTC_TARGET=x86_64-unknown-freebsd -f minicargo.mk`
+
Windows
--------
(NOTE: Incomplete, doesn't yet compile executables and missing helper scripts)
diff --git a/minicargo.mk b/minicargo.mk
index aee2483a..dd3075c6 100644
--- a/minicargo.mk
+++ b/minicargo.mk
@@ -34,7 +34,8 @@ else
endif
LLVM_CONFIG := $(RUSTCSRC)build/bin/llvm-config
-RUSTC_TARGET := x86_64-unknown-linux-gnu
+RUSTC_TARGET ?= x86_64-unknown-linux-gnu
+LLVM_TARGETS ?= "X86;ARM;AArch64" #;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX
OVERRIDE_DIR := script-overrides/$(RUSTC_CHANNEL)-$(RUSTC_VERSION)$(OVERRIDE_SUFFIX)/
.PHONY: bin/mrustc tools/bin/minicargo
@@ -95,11 +96,11 @@ $(OUTDIR)cargo: $(MRUSTC) LIBS
# Reference $(RUSTCSRC)src/bootstrap/native.rs for these values
LLVM_CMAKE_OPTS := LLVM_TARGET_ARCH=$(firstword $(subst -, ,$(RUSTC_TARGET))) LLVM_DEFAULT_TARGET_TRIPLE=$(RUSTC_TARGET)
-LLVM_CMAKE_OPTS += LLVM_TARGETS_TO_BUILD=X86#;ARM;AArch64;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX
+LLVM_CMAKE_OPTS += LLVM_TARGETS_TO_BUILD="$(LLVM_TARGETS)"
LLVM_CMAKE_OPTS += LLVM_ENABLE_ASSERTIONS=OFF
LLVM_CMAKE_OPTS += LLVM_INCLUDE_EXAMPLES=OFF LLVM_INCLUDE_TESTS=OFF LLVM_INCLUDE_DOCS=OFF
LLVM_CMAKE_OPTS += LLVM_ENABLE_ZLIB=OFF LLVM_ENABLE_TERMINFO=OFF LLVM_ENABLE_LIBEDIT=OFF WITH_POLLY=OFF
-LLVM_CMAKE_OPTS += CMAKE_CXX_COMPILER="g++" CMAKE_C_COMPILER="gcc"
+LLVM_CMAKE_OPTS += CMAKE_CXX_COMPILER="$(CXX)" CMAKE_C_COMPILER="$(CC)"
LLVM_CMAKE_OPTS += CMAKE_BUILD_TYPE=RelWithDebInfo
diff --git a/src/expand/proc_macro.cpp b/src/expand/proc_macro.cpp
index 969f75b0..7d953e37 100644
--- a/src/expand/proc_macro.cpp
+++ b/src/expand/proc_macro.cpp
@@ -24,7 +24,7 @@
# include <sys/wait.h>
#endif
-#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__APPLE__)
extern char **environ;
#endif
diff --git a/src/include/string_view.hpp b/src/include/string_view.hpp
index 7d049e9e..a0cf596b 100644
--- a/src/include/string_view.hpp
+++ b/src/include/string_view.hpp
@@ -10,7 +10,8 @@
#include <cstddef> // size_t
#include <iostream> // ostream
-namespace std {
+namespace stdx {
+using namespace std;
class string_view
{
diff --git a/src/main.cpp b/src/main.cpp
index 75c078ee..8f2740fc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1077,14 +1077,14 @@ ProgramParams::ProgramParams(int argc, char *argv[])
{
const char* end = strchr(a, ':');
- ::std::string_view s;
+ ::stdx::string_view s;
if( end ) {
- s = ::std::string_view { a, end };
+ s = ::stdx::string_view { a, end };
a = end + 1;
}
else {
end = a + strlen(a);
- s = ::std::string_view { a, end };
+ s = ::stdx::string_view { a, end };
a = end;
}
diff --git a/src/trans/target.cpp b/src/trans/target.cpp
index 1727cdba..72d81edd 100644
--- a/src/trans/target.cpp
+++ b/src/trans/target.cpp
@@ -361,6 +361,34 @@ namespace
ARCH_X86_64
};
}
+ else if(target_name == "i686-unknown-freebsd")
+ {
+ return TargetSpec {
+ "unix", "freebsd", "gnu", {CodegenMode::Gnu11, "i686-unknown-freebsd", BACKEND_C_OPTS_GNU},
+ ARCH_X86
+ };
+ }
+ else if(target_name == "x86_64-unknown-freebsd")
+ {
+ return TargetSpec {
+ "unix", "freebsd", "gnu", {CodegenMode::Gnu11, "x86_64-unknown-freebsd", BACKEND_C_OPTS_GNU},
+ ARCH_X86_64
+ };
+ }
+ else if(target_name == "arm-unknown-freebsd")
+ {
+ return TargetSpec {
+ "unix", "freebsd", "gnu", {CodegenMode::Gnu11, "arm-unknown-freebsd", BACKEND_C_OPTS_GNU},
+ ARCH_ARM32
+ };
+ }
+ else if(target_name == "aarch64-unknown-freebsd")
+ {
+ return TargetSpec {
+ "unix", "freebsd", "gnu", {CodegenMode::Gnu11, "aarch64-unknown-freebsd", BACKEND_C_OPTS_GNU},
+ ARCH_ARM64
+ };
+ }
else if(target_name == "x86_64-unknown-netbsd")
{
return TargetSpec {
@@ -396,9 +424,16 @@ namespace
ARCH_ARM64
};
}
+ else if(target_name == "x86_64-unknown-dragonfly")
+ {
+ return TargetSpec {
+ "unix", "dragonfly", "gnu", {CodegenMode::Gnu11, "x86_64-unknown-dragonfly", BACKEND_C_OPTS_GNU},
+ ARCH_X86_64
+ };
+ }
else if(target_name == "x86_64-apple-macosx")
{
- // NOTE: OSX uses clang and lld, which don't fully support the defaults used for GNU targets
+ // NOTE: OSX uses Mach-O binaries, which don't fully support the defaults used for GNU targets
return TargetSpec {
"unix", "macos", "gnu", {CodegenMode::Gnu11, "x86_64-apple-darwin", {}, {}},
ARCH_X86_64
@@ -438,22 +473,32 @@ void Target_SetCfg(const ::std::string& target_name)
Cfg_SetFlag("linux");
Cfg_SetValue("target_vendor", "gnu");
}
- Cfg_SetValue("target_env", g_target.m_env_name);
+
+ if( g_target.m_os_name == "freebsd" )
+ {
+ Cfg_SetFlag("freebsd");
+ Cfg_SetValue("target_vendor", "unknown");
+ }
if( g_target.m_os_name == "netbsd" )
{
Cfg_SetFlag("netbsd");
Cfg_SetValue("target_vendor", "unknown");
}
- Cfg_SetValue("target_env", g_target.m_env_name);
if( g_target.m_os_name == "openbsd" )
{
Cfg_SetFlag("openbsd");
Cfg_SetValue("target_vendor", "unknown");
}
- Cfg_SetValue("target_env", g_target.m_env_name);
+ if( g_target.m_os_name == "dragonfly" )
+ {
+ Cfg_SetFlag("dragonfly");
+ Cfg_SetValue("target_vendor", "unknown");
+ }
+
+ Cfg_SetValue("target_env", g_target.m_env_name);
Cfg_SetValue("target_os", g_target.m_os_name);
Cfg_SetValue("target_pointer_width", FMT(g_target.m_arch.m_pointer_bits));
Cfg_SetValue("target_endian", g_target.m_arch.m_big_endian ? "big" : "little");
diff --git a/tools/common/target_detect.h b/tools/common/target_detect.h
index 995ab6a4..a4c44ba4 100644
--- a/tools/common/target_detect.h
+++ b/tools/common/target_detect.h
@@ -34,6 +34,19 @@
# else
# define DEFAULT_TARGET_NAME "i586-windows-gnu"
# endif
+// - FreeBSD
+#elif defined(__FreeBSD__)
+# if defined(__amd64__)
+# define DEFAULT_TARGET_NAME "x86_64-unknown-freebsd"
+# elif defined(__aarch64__)
+# define DEFAULT_TARGET_NAME "aarch64-unknown-freebsd"
+# elif defined(__arm__)
+# define DEFAULT_TARGET_NAME "arm-unknown-freebsd"
+# elif defined(__i386__)
+# define DEFAULT_TARGET_NAME "i686-unknown-freebsd"
+# else
+# warning "Unable to detect a suitable default target (FreeBSD)"
+# endif
// - NetBSD
#elif defined(__NetBSD__)
# if defined(__amd64__)
@@ -54,6 +67,9 @@
# else
# warning "Unable to detect a suitable default target (OpenBSD)"
# endif
+// - DragonFly
+#elif defined(__DragonFly__)
+# define DEFAULT_TARGET_NAME "x86_64-unknown-dragonfly"
// - Apple devices
#elif defined(__APPLE__)
# define DEFAULT_TARGET_NAME "x86_64-apple-macosx"
diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp
index 42e19552..ea93a793 100644
--- a/tools/minicargo/build.cpp
+++ b/tools/minicargo/build.cpp
@@ -45,6 +45,9 @@ extern int _putenv_s(const char*, const char*);
#ifdef __APPLE__
# include <mach-o/dyld.h>
#endif
+#if defined(__FreeBSD__) || defined(__DragonFly__) || (defined(__NetBSD__) && defined(KERN_PROC_PATHNAME)) // NetBSD 8.0+
+# include <sys/sysctl.h>
+#endif
#ifdef _WIN32
# define EXESUF ".exe"
@@ -541,12 +544,12 @@ Builder::Builder(BuildOptions opts):
::helpers::path minicargo_path { buf };
minicargo_path.pop_component();
-#ifdef __MINGW32__
+# ifdef __MINGW32__
m_compiler_path = (minicargo_path / "..\\..\\bin\\mrustc.exe").normalise();
-#else
+# else
// MSVC, minicargo and mrustc are in the same dir
m_compiler_path = minicargo_path / "mrustc.exe";
-#endif
+# endif
#else
char buf[1024];
# ifdef __linux__
@@ -556,7 +559,7 @@ Builder::Builder(BuildOptions opts):
buf[s] = 0;
}
else
-#elif defined(__APPLE__)
+# elif defined(__APPLE__)
uint32_t s = sizeof(buf);
if( _NSGetExecutablePath(buf, &s) == 0 )
{
@@ -564,9 +567,17 @@ Builder::Builder(BuildOptions opts):
}
else
// TODO: Buffer too small
-#else
-# warning "Can't runtime determine path to minicargo"
-#endif
+# elif defined(__FreeBSD__) || defined(__DragonFly__) || (defined(__NetBSD__) && defined(KERN_PROC_PATHNAME)) // NetBSD 8.0+
+ int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
+ size_t s = sizeof(buf);
+ if ( sysctl(mib, 4, buf, &s, NULL, 0) == 0 )
+ {
+ // Buffer populated
+ }
+ else
+# else
+# warning "Can't runtime determine path to minicargo"
+# endif
{
strcpy(buf, "tools/bin/minicargo");
}