diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README.md | 9 | ||||
-rw-r--r-- | minicargo.mk | 7 | ||||
-rw-r--r-- | src/expand/proc_macro.cpp | 2 | ||||
-rw-r--r-- | src/include/string_view.hpp | 3 | ||||
-rw-r--r-- | src/main.cpp | 6 | ||||
-rw-r--r-- | src/trans/target.cpp | 53 | ||||
-rw-r--r-- | tools/common/target_detect.h | 16 | ||||
-rw-r--r-- | tools/minicargo/build.cpp | 25 |
9 files changed, 103 insertions, 20 deletions
@@ -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) @@ -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"); } |