From e389b875776019c3c39e9f8cafe4d6b99f5885be Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 10:16:39 -0600 Subject: [PATCH 1/8] Fix CI by relaxing our MSRV constraint Recently a transitive dev-dependency published a new version that is incompatible with Nix's MSRV, causing CI to break. That's annoying, because there's really no reason why a crate's dev-dependencies ought to respect the MSRV. Fix Nix's CI by: * Running all tests with stable Rust (or nightly, for certain targets) * Adding an additional set of CI checks to ensure that the crate will compile with MSRV, on all of the major operating systems, but don't try to compile its tests. * Eliminate the now-redundant "rust-stable" CI task. --- .cirrus.yml | 2 +- .github/actions/build/action.yml | 12 ++++ .github/workflows/ci.yml | 95 ++++++++++++++++++-------------- 3 files changed, 66 insertions(+), 43 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 4fb70d7b3b..c16590f98f 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -50,7 +50,7 @@ task: setup_script: - kldload mqueuefs - fetch https://sh.rustup.rs -o rustup.sh - - sh rustup.sh -y --profile=minimal --default-toolchain $MSRV + - sh rustup.sh -y --profile=minimal --default-toolchain stable - . $HOME/.cargo/env - rustup target add i686-unknown-freebsd - rustup component add clippy diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index 9cf2fbff5d..9f81c29273 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -30,6 +30,16 @@ inputs: required: false default: + NOCLIPPY: + description: "whether to run cargo clippy" + required: false + default: false + + NODOC: + description: "whether to run cargo doc" + required: false + default: false + NOHACK: description: "whether to run cargo hack" required: false @@ -55,10 +65,12 @@ runs: run: ${{ inputs.TOOL }} ${{ inputs.BUILD }} ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} --all-targets --all-features - name: doc + if: inputs.NODOC == 'false' shell: bash run: ${{ inputs.TOOL }} doc ${{ inputs.ZFLAGS }} --no-deps --target ${{ inputs.TARGET }} --all-features - name: clippy + if: inputs.NOCLIPPY == 'false' shell: bash run: ${{ inputs.TOOL}} clippy ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} --all-targets --all-features -- ${{ inputs.CLIPPYFLAGS }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc7fa1324d..15abd09b26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,10 +14,6 @@ permissions: env: MSRV: 1.69.0 - # Rust's Loongarch support merged in 1.71.0 - MSRV_LOONGARCH: 1.71.0 - # Minimal Rust version to support all 3 official OpenHarmony targets as tier2 - MSRV_OHOS: 1.78.0 RUSTFLAGS: -Dwarnings jobs: @@ -32,7 +28,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - toolchain: '${{ env.MSRV }}' + toolchain: stable components: clippy - name: build @@ -59,7 +55,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - toolchain: '${{ env.MSRV }}' + toolchain: stable components: clippy - name: build @@ -79,7 +75,7 @@ jobs: # cross needs to execute Docker, GitHub Action already has it installed cross: runs-on: ubuntu-24.04 - needs: [rustfmt, minver, macos, x86_64_linux_native_builds, rust_stable] + needs: [rustfmt, minver, macos, x86_64_linux_native_builds] strategy: fail-fast: false matrix: @@ -108,8 +104,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - # Use a newer version rustc if the target is Loongarch, remove this workaround after MSRV is newer than 1.71.0 - toolchain: "${{ matrix.target == 'loongarch64-unknown-linux-gnu' && env.MSRV_LOONGARCH || env.MSRV }}" + toolchain: stable components: clippy # cross relies on docker or podman, GitHub Acton already has it installed. @@ -156,7 +151,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - toolchain: '${{ env.MSRV }}' + toolchain: stable components: clippy - name: install targets @@ -193,7 +188,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - toolchain: '${{ env.MSRV }}' + toolchain: stable components: clippy - name: install targets @@ -212,38 +207,11 @@ jobs: - name: before_cache_script run: sudo rm -rf $CARGO_HOME/registry/index; - rust_stable: - runs-on: ubuntu-latest - env: - TARGET: x86_64-unknown-linux-gnu - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@stable - with: - components: clippy - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ env.TARGET }}' - - - name: test - uses: ./.github/actions/test - with: - TARGET: '${{ env.TARGET }}' - - - name: before_cache_script - run: sudo rm -rf $CARGO_HOME/registry/index - - # Tasks for cross-compiling, but no testing cross_compiling: runs-on: ubuntu-latest - needs: [rustfmt, minver, macos, x86_64_linux_native_builds, rust_stable] + needs: [rustfmt, minver, macos, x86_64_linux_native_builds] env: BUILD: check strategy: @@ -282,8 +250,7 @@ jobs: - name: setup Rust uses: dtolnay/rust-toolchain@master with: - # Use a newer version rustc if it is OpenHarmony, remove this workaround after MSRV is newer than 1.78.0 - toolchain: "${{ contains(matrix.target, 'ohos') && env.MSRV_OHOS || env.MSRV }}" + toolchain: stable components: clippy - name: install targets @@ -299,10 +266,54 @@ jobs: - name: before_cache_script run: rm -rf $CARGO_HOME/registry/index + # Check that Nix will build on the MSRV, on a variety of operating systems. + # But don't check the tests. Those are not required to build on MSRV. + msrv: + runs-on: ubuntu-latest + needs: [rustfmt, minver, macos, x86_64_linux_native_builds] + env: + BUILD: check + NOCLIPPY: true + NODOC: true + NOHACK: true + strategy: + fail-fast: false + matrix: + include: + - target: aarch64-linux-android + - target: x86_64-unknown-linux-gnu + - target: x86_64-unknown-linux-musl + - target: aarch64-apple-darwin + - target: x86_64-unknown-freebsd + - target: x86_64-unknown-netbsd + steps: + - name: checkout + uses: actions/checkout@v4 + + - name: setup Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: $MSRV + + - name: install targets + run: rustup target add ${{ matrix.target }} + + - name: build + uses: ./.github/actions/build + with: + TARGET: '${{ matrix.target }}' + BUILD: '${{ env.BUILD }}' + NOCLIPPY: '${{ matrix.NOCLIPPY }}' + NODOC: '${{ matrix.NODOC }}' + NOHACK: '${{ matrix.NOHACK }}' + + - name: before_cache_script + run: rm -rf $CARGO_HOME/registry/index + redox: runs-on: ubuntu-latest - needs: [rustfmt, minver, macos, x86_64_linux_native_builds, rust_stable] + needs: [rustfmt, minver, macos, x86_64_linux_native_builds] env: TARGET: x86_64-unknown-redox CLIPPYFLAGS: -D warnings From 49453802ea930af96bf2bef1bdf15cccb9d14594 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 10:46:23 -0600 Subject: [PATCH 2/8] Fix some Clippy warnings on apple I think these never showed up in CI before, because we've never run clippy on Rust stable on apple until now. --- test/test_sendfile.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_sendfile.rs b/test/test_sendfile.rs index ab50a1d040..0e8eff9031 100644 --- a/test/test_sendfile.rs +++ b/test/test_sendfile.rs @@ -159,10 +159,10 @@ fn test_sendfile_dragonfly() { fn test_sendfile_darwin() { // Declare the content let header_strings = - vec!["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; + ["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; let body = "Xabcdef123456"; let body_offset = 1; - let trailer_strings = vec!["\n", "Served by Make Believe\n"]; + let trailer_strings = ["\n", "Served by Make Believe\n"]; // Write the body to a file let mut tmp = tempfile().unwrap(); @@ -195,7 +195,7 @@ fn test_sendfile_darwin() { + &trailer_strings.concat(); // Verify the message that was sent - assert_eq!(bytes_written as usize, expected_string.as_bytes().len()); + assert_eq!(bytes_written as usize, expected_string.len()); let mut read_string = String::new(); let bytes_read = rd.read_to_string(&mut read_string).unwrap(); From 1b002385cfbd9e440824819afe7bcd8f6a68309d Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Wed, 1 Oct 2025 15:16:05 -0600 Subject: [PATCH 3/8] Suppress a Clippy false positive --- src/fcntl.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fcntl.rs b/src/fcntl.rs index 6504c1dcf2..4b439d03ed 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -1038,6 +1038,7 @@ pub unsafe trait Flockable: std::os::fd::AsRawFd {} pub struct Flock(T); #[cfg(not(any(target_os = "redox", target_os = "solaris")))] +#[allow(clippy::unnecessary_unwrap)] // https://github.com/rust-lang/rust-clippy/issues/15744 impl Drop for Flock { fn drop(&mut self) { let res = Errno::result(unsafe { libc::flock(self.0.as_raw_fd(), libc::LOCK_UN) }); From 312f4604d7476e80a270b2a21e3469f239d052bb Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 11:01:42 -0600 Subject: [PATCH 4/8] GetCString only needs to be build with features=net --- src/sys/socket/sockopt.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sys/socket/sockopt.rs b/src/sys/socket/sockopt.rs index 49b305920f..e06dded5bb 100644 --- a/src/sys/socket/sockopt.rs +++ b/src/sys/socket/sockopt.rs @@ -1972,12 +1972,14 @@ impl<'a> Set<'a, OsString> for SetOsString<'a> { /// Getter for a `CString` value. #[cfg(apple_targets)] +#[cfg(feature = "net")] struct GetCString> { len: socklen_t, val: MaybeUninit, } #[cfg(apple_targets)] +#[cfg(feature = "net")] impl> Get for GetCString { fn uninit() -> Self { GetCString { From 44a0faed12e620ff0764a64cdb7809e510bdd789 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 11:09:29 -0600 Subject: [PATCH 5/8] Fix Clippy on Solarish, with Rust stable --- test/test_sendfile.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_sendfile.rs b/test/test_sendfile.rs index 0e8eff9031..c59edb2a9e 100644 --- a/test/test_sendfile.rs +++ b/test/test_sendfile.rs @@ -258,7 +258,7 @@ fn test_sendfilev() { + &trailer_strings.concat(); // Verify the message that was sent - assert_eq!(bytes_written, expected_string.as_bytes().len()); + assert_eq!(bytes_written, expected_string.len()); let mut read_string = String::new(); let bytes_read = rd.read_to_string(&mut read_string).unwrap(); From 646fe75a3e1e71f1b16356e7af8af03585e4d98e Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 11:11:37 -0600 Subject: [PATCH 6/8] Don't use --all-targets when testing MSRV --- .github/actions/build/action.yml | 7 ++++++- .github/workflows/ci.yml | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index 9f81c29273..c44b8e10f7 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -21,6 +21,11 @@ inputs: required: false default: -D warnings + TARGETS: + description: 'Build all targets or only default?' + required: false + default: "--all-targets" + TOOL: description: 'Tool used to involve the BUILD command, can be cargo or cross' required: false @@ -62,7 +67,7 @@ runs: - name: build shell: bash - run: ${{ inputs.TOOL }} ${{ inputs.BUILD }} ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} --all-targets --all-features + run: ${{ inputs.TOOL }} ${{ inputs.BUILD }} ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} ${{ inputs.TARGETS }} --all-features - name: doc if: inputs.NODOC == 'false' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15abd09b26..8f9888663c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -276,6 +276,7 @@ jobs: NOCLIPPY: true NODOC: true NOHACK: true + TARGETS: "" strategy: fail-fast: false matrix: @@ -302,10 +303,11 @@ jobs: uses: ./.github/actions/build with: TARGET: '${{ matrix.target }}' + TARGETS: '${{ env.TARGETS }}' BUILD: '${{ env.BUILD }}' - NOCLIPPY: '${{ matrix.NOCLIPPY }}' - NODOC: '${{ matrix.NODOC }}' - NOHACK: '${{ matrix.NOHACK }}' + NOCLIPPY: '${{ env.NOCLIPPY }}' + NODOC: '${{ env.NODOC }}' + NOHACK: '${{ env.NOHACK }}' - name: before_cache_script run: rm -rf $CARGO_HOME/registry/index From a957d162e35d3f3a877a94bd2b5964dd5250659b Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 11:13:05 -0600 Subject: [PATCH 7/8] Disable the libc::personality doc test on QEMU It's failing there with EPERM. It's probably seccomp's fault --- .github/actions/test/action.yml | 5 +++++ .github/workflows/ci.yml | 1 + src/sys/personality.rs | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml index 31a6fd7aa6..6aa2bfe5ae 100644 --- a/.github/actions/test/action.yml +++ b/.github/actions/test/action.yml @@ -19,6 +19,10 @@ inputs: required: false default: -D warnings -A unknown-lints + RUSTDOCFLAGS: + required: false + default: -D warnings + runs: using: "composite" steps: @@ -26,6 +30,7 @@ runs: shell: bash run: | echo "RUSTFLAGS=${{ inputs.RUSTFLAGS }}" >> $GITHUB_ENV + echo "RUSTDOCFLAGS=${{ inputs.RUSTDOCFLAGS }}" >> $GITHUB_ENV - name: test shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8f9888663c..2da4220637 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -127,6 +127,7 @@ jobs: SUDO: "" TOOL: cross RUSTFLAGS: --cfg qemu -D warnings + RUSTDOCFLAGS: --cfg qemu - name: before_cache_script run: rm -rf $CARGO_HOME/registry/index diff --git a/src/sys/personality.rs b/src/sys/personality.rs index 9623fb8663..f77f36b681 100644 --- a/src/sys/personality.rs +++ b/src/sys/personality.rs @@ -78,10 +78,10 @@ pub fn get() -> Result { /// /// Example: /// -// Disable test on aarch64 until we know why it fails. +// Disable test on aarch64 and with QEMU. seccomp interference is suspected. // https://github.com/nix-rust/nix/issues/2060 -#[cfg_attr(target_arch = "aarch64", doc = " ```no_run")] -#[cfg_attr(not(target_arch = "aarch64"), doc = " ```")] +#[cfg_attr(any(qemu, target_arch = "aarch64"), doc = " ```no_run")] +#[cfg_attr(not(any(qemu, target_arch = "aarch64")), doc = " ```")] /// # use nix::sys::personality::{self, Persona}; /// let mut pers = personality::get().unwrap(); /// assert!(!pers.contains(Persona::ADDR_NO_RANDOMIZE)); From 4583d6d46ad889843cf5581d4b2cde9586ebf7f7 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 12 Oct 2025 17:34:55 -0600 Subject: [PATCH 8/8] Adjust atomics in the lio_listio doc test Since changing the compiler version, this test has begun to occasionally hang in CI. And it's not just in QEMU. It's probably due to an atomic ordering problem. --- src/sys/aio.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sys/aio.rs b/src/sys/aio.rs index a5f368637a..ad23356dba 100644 --- a/src/sys/aio.rs +++ b/src/sys/aio.rs @@ -1154,12 +1154,12 @@ pub fn aio_suspend( /// pub static SIGNALED: AtomicBool = AtomicBool::new(false); /// /// extern fn sigfunc(_: c_int) { -/// SIGNALED.store(true, Ordering::Relaxed); +/// SIGNALED.store(true, Ordering::Release); /// } /// let sa = SigAction::new(SigHandler::Handler(sigfunc), /// SaFlags::SA_RESETHAND, /// SigSet::empty()); -/// SIGNALED.store(false, Ordering::Relaxed); +/// SIGNALED.store(false, Ordering::Release); /// unsafe { sigaction(Signal::SIGUSR2, &sa) }.unwrap(); /// /// const WBUF: &[u8] = b"abcdef123456"; @@ -1173,7 +1173,7 @@ pub fn aio_suspend( /// )); /// let sev = SigevNotify::SigevSignal { signal: Signal::SIGUSR2, si_value: 0 }; /// lio_listio(LioMode::LIO_NOWAIT, &mut[aiow.as_mut()], sev).unwrap(); -/// while !SIGNALED.load(Ordering::Relaxed) { +/// while !SIGNALED.load(Ordering::Acquire) { /// thread::sleep(time::Duration::from_millis(10)); /// } /// // At this point, since `lio_listio` returned success and delivered its