diff --git a/.github/buildomat/README.md b/.github/buildomat/README.md new file mode 100644 index 000000000000..45ce48135152 --- /dev/null +++ b/.github/buildomat/README.md @@ -0,0 +1,5 @@ +# Buildomat CI + +Builds on illumos use Oxide Computer's [buildomat CI](https://github.com/oxidecomputer/buildomat). + +Maintenance and compute resources are provided by Oxide Computer. diff --git a/.github/buildomat/build-and-test.sh b/.github/buildomat/build-and-test.sh new file mode 100755 index 000000000000..4e04b96f152d --- /dev/null +++ b/.github/buildomat/build-and-test.sh @@ -0,0 +1,18 @@ +#!/bin/env bash + +set -o errexit +set -o pipefail +set -o xtrace + +export TARGET="$1" + +# Enable ANSI colors in Cargo output. +export CARGO_TERM_COLOR=always + +banner install +# Note: we use ci/install-rust.sh rather than buildomat to install Rust, for +# consistency with other CI jobs. +TOOLCHAIN=stable INSTALL_RUSTUP=1 ptime -m sh ci/install-rust.sh + +banner run.sh +ptime -m sh ci/run.sh "$TARGET" diff --git a/.github/buildomat/config.toml b/.github/buildomat/config.toml new file mode 100644 index 000000000000..38356adbaff4 --- /dev/null +++ b/.github/buildomat/config.toml @@ -0,0 +1,7 @@ +# Configuration for buildomat. See +# https://github.com/oxidecomputer/buildomat/blob/main/README.md#per-repository-configuration. + +enable = true +# The buildomat jobs don't have access to any secrets, so it's okay for GitHub +# users to create them. +org_only = false diff --git a/.github/buildomat/jobs/x86_64-unknown-illumos.sh b/.github/buildomat/jobs/x86_64-unknown-illumos.sh new file mode 100644 index 000000000000..aa16abf37172 --- /dev/null +++ b/.github/buildomat/jobs/x86_64-unknown-illumos.sh @@ -0,0 +1,7 @@ +#!/bin/env bash +#: +#: name = "x86_64-unknown-illumos" +#: variety = "basic" +#: target = "helios-latest" + +exec .github/buildomat/build-and-test.sh x86_64-unknown-illumos diff --git a/ci/install-rust.sh b/ci/install-rust.sh index 16fd0b4e8a57..f28a0704b8b1 100755 --- a/ci/install-rust.sh +++ b/ci/install-rust.sh @@ -7,17 +7,56 @@ echo "Setup toolchain" toolchain="${TOOLCHAIN:-nightly}" os="${OS:-}" +install_rustup="${INSTALL_RUSTUP:-0}" case "$(uname -s)" in Linux*) os=linux ;; Darwin*) os=macos ;; MINGW*) os=windows ;; + # This captures both Solaris and illumos, which aren't possible to + # distinguish via uname -s. But at the moment we don't need to make this + # distinction -- the only distinction we care about is in TARGET, which is + # expected to be set in the environment. + SunOS*) os=solarish ;; *) echo "Unknown system $(uname -s)" exit 1 ;; esac +if [ "$install_rustup" = "1" ]; then + echo "Install rustup" + + # If the CI system already has Rust installed, we'll override that + # installation via sourcing ~/.cargo/env. + export RUSTUP_INIT_SKIP_PATH_CHECK=yes + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain none + # shellcheck source=/dev/null + . "$HOME/.cargo/env" + + # It is possible that "$HOME/.cargo/bin" was already in the PATH, in which + # case the above source would not have any effect. If the directory wasn't + # present on disk, then some shells negatively cache the PATH lookup and not + # find the directory even after it is created. To work around this, force a + # change to the PATH. + # + # This is a more portable version of `hash -r`. `hash -r` is part of the POSIX + # spec [1] but may not be available in all shells. The manual suggests the + # following, more portable option: + # + # PATH="$PATH" + # + # But empirically, that has been observed to not invalidate the cache in some + # shells. Actually making a change to the PATH should always work (hopefully!) + # + # [1] https://pubs.opengroup.org/onlinepubs/9799919799/utilities/hash.html + + # First, add a trailing colon. + PATH="$PATH:" + # Then, remove it. + PATH="${PATH%:}" +fi + if [ "$os" = "windows" ] && [ -n "${TARGET:-}" ]; then toolchain="$toolchain-$TARGET" rustup set profile minimal diff --git a/libc-test/build.rs b/libc-test/build.rs index 1173f665fb56..a49c058ffb18 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -966,6 +966,13 @@ fn test_solarish(target: &str) { // This evaluates to a sysconf() call rather than a constant "PTHREAD_STACK_MIN" => true, + // Note: on illumos, the value of PTHREAD_MUTEX_DEFAULT was changed to a + // new value, 0x8, in 2024-02: + // https://github.com/illumos/illumos-gate/commit/50718d3ece2504ebcfdc3f385132f664b567cdd0. + // libc still has the old value (= PTHREAD_MUTEX_NORMAL = 0x0) for a + // window of time in case illumos systems are out of date. + "PTHREAD_MUTEX_DEFAULT" if is_illumos => true, + // EPOLLEXCLUSIVE is a relatively recent addition to the epoll interface and may not be // defined on older systems. It is, however, safe to use on systems which do not // explicitly support it. (A no-op is an acceptable implementation of EPOLLEXCLUSIVE.) diff --git a/src/unix/solarish/mod.rs b/src/unix/solarish/mod.rs index 0b223cd982cf..eeac9ab0c41a 100644 --- a/src/unix/solarish/mod.rs +++ b/src/unix/solarish/mod.rs @@ -2063,6 +2063,15 @@ pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { pub const PTHREAD_MUTEX_NORMAL: c_int = 0; pub const PTHREAD_MUTEX_ERRORCHECK: c_int = 2; pub const PTHREAD_MUTEX_RECURSIVE: c_int = 4; + +// Note: on illumos, the value of PTHREAD_MUTEX_DEFAULT was changed to a new +// value, 0x8, in 2024-02: +// https://github.com/illumos/illumos-gate/commit/50718d3ece2504ebcfdc3f385132f664b567cdd0. +// libc still has the old value (= PTHREAD_MUTEX_NORMAL = 0x0) for a window of +// time in case illumos systems are out of date. +// +// Once this constant has been updated on illumos, the corresponding +// `cfg.skip_const` configuration in `libc-test/build.rs` should be removed. pub const PTHREAD_MUTEX_DEFAULT: c_int = crate::PTHREAD_MUTEX_NORMAL; pub const RTLD_NEXT: *mut c_void = -1isize as *mut c_void;