From dd0fc0a03a680d76d3454f955648876b2a1ccae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 17 Dec 2016 11:22:41 +0100 Subject: [PATCH 1/4] Disconnect ar from cc on OpenBSD OpenBSD usually use an alternative compiler (`egcc') from ports. But the `ar' is unprefixed as it comes from base. --- src/build_helper/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs index 07f9c91d3c787..bd036fae68955 100644 --- a/src/build_helper/lib.rs +++ b/src/build_helper/lib.rs @@ -47,6 +47,8 @@ pub fn cc2ar(cc: &Path, target: &str) -> Option { None } else if target.contains("musl") { Some(PathBuf::from("ar")) + } else if target.contains("openbsd") { + Some(PathBuf::from("ar")) } else { let parent = cc.parent().unwrap(); let file = cc.file_name().unwrap().to_str().unwrap(); From 9f8c1e28a5c7e042c6522f84a684ad848a200c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 17 Dec 2016 20:01:05 +0100 Subject: [PATCH 2/4] disable run-pass/backtrace for openbsd the backtrace test doesn't work on openbsd as it doesn't have support for libbacktrace without using filename. --- src/test/run-pass/backtrace.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/run-pass/backtrace.rs b/src/test/run-pass/backtrace.rs index c438c17f51e3a..75c665b04a123 100644 --- a/src/test/run-pass/backtrace.rs +++ b/src/test/run-pass/backtrace.rs @@ -10,6 +10,7 @@ // ignore-android FIXME #17520 // ignore-emscripten spawning processes is not supported +// ignore-openbsd no support for libbacktrace without filename // compile-flags:-g use std::env; From a7d9025e40a55d5d8ddeb2f35075512055c363ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 17 Dec 2016 20:09:23 +0100 Subject: [PATCH 3/4] let BSD to use gmake for GNU-make the diff extends build_helper to provide an function to return the expected name of GNU-make on the host: "make" or "gmake". Fixes #38429 --- src/Cargo.lock | 1 + src/bootstrap/check.rs | 4 +++- src/build_helper/lib.rs | 10 ++++++++++ src/liballoc_jemalloc/build.rs | 2 +- src/libstd/build.rs | 2 +- src/tools/compiletest/Cargo.toml | 1 + src/tools/compiletest/src/runtest.rs | 4 +++- 7 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 9cd77e71b82dd..01a19a0cca862 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -87,6 +87,7 @@ dependencies = [ name = "compiletest" version = "0.0.0" dependencies = [ + "build_helper 0.1.0", "env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "serialize 0.0.0", diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index 712c4c52baa5f..aa15825d8293c 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -13,6 +13,8 @@ //! This file implements the various regression test suites that we execute on //! our CI. +extern crate build_helper; + use std::collections::HashSet; use std::env; use std::fmt; @@ -543,7 +545,7 @@ pub fn distcheck(build: &Build) { build.run(&mut cmd); build.run(Command::new("./configure") .current_dir(&dir)); - build.run(Command::new("make") + build.run(Command::new(build_helper::make(&build.config.build)) .arg("check") .current_dir(&dir)); } diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs index bd036fae68955..d0d588f46a754 100644 --- a/src/build_helper/lib.rs +++ b/src/build_helper/lib.rs @@ -63,6 +63,16 @@ pub fn cc2ar(cc: &Path, target: &str) -> Option { } } +pub fn make(host: &str) -> PathBuf { + if host.contains("bitrig") || host.contains("dragonfly") || + host.contains("freebsd") || host.contains("netbsd") || + host.contains("openbsd") { + PathBuf::from("gmake") + } else { + PathBuf::from("make") + } +} + pub fn output(cmd: &mut Command) -> String { let output = match cmd.stderr(Stdio::inherit()).output() { Ok(status) => status, diff --git a/src/liballoc_jemalloc/build.rs b/src/liballoc_jemalloc/build.rs index fc849e7a50cc4..60b7875a97c84 100644 --- a/src/liballoc_jemalloc/build.rs +++ b/src/liballoc_jemalloc/build.rs @@ -151,7 +151,7 @@ fn main() { cmd.arg(format!("--build={}", build_helper::gnu_target(&host))); run(&mut cmd); - let mut make = Command::new("make"); + let mut make = Command::new(build_helper::make(&host)); make.current_dir(&build_dir) .arg("build_lib_static"); diff --git a/src/libstd/build.rs b/src/libstd/build.rs index 1087d1f24471b..b3eba50831698 100644 --- a/src/libstd/build.rs +++ b/src/libstd/build.rs @@ -104,7 +104,7 @@ fn build_libbacktrace(host: &str, target: &str) { .env("AR", &ar) .env("RANLIB", format!("{} s", ar.display())) .env("CFLAGS", cflags)); - run(Command::new("make") + run(Command::new(build_helper::make(host)) .current_dir(&build_dir) .arg(format!("INCDIR={}", src_dir.display())) .arg("-j").arg(env::var("NUM_JOBS").expect("NUM_JOBS was not set"))); diff --git a/src/tools/compiletest/Cargo.toml b/src/tools/compiletest/Cargo.toml index 227b695635dce..faf0a0eaa81ee 100644 --- a/src/tools/compiletest/Cargo.toml +++ b/src/tools/compiletest/Cargo.toml @@ -8,3 +8,4 @@ build = "build.rs" log = "0.3" env_logger = { version = "0.3.5", default-features = false } serialize = { path = "../../libserialize" } +build_helper = { path = "../../build_helper" } diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 3cc14541fcdf2..d33a176b9147e 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +extern crate build_helper; + use common::Config; use common::{CompileFail, ParseFail, Pretty, RunFail, RunPass, RunPassValgrind}; use common::{Codegen, DebugInfoLldb, DebugInfoGdb, Rustdoc, CodegenUnits}; @@ -2108,7 +2110,7 @@ actual:\n\ } self.create_dir_racy(&tmpdir); - let mut cmd = Command::new("make"); + let mut cmd = Command::new(build_helper::make(&self.config.host)); cmd.current_dir(&self.testpaths.file) .env("TARGET", &self.config.target) .env("PYTHON", &self.config.docck_python) From 2c39ee12a99f9548a5e379e8bcea4f7923028fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sun, 18 Dec 2016 18:31:42 +0100 Subject: [PATCH 4/4] OpenBSD has two stdc++ libraries: use the newer stdc++ is from base, and is an old library (GCC 4.2) estdc++ is from ports, and is a recent library (GCC 4.9 currently) as LLVM requires the newer version, use it if under OpenBSD. --- src/librustc_llvm/build.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs index 50bc3e7b6243f..86c40a0208ad3 100644 --- a/src/librustc_llvm/build.rs +++ b/src/librustc_llvm/build.rs @@ -230,6 +230,13 @@ fn main() { } } + // OpenBSD has a particular C++ runtime library name + let stdcppname = if target.contains("openbsd") { + "estdc++" + } else { + "stdc++" + }; + // C++ runtime library if !target.contains("msvc") { if let Some(s) = env::var_os("LLVM_STATIC_STDCPP") { @@ -237,11 +244,11 @@ fn main() { let path = PathBuf::from(s); println!("cargo:rustc-link-search=native={}", path.parent().unwrap().display()); - println!("cargo:rustc-link-lib=static=stdc++"); + println!("cargo:rustc-link-lib=static={}", stdcppname); } else if cxxflags.contains("stdlib=libc++") { println!("cargo:rustc-link-lib=c++"); } else { - println!("cargo:rustc-link-lib=stdc++"); + println!("cargo:rustc-link-lib={}", stdcppname); } } }