mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Add Illumos support
This commit is contained in:
parent
9041b93058
commit
f189d7a693
13
configure
vendored
13
configure
vendored
@ -1,5 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/ksh is.
|
||||||
|
if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then
|
||||||
|
POSIX_SHELL="true"
|
||||||
|
export POSIX_SHELL
|
||||||
|
exec /usr/bin/bash $0 "$@"
|
||||||
|
fi
|
||||||
|
unset POSIX_SHELL # clear it so if we invoke other scripts, they run as ksh as well
|
||||||
|
|
||||||
msg() {
|
msg() {
|
||||||
echo "configure: $*"
|
echo "configure: $*"
|
||||||
}
|
}
|
||||||
@ -416,6 +424,11 @@ case $CFG_OSTYPE in
|
|||||||
CFG_OSTYPE=apple-darwin
|
CFG_OSTYPE=apple-darwin
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
SunOS)
|
||||||
|
CFG_OSTYPE=sun-solaris
|
||||||
|
CFG_CPUTYPE=$(isainfo -n)
|
||||||
|
;;
|
||||||
|
|
||||||
MINGW*)
|
MINGW*)
|
||||||
# msys' `uname` does not print gcc configuration, but prints msys
|
# msys' `uname` does not print gcc configuration, but prints msys
|
||||||
# configuration. so we cannot believe `uname -m`:
|
# configuration. so we cannot believe `uname -m`:
|
||||||
|
23
mk/cfg/x86_64-sun-solaris.mk
Normal file
23
mk/cfg/x86_64-sun-solaris.mk
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# x86_64-sun-solaris configuration
|
||||||
|
CROSS_PREFIX_x86_64-sun-solaris=x86_64-sun-solaris2.11-
|
||||||
|
CC_x86_64-sun-solaris=$(CC)
|
||||||
|
CXX_x86_64-sun-solaris=$(CXX)
|
||||||
|
CPP_x86_64-sun-solaris=$(CPP)
|
||||||
|
AR_x86_64-sun-solaris=$(AR)
|
||||||
|
CFG_LIB_NAME_x86_64-sun-solaris=lib$(1).so
|
||||||
|
CFG_STATIC_LIB_NAME_x86_64-sun-solaris=lib$(1).a
|
||||||
|
CFG_LIB_GLOB_x86_64-sun-solaris=lib$(1)-*.so
|
||||||
|
CFG_LIB_DSYM_GLOB_x86_64-sun-solaris=$(1)-*.dylib.dSYM
|
||||||
|
CFG_JEMALLOC_CFLAGS_x86_64-sun-solaris := -I/usr/local/include $(CFLAGS)
|
||||||
|
CFG_GCCISH_CFLAGS_x86_64-sun-solaris := -Wall -Werror -g -D_POSIX_PTHREAD_SEMANTICS -fPIC -I/usr/local/include $(CFLAGS)
|
||||||
|
CFG_GCCISH_LINK_FLAGS_x86_64-sun-solaris := -shared -fPIC -g -pthread -lrt
|
||||||
|
CFG_GCCISH_DEF_FLAG_x86_64-sun-solaris := -Wl,--export-dynamic,--dynamic-list=
|
||||||
|
CFG_LLC_FLAGS_x86_64-sun-solaris :=
|
||||||
|
CFG_INSTALL_NAME_x86_64-sun-solaris =
|
||||||
|
CFG_EXE_SUFFIX_x86_64-sun-solaris :=
|
||||||
|
CFG_WINDOWSY_x86_64-sun-solaris :=
|
||||||
|
CFG_UNIXY_x86_64-sun-solaris := 1
|
||||||
|
CFG_LDPATH_x86_64-sun-solaris :=
|
||||||
|
CFG_RUN_x86_64-sun-solaris=$(2)
|
||||||
|
CFG_RUN_TARG_x86_64-sun-solaris=$(call CFG_RUN_x86_64-sun-solaris,,$(2))
|
||||||
|
CFG_GNU_TRIPLE_x86_64-sun-solaris := x86_64-sun-solaris
|
@ -25,6 +25,7 @@ const OS_TABLE: &'static [(&'static str, &'static str)] = &[
|
|||||||
("openbsd", "openbsd"),
|
("openbsd", "openbsd"),
|
||||||
("win32", "windows"),
|
("win32", "windows"),
|
||||||
("windows", "windows"),
|
("windows", "windows"),
|
||||||
|
("solaris", "sunos"),
|
||||||
];
|
];
|
||||||
|
|
||||||
const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[
|
const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[
|
||||||
|
@ -18,7 +18,7 @@ LIB_PREFIX=lib
|
|||||||
|
|
||||||
OS=`uname -s`
|
OS=`uname -s`
|
||||||
case $OS in
|
case $OS in
|
||||||
("Linux"|"FreeBSD"|"DragonFly"|"Bitrig"|"OpenBSD")
|
("Linux"|"FreeBSD"|"DragonFly"|"Bitrig"|"OpenBSD"|"SunOS")
|
||||||
BIN_SUF=
|
BIN_SUF=
|
||||||
LIB_SUF=.so
|
LIB_SUF=.so
|
||||||
;;
|
;;
|
||||||
|
@ -48,6 +48,7 @@ snapshot_files = {
|
|||||||
"macos": ["bin/rustc"],
|
"macos": ["bin/rustc"],
|
||||||
"netbsd": ["bin/rustc"],
|
"netbsd": ["bin/rustc"],
|
||||||
"openbsd": ["bin/rustc"],
|
"openbsd": ["bin/rustc"],
|
||||||
|
"sunos": ["bin/rustc"],
|
||||||
"winnt": ["bin/rustc.exe"],
|
"winnt": ["bin/rustc.exe"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +59,7 @@ mod freebsd_base;
|
|||||||
mod linux_base;
|
mod linux_base;
|
||||||
mod openbsd_base;
|
mod openbsd_base;
|
||||||
mod netbsd_base;
|
mod netbsd_base;
|
||||||
|
mod sunos_base;
|
||||||
mod windows_base;
|
mod windows_base;
|
||||||
mod windows_msvc_base;
|
mod windows_msvc_base;
|
||||||
|
|
||||||
@ -155,6 +156,10 @@ pub struct TargetOptions {
|
|||||||
/// Whether the target toolchain is like OSX's. Only useful for compiling against iOS/OS X, in
|
/// Whether the target toolchain is like OSX's. Only useful for compiling against iOS/OS X, in
|
||||||
/// particular running dsymutil and some other stuff like `-dead_strip`. Defaults to false.
|
/// particular running dsymutil and some other stuff like `-dead_strip`. Defaults to false.
|
||||||
pub is_like_osx: bool,
|
pub is_like_osx: bool,
|
||||||
|
/// Whether the target toolchain is like Solaris's.
|
||||||
|
/// Only useful for compiling against Illumos/Solaris,
|
||||||
|
/// as they have a different set of linker flags. Defaults to false.
|
||||||
|
pub is_like_sunos: bool,
|
||||||
/// Whether the target toolchain is like Windows'. Only useful for compiling against Windows,
|
/// Whether the target toolchain is like Windows'. Only useful for compiling against Windows,
|
||||||
/// only really used for figuring out how to find libraries, since Windows uses its own
|
/// only really used for figuring out how to find libraries, since Windows uses its own
|
||||||
/// library naming convention. Defaults to false.
|
/// library naming convention. Defaults to false.
|
||||||
@ -227,6 +232,7 @@ impl Default for TargetOptions {
|
|||||||
staticlib_suffix: ".a".to_string(),
|
staticlib_suffix: ".a".to_string(),
|
||||||
target_family: None,
|
target_family: None,
|
||||||
is_like_osx: false,
|
is_like_osx: false,
|
||||||
|
is_like_sunos: false,
|
||||||
is_like_windows: false,
|
is_like_windows: false,
|
||||||
is_like_android: false,
|
is_like_android: false,
|
||||||
is_like_msvc: false,
|
is_like_msvc: false,
|
||||||
@ -447,6 +453,8 @@ impl Target {
|
|||||||
armv7_apple_ios,
|
armv7_apple_ios,
|
||||||
armv7s_apple_ios,
|
armv7s_apple_ios,
|
||||||
|
|
||||||
|
x86_64_sun_solaris,
|
||||||
|
|
||||||
x86_64_pc_windows_gnu,
|
x86_64_pc_windows_gnu,
|
||||||
i686_pc_windows_gnu,
|
i686_pc_windows_gnu,
|
||||||
|
|
||||||
|
26
src/librustc_back/target/sunos_base.rs
Normal file
26
src/librustc_back/target/sunos_base.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
use target::TargetOptions;
|
||||||
|
use std::default::Default;
|
||||||
|
|
||||||
|
pub fn opts() -> TargetOptions {
|
||||||
|
TargetOptions {
|
||||||
|
linker: "cc".to_string(),
|
||||||
|
dynamic_linking: true,
|
||||||
|
executables: true,
|
||||||
|
has_rpath: true,
|
||||||
|
is_like_sunos: true,
|
||||||
|
archive_format: "gnu".to_string(),
|
||||||
|
exe_allocation_crate: super::maybe_jemalloc(),
|
||||||
|
|
||||||
|
.. Default::default()
|
||||||
|
}
|
||||||
|
}
|
29
src/librustc_back/target/x86_64_sun_solaris.rs
Normal file
29
src/librustc_back/target/x86_64_sun_solaris.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
use target::Target;
|
||||||
|
|
||||||
|
pub fn target() -> Target {
|
||||||
|
let mut base = super::sunos_base::opts();
|
||||||
|
base.pre_link_args.push("-m64".to_string());
|
||||||
|
base.pre_link_args.push("-lsocket".to_string());
|
||||||
|
base.pre_link_args.push("-lposix4".to_string());
|
||||||
|
|
||||||
|
Target {
|
||||||
|
llvm_target: "x86_64-pc-solaris2.11".to_string(),
|
||||||
|
target_endian: "little".to_string(),
|
||||||
|
target_pointer_width: "64".to_string(),
|
||||||
|
arch: "x86_64".to_string(),
|
||||||
|
target_os: "sunos".to_string(),
|
||||||
|
target_env: "".to_string(),
|
||||||
|
target_vendor: "sun".to_string(),
|
||||||
|
options: base,
|
||||||
|
}
|
||||||
|
}
|
@ -131,6 +131,9 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
// insert it here.
|
// insert it here.
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.target.options.is_like_osx {
|
||||||
self.cmd.arg("-Wl,-dead_strip");
|
self.cmd.arg("-Wl,-dead_strip");
|
||||||
|
} else if self.sess.target.target.options.is_like_sunos {
|
||||||
|
self.cmd.arg("-Wl,-z");
|
||||||
|
self.cmd.arg("-Wl,ignore");
|
||||||
|
|
||||||
// If we're building a dylib, we don't use --gc-sections because LLVM
|
// If we're building a dylib, we don't use --gc-sections because LLVM
|
||||||
// has already done the best it can do, and we also don't want to
|
// has already done the best it can do, and we also don't want to
|
||||||
|
@ -111,6 +111,27 @@ mod imp {
|
|||||||
pub const F_SETLKW: libc::c_int = 9;
|
pub const F_SETLKW: libc::c_int = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
mod os {
|
||||||
|
use libc;
|
||||||
|
|
||||||
|
pub struct flock {
|
||||||
|
pub l_type: libc::c_short,
|
||||||
|
pub l_whence: libc::c_short,
|
||||||
|
pub l_start: libc::off_t,
|
||||||
|
pub l_len: libc::off_t,
|
||||||
|
pub l_sysid: libc::c_int,
|
||||||
|
pub l_pid: libc::pid_t,
|
||||||
|
|
||||||
|
// __unused1: [libc::c_long; 4]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const F_WRLCK: libc::c_short = 2;
|
||||||
|
pub const F_UNLCK: libc::c_short = 3;
|
||||||
|
pub const F_SETLK: libc::c_int = 6;
|
||||||
|
pub const F_SETLKW: libc::c_int = 7;
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Lock {
|
pub struct Lock {
|
||||||
fd: libc::c_int,
|
fd: libc::c_int,
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,8 @@ mod tests {
|
|||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
fn test_errors_do_not_crash() {
|
fn test_errors_do_not_crash() {
|
||||||
use path::Path;
|
use path::Path;
|
||||||
@ -195,7 +196,8 @@ mod tests {
|
|||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
mod dl {
|
mod dl {
|
||||||
use prelude::v1::*;
|
use prelude::v1::*;
|
||||||
|
|
||||||
|
@ -642,6 +642,7 @@ pub mod consts {
|
|||||||
/// - bitrig
|
/// - bitrig
|
||||||
/// - netbsd
|
/// - netbsd
|
||||||
/// - openbsd
|
/// - openbsd
|
||||||
|
/// - sunos
|
||||||
/// - android
|
/// - android
|
||||||
/// - windows
|
/// - windows
|
||||||
#[stable(feature = "env", since = "1.0.0")]
|
#[stable(feature = "env", since = "1.0.0")]
|
||||||
@ -802,6 +803,17 @@ mod os {
|
|||||||
pub const EXE_EXTENSION: &'static str = "";
|
pub const EXE_EXTENSION: &'static str = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
mod os {
|
||||||
|
pub const FAMILY: &'static str = "unix";
|
||||||
|
pub const OS: &'static str = "sunos";
|
||||||
|
pub const DLL_PREFIX: &'static str = "lib";
|
||||||
|
pub const DLL_SUFFIX: &'static str = ".so";
|
||||||
|
pub const DLL_EXTENSION: &'static str = "so";
|
||||||
|
pub const EXE_SUFFIX: &'static str = "";
|
||||||
|
pub const EXE_EXTENSION: &'static str = "";
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
mod os {
|
mod os {
|
||||||
pub const FAMILY: &'static str = "windows";
|
pub const FAMILY: &'static str = "windows";
|
||||||
|
@ -84,6 +84,38 @@ mod cmath {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "sunos"))]
|
||||||
|
macro_rules! log_wrapper {
|
||||||
|
($num:ident, $f:ident) => (
|
||||||
|
unsafe { intrinsics::$f($num) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Illumos requires a wrapper around log, log2, and log10 functions
|
||||||
|
// because of non-standard behavior (e.g. log(-n) returns -Inf instead
|
||||||
|
// of expected NaN).
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
macro_rules! log_wrapper {
|
||||||
|
($num:ident, $f:ident) => (
|
||||||
|
if $num.is_finite() {
|
||||||
|
if $num > 0.0 {
|
||||||
|
return unsafe { intrinsics::$f($num) }
|
||||||
|
}
|
||||||
|
return if $num == 0.0 {
|
||||||
|
NEG_INFINITY // log(0) = -Inf
|
||||||
|
} else {
|
||||||
|
NAN // log(-ve) = NaN
|
||||||
|
}
|
||||||
|
} else if $num.is_nan() {
|
||||||
|
$num // log(NaN) = NaN
|
||||||
|
} else if $num > 0.0 {
|
||||||
|
$num // log(Inf) = Inf
|
||||||
|
} else {
|
||||||
|
return NAN // log(-Inf) = NaN
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
#[lang = "f64"]
|
#[lang = "f64"]
|
||||||
impl f64 {
|
impl f64 {
|
||||||
@ -511,7 +543,7 @@ impl f64 {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn ln(self) -> f64 {
|
pub fn ln(self) -> f64 {
|
||||||
unsafe { intrinsics::logf64(self) }
|
log_wrapper!(self, logf64)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the logarithm of the number with respect to an arbitrary base.
|
/// Returns the logarithm of the number with respect to an arbitrary base.
|
||||||
@ -546,7 +578,7 @@ impl f64 {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn log2(self) -> f64 {
|
pub fn log2(self) -> f64 {
|
||||||
unsafe { intrinsics::log2f64(self) }
|
log_wrapper!(self, log2f64)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the base 10 logarithm of the number.
|
/// Returns the base 10 logarithm of the number.
|
||||||
@ -562,7 +594,7 @@ impl f64 {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn log10(self) -> f64 {
|
pub fn log10(self) -> f64 {
|
||||||
unsafe { intrinsics::log10f64(self) }
|
log_wrapper!(self, log10f64)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Converts radians to degrees.
|
/// Converts radians to degrees.
|
||||||
|
@ -30,5 +30,6 @@ pub use sys::ext as windows;
|
|||||||
#[cfg(target_os = "nacl")] pub mod nacl;
|
#[cfg(target_os = "nacl")] pub mod nacl;
|
||||||
#[cfg(target_os = "netbsd")] pub mod netbsd;
|
#[cfg(target_os = "netbsd")] pub mod netbsd;
|
||||||
#[cfg(target_os = "openbsd")] pub mod openbsd;
|
#[cfg(target_os = "openbsd")] pub mod openbsd;
|
||||||
|
#[cfg(target_os = "sunos")] pub mod sunos;
|
||||||
|
|
||||||
pub mod raw;
|
pub mod raw;
|
||||||
|
21
src/libstd/os/sunos/mod.rs
Normal file
21
src/libstd/os/sunos/mod.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
//! Solaris-specific definitions
|
||||||
|
|
||||||
|
#![stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
|
||||||
|
pub mod raw;
|
||||||
|
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub mod fs {
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub use sys::fs::MetadataExt;
|
||||||
|
}
|
68
src/libstd/os/sunos/raw.rs
Normal file
68
src/libstd/os/sunos/raw.rs
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
//! Solaris-specific raw type definitions
|
||||||
|
|
||||||
|
#![stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
|
||||||
|
use os::raw::c_long;
|
||||||
|
use os::unix::raw::{uid_t, gid_t};
|
||||||
|
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i64;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = u32;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type dev_t = u64;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type fflags_t = u32;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = i64;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type mode_t = u32;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64;
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64;
|
||||||
|
|
||||||
|
#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize;
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone)]
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub struct stat {
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_dev: dev_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_ino: ino_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_mode: mode_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_nlink: nlink_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_uid: uid_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_gid: gid_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_rdev: dev_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_size: off_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_atime: time_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_atime_nsec: c_long,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_mtime: time_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_mtime_nsec: c_long,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_ctime: time_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_ctime_nsec: c_long,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_blksize: blksize_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub st_blocks: blkcnt_t,
|
||||||
|
#[stable(feature = "raw_ext", since = "1.1.0")]
|
||||||
|
pub __unused: [u8; 16]
|
||||||
|
}
|
@ -38,7 +38,8 @@ pub fn clone() -> Option<Vec<Vec<u8>>> { imp::clone() }
|
|||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
mod imp {
|
mod imp {
|
||||||
use prelude::v1::*;
|
use prelude::v1::*;
|
||||||
|
|
||||||
|
@ -102,6 +102,7 @@ pub type _Unwind_Exception_Cleanup_Fn =
|
|||||||
|
|
||||||
#[cfg_attr(any(all(target_os = "linux", not(target_env = "musl")),
|
#[cfg_attr(any(all(target_os = "linux", not(target_env = "musl")),
|
||||||
target_os = "freebsd",
|
target_os = "freebsd",
|
||||||
|
target_os = "sunos",
|
||||||
all(target_os = "linux", target_env = "musl", not(target_arch = "x86_64"))),
|
all(target_os = "linux", target_env = "musl", not(target_arch = "x86_64"))),
|
||||||
link(name = "gcc_s"))]
|
link(name = "gcc_s"))]
|
||||||
#[cfg_attr(all(target_os = "linux", target_env = "musl", target_arch = "x86_64", not(test)),
|
#[cfg_attr(all(target_os = "linux", target_env = "musl", target_arch = "x86_64", not(test)),
|
||||||
|
@ -50,14 +50,14 @@ impl FileDesc {
|
|||||||
Ok(ret as usize)
|
Ok(ret as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(target_env = "newlib"))]
|
#[cfg(not(any(target_env = "newlib", target_os = "sunos")))]
|
||||||
pub fn set_cloexec(&self) {
|
pub fn set_cloexec(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let ret = libc::ioctl(self.fd, libc::FIOCLEX);
|
let ret = libc::ioctl(self.fd, libc::FIOCLEX);
|
||||||
debug_assert_eq!(ret, 0);
|
debug_assert_eq!(ret, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(target_env = "newlib")]
|
#[cfg(any(target_env = "newlib", target_os = "sunos"))]
|
||||||
pub fn set_cloexec(&self) {
|
pub fn set_cloexec(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let previous = libc::fcntl(self.fd, libc::F_GETFD);
|
let previous = libc::fcntl(self.fd, libc::F_GETFD);
|
||||||
|
@ -14,8 +14,7 @@ use os::unix::prelude::*;
|
|||||||
use ffi::{CString, CStr, OsString, OsStr};
|
use ffi::{CString, CStr, OsString, OsStr};
|
||||||
use fmt;
|
use fmt;
|
||||||
use io::{self, Error, ErrorKind, SeekFrom};
|
use io::{self, Error, ErrorKind, SeekFrom};
|
||||||
use libc::{dirent, readdir_r};
|
use libc::{self, dirent, c_int, off_t, mode_t};
|
||||||
use libc::{self, c_int, off_t, mode_t};
|
|
||||||
use mem;
|
use mem;
|
||||||
use path::{Path, PathBuf};
|
use path::{Path, PathBuf};
|
||||||
use ptr;
|
use ptr;
|
||||||
@ -25,6 +24,8 @@ use sys::platform::raw;
|
|||||||
use sys::{cvt, cvt_r};
|
use sys::{cvt, cvt_r};
|
||||||
use sys_common::{AsInner, FromInner};
|
use sys_common::{AsInner, FromInner};
|
||||||
use vec::Vec;
|
use vec::Vec;
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
use core_collections::borrow::ToOwned;
|
||||||
|
|
||||||
pub struct File(FileDesc);
|
pub struct File(FileDesc);
|
||||||
|
|
||||||
@ -46,6 +47,12 @@ unsafe impl Sync for Dir {}
|
|||||||
pub struct DirEntry {
|
pub struct DirEntry {
|
||||||
entry: dirent,
|
entry: dirent,
|
||||||
root: Arc<PathBuf>,
|
root: Arc<PathBuf>,
|
||||||
|
// We need to store an owned copy of the directory name
|
||||||
|
// on Solaris because a) it uses a zero-length array to
|
||||||
|
// store the name, b) its lifetime between readdir calls
|
||||||
|
// is not guaranteed.
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
name: Arc<Vec<u8>>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -132,6 +139,32 @@ impl FromInner<raw::mode_t> for FilePermissions {
|
|||||||
impl Iterator for ReadDir {
|
impl Iterator for ReadDir {
|
||||||
type Item = io::Result<DirEntry>;
|
type Item = io::Result<DirEntry>;
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
fn next(&mut self) -> Option<io::Result<DirEntry>> {
|
||||||
|
unsafe {
|
||||||
|
loop {
|
||||||
|
let entry_ptr = libc::readdir(self.dirp.0);
|
||||||
|
if entry_ptr.is_null() {
|
||||||
|
return None
|
||||||
|
}
|
||||||
|
|
||||||
|
let name = (*entry_ptr).d_name.as_ptr();
|
||||||
|
let namelen = libc::strlen(name) as usize;
|
||||||
|
|
||||||
|
let ret = DirEntry {
|
||||||
|
entry: *entry_ptr,
|
||||||
|
name: Arc::new(::slice::from_raw_parts(name as *const u8,
|
||||||
|
namelen as usize).to_owned()),
|
||||||
|
root: self.root.clone()
|
||||||
|
};
|
||||||
|
if ret.name_bytes() != b"." && ret.name_bytes() != b".." {
|
||||||
|
return Some(Ok(ret))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "sunos"))]
|
||||||
fn next(&mut self) -> Option<io::Result<DirEntry>> {
|
fn next(&mut self) -> Option<io::Result<DirEntry>> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut ret = DirEntry {
|
let mut ret = DirEntry {
|
||||||
@ -140,7 +173,7 @@ impl Iterator for ReadDir {
|
|||||||
};
|
};
|
||||||
let mut entry_ptr = ptr::null_mut();
|
let mut entry_ptr = ptr::null_mut();
|
||||||
loop {
|
loop {
|
||||||
if readdir_r(self.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 {
|
if libc::readdir_r(self.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 {
|
||||||
return Some(Err(Error::last_os_error()))
|
return Some(Err(Error::last_os_error()))
|
||||||
}
|
}
|
||||||
if entry_ptr.is_null() {
|
if entry_ptr.is_null() {
|
||||||
@ -174,6 +207,12 @@ impl DirEntry {
|
|||||||
lstat(&self.path())
|
lstat(&self.path())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
pub fn file_type(&self) -> io::Result<FileType> {
|
||||||
|
stat(&self.path()).map(|m| m.file_type())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "sunos"))]
|
||||||
pub fn file_type(&self) -> io::Result<FileType> {
|
pub fn file_type(&self) -> io::Result<FileType> {
|
||||||
match self.entry.d_type {
|
match self.entry.d_type {
|
||||||
libc::DT_CHR => Ok(FileType { mode: libc::S_IFCHR }),
|
libc::DT_CHR => Ok(FileType { mode: libc::S_IFCHR }),
|
||||||
@ -189,7 +228,8 @@ impl DirEntry {
|
|||||||
|
|
||||||
#[cfg(any(target_os = "macos",
|
#[cfg(any(target_os = "macos",
|
||||||
target_os = "ios",
|
target_os = "ios",
|
||||||
target_os = "linux"))]
|
target_os = "linux",
|
||||||
|
target_os = "sunos"))]
|
||||||
pub fn ino(&self) -> raw::ino_t {
|
pub fn ino(&self) -> raw::ino_t {
|
||||||
self.entry.d_ino
|
self.entry.d_ino
|
||||||
}
|
}
|
||||||
@ -234,6 +274,10 @@ impl DirEntry {
|
|||||||
CStr::from_ptr(self.entry.d_name.as_ptr()).to_bytes()
|
CStr::from_ptr(self.entry.d_name.as_ptr()).to_bytes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
fn name_bytes(&self) -> &[u8] {
|
||||||
|
&*self.name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OpenOptions {
|
impl OpenOptions {
|
||||||
|
@ -25,6 +25,7 @@ use ops::Neg;
|
|||||||
#[cfg(target_os = "nacl")] pub use os::nacl as platform;
|
#[cfg(target_os = "nacl")] pub use os::nacl as platform;
|
||||||
#[cfg(target_os = "netbsd")] pub use os::netbsd as platform;
|
#[cfg(target_os = "netbsd")] pub use os::netbsd as platform;
|
||||||
#[cfg(target_os = "openbsd")] pub use os::openbsd as platform;
|
#[cfg(target_os = "openbsd")] pub use os::openbsd as platform;
|
||||||
|
#[cfg(target_os = "sunos")] pub use os::sunos as platform;
|
||||||
|
|
||||||
pub mod backtrace;
|
pub mod backtrace;
|
||||||
pub mod condvar;
|
pub mod condvar;
|
||||||
|
@ -45,6 +45,7 @@ pub fn errno() -> i32 {
|
|||||||
target_os = "android",
|
target_os = "android",
|
||||||
target_env = "newlib"),
|
target_env = "newlib"),
|
||||||
link_name = "__errno")]
|
link_name = "__errno")]
|
||||||
|
#[cfg_attr(target_os = "sunos", link_name = "___errno")]
|
||||||
#[cfg_attr(target_os = "dragonfly", link_name = "__dfly_error")]
|
#[cfg_attr(target_os = "dragonfly", link_name = "__dfly_error")]
|
||||||
#[cfg_attr(any(target_os = "macos",
|
#[cfg_attr(any(target_os = "macos",
|
||||||
target_os = "ios",
|
target_os = "ios",
|
||||||
@ -257,6 +258,28 @@ pub fn current_exe() -> io::Result<PathBuf> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "sunos"))]
|
||||||
|
pub fn current_exe() -> io::Result<PathBuf> {
|
||||||
|
extern {
|
||||||
|
fn getexecname() -> *const c_char;
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
let path = getexecname();
|
||||||
|
if path.is_null() {
|
||||||
|
Err(io::Error::last_os_error())
|
||||||
|
} else {
|
||||||
|
let filename = CStr::from_ptr(path).to_bytes();
|
||||||
|
if filename[0] == b'/' {
|
||||||
|
Ok(PathBuf::from(<OsStr as OsStrExt>::from_bytes(filename)))
|
||||||
|
} else {
|
||||||
|
// Prepend current working directory to the path if
|
||||||
|
// it doesn't contain an absolute pathname.
|
||||||
|
return getcwd().map(|cwd| cwd.join(<OsStr as OsStrExt>::from_bytes(filename)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Args {
|
pub struct Args {
|
||||||
iter: vec::IntoIter<OsString>,
|
iter: vec::IntoIter<OsString>,
|
||||||
_dont_send_or_sync_me: *mut (),
|
_dont_send_or_sync_me: *mut (),
|
||||||
@ -359,6 +382,7 @@ pub fn args() -> Args {
|
|||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd",
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos",
|
||||||
target_os = "nacl"))]
|
target_os = "nacl"))]
|
||||||
pub fn args() -> Args {
|
pub fn args() -> Args {
|
||||||
use sys_common;
|
use sys_common;
|
||||||
@ -481,6 +505,28 @@ pub fn home_dir() -> Option<PathBuf> {
|
|||||||
fallback()
|
fallback()
|
||||||
}).map(PathBuf::from);
|
}).map(PathBuf::from);
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "sunos"))]
|
||||||
|
unsafe fn getpwduid_r(me: libc::uid_t, passwd: &mut libc::passwd,
|
||||||
|
buf: &mut Vec<c_char>) -> Option<()> {
|
||||||
|
let mut result = ptr::null_mut();
|
||||||
|
match libc::getpwuid_r(me, passwd, buf.as_mut_ptr(),
|
||||||
|
buf.capacity() as libc::size_t,
|
||||||
|
&mut result) {
|
||||||
|
0 if !result.is_null() => Some(()),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
unsafe fn getpwduid_r(me: libc::uid_t, passwd: &mut libc::passwd,
|
||||||
|
buf: &mut Vec<c_char>) -> Option<()> {
|
||||||
|
// getpwuid_r semantics is different on Illumos/Solaris:
|
||||||
|
// http://illumos.org/man/3c/getpwuid_r
|
||||||
|
let result = libc::getpwuid_r(me, passwd, buf.as_mut_ptr(),
|
||||||
|
buf.capacity() as libc::size_t);
|
||||||
|
if result.is_null() { None } else { Some(()) }
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "android",
|
#[cfg(any(target_os = "android",
|
||||||
target_os = "ios",
|
target_os = "ios",
|
||||||
target_os = "nacl"))]
|
target_os = "nacl"))]
|
||||||
@ -497,16 +543,14 @@ pub fn home_dir() -> Option<PathBuf> {
|
|||||||
loop {
|
loop {
|
||||||
let mut buf = Vec::with_capacity(amt);
|
let mut buf = Vec::with_capacity(amt);
|
||||||
let mut passwd: libc::passwd = mem::zeroed();
|
let mut passwd: libc::passwd = mem::zeroed();
|
||||||
let mut result = ptr::null_mut();
|
|
||||||
match libc::getpwuid_r(me, &mut passwd, buf.as_mut_ptr(),
|
if getpwduid_r(me, &mut passwd, &mut buf).is_some() {
|
||||||
buf.capacity() as libc::size_t,
|
let ptr = passwd.pw_dir as *const _;
|
||||||
&mut result) {
|
let bytes = CStr::from_ptr(ptr).to_bytes().to_vec();
|
||||||
0 if !result.is_null() => {}
|
return Some(OsStringExt::from_vec(bytes))
|
||||||
_ => return None
|
} else {
|
||||||
|
return None;
|
||||||
}
|
}
|
||||||
let ptr = passwd.pw_dir as *const _;
|
|
||||||
let bytes = CStr::from_ptr(ptr).to_bytes().to_vec();
|
|
||||||
return Some(OsStringExt::from_vec(bytes))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ fn os2c(s: &OsStr) -> CString {
|
|||||||
pub struct ExitStatus(c_int);
|
pub struct ExitStatus(c_int);
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android",
|
#[cfg(any(target_os = "linux", target_os = "android",
|
||||||
target_os = "nacl"))]
|
target_os = "nacl", target_os = "sunos"))]
|
||||||
mod status_imp {
|
mod status_imp {
|
||||||
pub fn WIFEXITED(status: i32) -> bool { (status & 0xff) == 0 }
|
pub fn WIFEXITED(status: i32) -> bool { (status & 0xff) == 0 }
|
||||||
pub fn WEXITSTATUS(status: i32) -> i32 { (status >> 8) & 0xff }
|
pub fn WEXITSTATUS(status: i32) -> i32 { (status >> 8) & 0xff }
|
||||||
|
@ -39,6 +39,7 @@ impl Drop for Handler {
|
|||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "freebsd",
|
target_os = "freebsd",
|
||||||
|
target_os = "sunos",
|
||||||
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd"))]
|
||||||
mod imp {
|
mod imp {
|
||||||
@ -167,6 +168,7 @@ mod imp {
|
|||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "freebsd",
|
target_os = "freebsd",
|
||||||
|
target_os = "sunos",
|
||||||
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
||||||
target_os = "openbsd")))]
|
target_os = "openbsd")))]
|
||||||
mod imp {
|
mod imp {
|
||||||
|
@ -12,7 +12,7 @@ use prelude::v1::*;
|
|||||||
|
|
||||||
use alloc::boxed::FnBox;
|
use alloc::boxed::FnBox;
|
||||||
use cmp;
|
use cmp;
|
||||||
#[cfg(not(target_env = "newlib"))]
|
#[cfg(not(any(target_env = "newlib", target_os = "sunos")))]
|
||||||
use ffi::CString;
|
use ffi::CString;
|
||||||
use io;
|
use io;
|
||||||
use libc;
|
use libc;
|
||||||
@ -122,9 +122,9 @@ impl Thread {
|
|||||||
carg.as_ptr() as *mut libc::c_void);
|
carg.as_ptr() as *mut libc::c_void);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(target_env = "newlib")]
|
#[cfg(any(target_env = "newlib", target_os = "sunos"))]
|
||||||
pub unsafe fn set_name(_name: &str) {
|
pub fn set_name(_name: &str) {
|
||||||
// Newlib has no way to set a thread name.
|
// Newlib and Illumos has no way to set a thread name.
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sleep(dur: Duration) {
|
pub fn sleep(dur: Duration) {
|
||||||
@ -170,7 +170,8 @@ impl Drop for Thread {
|
|||||||
not(target_os = "macos"),
|
not(target_os = "macos"),
|
||||||
not(target_os = "bitrig"),
|
not(target_os = "bitrig"),
|
||||||
not(all(target_os = "netbsd", not(target_vendor = "rumprun"))),
|
not(all(target_os = "netbsd", not(target_vendor = "rumprun"))),
|
||||||
not(target_os = "openbsd")))]
|
not(target_os = "openbsd"),
|
||||||
|
not(target_os = "sunos")))]
|
||||||
#[cfg_attr(test, allow(dead_code))]
|
#[cfg_attr(test, allow(dead_code))]
|
||||||
pub mod guard {
|
pub mod guard {
|
||||||
pub unsafe fn current() -> Option<usize> { None }
|
pub unsafe fn current() -> Option<usize> { None }
|
||||||
@ -182,7 +183,8 @@ pub mod guard {
|
|||||||
target_os = "macos",
|
target_os = "macos",
|
||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
all(target_os = "netbsd", not(target_vendor = "rumprun")),
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
#[cfg_attr(test, allow(dead_code))]
|
#[cfg_attr(test, allow(dead_code))]
|
||||||
pub mod guard {
|
pub mod guard {
|
||||||
use prelude::v1::*;
|
use prelude::v1::*;
|
||||||
@ -194,7 +196,8 @@ pub mod guard {
|
|||||||
|
|
||||||
#[cfg(any(target_os = "macos",
|
#[cfg(any(target_os = "macos",
|
||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
|
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
|
||||||
current().map(|s| s as *mut libc::c_void)
|
current().map(|s| s as *mut libc::c_void)
|
||||||
}
|
}
|
||||||
@ -253,6 +256,13 @@ pub mod guard {
|
|||||||
Some(stackaddr as usize + offset * psize)
|
Some(stackaddr as usize + offset * psize)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "sunos")]
|
||||||
|
pub unsafe fn current() -> Option<usize> {
|
||||||
|
let mut current_stack: libc::stack_t = mem::zeroed();
|
||||||
|
assert_eq!(libc::stack_getbounds(&mut current_stack), 0);
|
||||||
|
Some(current_stack.ss_sp as usize)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub unsafe fn current() -> Option<usize> {
|
pub unsafe fn current() -> Option<usize> {
|
||||||
Some((libc::pthread_get_stackaddr_np(libc::pthread_self()) as libc::size_t -
|
Some((libc::pthread_get_stackaddr_np(libc::pthread_self()) as libc::size_t -
|
||||||
|
@ -28,6 +28,7 @@ pub enum Os {
|
|||||||
OsNetbsd,
|
OsNetbsd,
|
||||||
OsOpenbsd,
|
OsOpenbsd,
|
||||||
OsNaCl,
|
OsNaCl,
|
||||||
|
OsSunos,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
|
#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
|
||||||
@ -147,6 +148,7 @@ impl fmt::Display for Os {
|
|||||||
OsNetbsd => "netbsd".fmt(f),
|
OsNetbsd => "netbsd".fmt(f),
|
||||||
OsOpenbsd => "openbsd".fmt(f),
|
OsOpenbsd => "openbsd".fmt(f),
|
||||||
OsNaCl => "nacl".fmt(f),
|
OsNaCl => "nacl".fmt(f),
|
||||||
|
OsSunos => "sunos".fmt(f),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -927,7 +927,8 @@ fn get_concurrency() -> usize {
|
|||||||
#[cfg(any(target_os = "linux",
|
#[cfg(any(target_os = "linux",
|
||||||
target_os = "macos",
|
target_os = "macos",
|
||||||
target_os = "ios",
|
target_os = "ios",
|
||||||
target_os = "android"))]
|
target_os = "android",
|
||||||
|
target_os = "sunos"))]
|
||||||
fn num_cpus() -> usize {
|
fn num_cpus() -> usize {
|
||||||
unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) as usize }
|
unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) as usize }
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// ignore-bitrig
|
// ignore-bitrig
|
||||||
|
// ignore-sunos
|
||||||
// ignore-windows failing on win32 bot
|
// ignore-windows failing on win32 bot
|
||||||
// ignore-freebsd: gdb package too new
|
// ignore-freebsd: gdb package too new
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
@ -4,4 +4,4 @@ all: foo.rs
|
|||||||
$(RUSTC) --cfg 'feature="bar"' --crate-type lib foo.rs
|
$(RUSTC) --cfg 'feature="bar"' --crate-type lib foo.rs
|
||||||
$(HOST_RPATH_ENV) $(RUSTDOC) --test --cfg 'feature="bar"' \
|
$(HOST_RPATH_ENV) $(RUSTDOC) --test --cfg 'feature="bar"' \
|
||||||
-L $(TMPDIR) foo.rs |\
|
-L $(TMPDIR) foo.rs |\
|
||||||
grep --quiet 'test foo_0 ... ok'
|
grep -q 'test foo_0 ... ok'
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs --target=my-awesome-platform.json --crate-type=lib --emit=asm
|
$(RUSTC) foo.rs --target=my-awesome-platform.json --crate-type=lib --emit=asm
|
||||||
grep -q -v morestack < $(TMPDIR)/foo.s
|
grep -q -v morestack < $(TMPDIR)/foo.s
|
||||||
$(RUSTC) foo.rs --target=my-invalid-platform.json 2>&1 | grep --quiet "Error loading target specification"
|
$(RUSTC) foo.rs --target=my-invalid-platform.json 2>&1 | grep -q "Error loading target specification"
|
||||||
$(RUSTC) foo.rs --target=my-incomplete-platform.json 2>&1 | grep 'Field llvm-target'
|
$(RUSTC) foo.rs --target=my-incomplete-platform.json 2>&1 | grep 'Field llvm-target'
|
||||||
RUST_TARGET_PATH=. $(RUSTC) foo.rs --target=my-awesome-platform --crate-type=lib --emit=asm
|
RUST_TARGET_PATH=. $(RUSTC) foo.rs --target=my-awesome-platform --crate-type=lib --emit=asm
|
||||||
RUST_TARGET_PATH=. $(RUSTC) foo.rs --target=x86_64-unknown-linux-gnu --crate-type=lib --emit=asm
|
RUST_TARGET_PATH=. $(RUSTC) foo.rs --target=x86_64-unknown-linux-gnu --crate-type=lib --emit=asm
|
||||||
|
@ -83,6 +83,9 @@ ifeq ($(UNAME),Bitrig)
|
|||||||
EXTRACFLAGS := -lm -lpthread
|
EXTRACFLAGS := -lm -lpthread
|
||||||
EXTRACXXFLAGS := -lc++ -lc++abi
|
EXTRACXXFLAGS := -lc++ -lc++abi
|
||||||
else
|
else
|
||||||
|
ifeq ($(UNAME),SunOS)
|
||||||
|
EXTRACFLAGS := -lm -lpthread -lposix4 -lsocket
|
||||||
|
else
|
||||||
ifeq ($(UNAME),OpenBSD)
|
ifeq ($(UNAME),OpenBSD)
|
||||||
EXTRACFLAGS := -lm -lpthread
|
EXTRACFLAGS := -lm -lpthread
|
||||||
RUSTC := $(RUSTC) -C linker="$(word 1,$(CC:ccache=))"
|
RUSTC := $(RUSTC) -C linker="$(word 1,$(CC:ccache=))"
|
||||||
@ -94,6 +97,7 @@ endif
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
REMOVE_DYLIBS = rm $(TMPDIR)/$(call DYLIB_GLOB,$(1))
|
REMOVE_DYLIBS = rm $(TMPDIR)/$(call DYLIB_GLOB,$(1))
|
||||||
REMOVE_RLIBS = rm $(TMPDIR)/$(call RLIB_GLOB,$(1))
|
REMOVE_RLIBS = rm $(TMPDIR)/$(call RLIB_GLOB,$(1))
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
-include ../tools.mk
|
-include ../tools.mk
|
||||||
|
|
||||||
SKIP_OS := 'FreeBSD OpenBSD Bitrig'
|
SKIP_OS := 'FreeBSD OpenBSD Bitrig SunOS'
|
||||||
|
|
||||||
ifneq ($(UNAME),$(findstring $(UNAME),$(SKIP_OS)))
|
ifneq ($(UNAME),$(findstring $(UNAME),$(SKIP_OS)))
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ mod rusti {
|
|||||||
target_os = "freebsd",
|
target_os = "freebsd",
|
||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
mod m {
|
mod m {
|
||||||
#[main]
|
#[main]
|
||||||
#[cfg(target_arch = "x86")]
|
#[cfg(target_arch = "x86")]
|
||||||
|
@ -41,7 +41,8 @@ struct Outer {
|
|||||||
target_os = "freebsd",
|
target_os = "freebsd",
|
||||||
target_os = "dragonfly",
|
target_os = "dragonfly",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd"))]
|
target_os = "openbsd",
|
||||||
|
target_os = "sunos"))]
|
||||||
mod m {
|
mod m {
|
||||||
#[cfg(target_arch = "x86")]
|
#[cfg(target_arch = "x86")]
|
||||||
pub mod m {
|
pub mod m {
|
||||||
|
@ -37,5 +37,6 @@ pub fn main() {
|
|||||||
target_os = "bitrig",
|
target_os = "bitrig",
|
||||||
target_os = "netbsd",
|
target_os = "netbsd",
|
||||||
target_os = "openbsd",
|
target_os = "openbsd",
|
||||||
target_os = "android"))]
|
target_os = "android",
|
||||||
|
target_os = "sunos"))]
|
||||||
pub fn main() { }
|
pub fn main() { }
|
||||||
|
Loading…
Reference in New Issue
Block a user