diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bf22e05b4..5dea444e0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -218,6 +218,12 @@ jobs: # See the comments in the libc crate RUSTFLAGS: -A improper_ctypes_definitions --cfg criterion - run: rustup component add rust-src + - run: cargo check -Z build-std --target=armeb-unknown-linux-gnueabi --all-targets --features=all-apis + env: + RUSTFLAGS: "--cfg=rustix_use_untested_linux_raw" + - run: cargo check -Z build-std --target=aarch64_be-unknown-linux-gnu --all-targets --features=all-apis + env: + RUSTFLAGS: "--cfg=rustix_use_untested_linux_raw" - run: cargo check -Z build-std --target x86_64-unknown-openbsd --all-targets --features=all-apis - run: cargo check -Z build-std --target mips64-openwrt-linux-musl --all-targets --features=all-apis - run: cargo check -Z build-std --target x86_64-unknown-dragonfly --all-targets --features=all-apis diff --git a/Cargo.toml b/Cargo.toml index f9630e7a1..3295d31a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ rustc-std-workspace-alloc = { version = "1.0.0", optional = true } # not aliased # addition to the libc backend. The linux_raw backend is used by default. The # libc backend can be selected via adding `--cfg=rustix_use_libc` to # `RUSTFLAGS` or enabling the `use-libc` cargo feature. -[target.'cfg(all(not(rustix_use_libc), not(miri), target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc")), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64"))))'.dependencies] +[target.'cfg(all(not(rustix_use_libc), not(miri), target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc"), all(rustix_use_untested_linux_raw, target_endian = "big", any(target_arch = "arm", target_arch = "aarch64"))), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64"))))'.dependencies] linux-raw-sys = { version = "0.9.2", default-features = false, features = ["general", "errno", "ioctl", "no_std", "elf"] } libc_errno = { package = "errno", version = "0.3.10", default-features = false, optional = true } libc = { version = "0.2.171", default-features = false, optional = true } @@ -37,7 +37,7 @@ libc = { version = "0.2.171", default-features = false, optional = true } # # On all other Unix-family platforms, and under Miri, we always use the libc # backend, so enable its dependencies unconditionally. -[target.'cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc")), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64")))))))'.dependencies] +[target.'cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc"), all(rustix_use_untested_linux_raw, target_endian = "big", any(target_arch = "arm", target_arch = "aarch64"))), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64")))))))'.dependencies] libc_errno = { package = "errno", version = "0.3.10", default-features = false } libc = { version = "0.2.171", default-features = false } @@ -45,7 +45,7 @@ libc = { version = "0.2.171", default-features = false } # # Some syscalls do not have libc wrappers, such as in `io_uring`. For these, # the libc backend uses the linux-raw-sys ABI and `libc::syscall`. -[target.'cfg(all(any(target_os = "android", target_os = "linux"), any(rustix_use_libc, miri, not(all(target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc")), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64")))))))'.dependencies] +[target.'cfg(all(any(target_os = "android", target_os = "linux"), any(rustix_use_libc, miri, not(all(target_os = "linux", any(target_endian = "little", any(target_arch = "s390x", target_arch = "powerpc"), all(rustix_use_untested_linux_raw, target_endian = "big", any(target_arch = "arm", target_arch = "aarch64"))), any(target_arch = "arm", all(target_arch = "aarch64", target_pointer_width = "64"), target_arch = "riscv64", all(rustix_use_experimental_asm, target_arch = "powerpc"), all(rustix_use_experimental_asm, target_arch = "powerpc64"), all(rustix_use_experimental_asm, target_arch = "s390x"), all(rustix_use_experimental_asm, target_arch = "mips"), all(rustix_use_experimental_asm, target_arch = "mips32r6"), all(rustix_use_experimental_asm, target_arch = "mips64"), all(rustix_use_experimental_asm, target_arch = "mips64r6"), target_arch = "x86", all(target_arch = "x86_64", target_pointer_width = "64")))))))'.dependencies] linux-raw-sys = { version = "0.9.2", default-features = false, features = ["general", "ioctl", "no_std"] } # For the libc backend on Windows, use the Winsock API in windows-sys. @@ -243,6 +243,7 @@ check-cfg = [ 'cfg(alloc_ffi)', 'cfg(apple)', 'cfg(asm_experimental_arch)', + 'cfg(untested_linux_raw)', 'cfg(bsd)', 'cfg(core_c_str)', 'cfg(core_ffi_c)', diff --git a/build.rs b/build.rs index 981e82612..fbba5719e 100644 --- a/build.rs +++ b/build.rs @@ -50,6 +50,14 @@ fn main() { // and not something we want accidentally enabled via `--all-features`. let rustix_use_experimental_asm = var("CARGO_CFG_RUSTIX_USE_EXPERIMENTAL_ASM").is_ok(); + // Check for eg. `RUSTFLAGS=--cfg=rustix_use_untested_linux_raw`. This is a + // rustc flag rather than a cargo feature flag because it's experimental + // and not something we want accidentally enabled via `--all-features`. + // This setting is as a result of CI testing of the linux_raw backend being + // complex as a result of the requirement for a custom toolchain for which + // binary distributions are not avaialble. + let rustix_use_untested_linux_raw = var("CARGO_CFG_RUSTIX_USE_UNTESTED_LINUX_RAW").is_ok(); + // Miri doesn't support inline asm, and has builtin support for recognizing // libc FFI calls, so if we're running under miri, use the libc backend. let miri = var("CARGO_CFG_MIRI").is_ok(); @@ -102,11 +110,14 @@ fn main() { || !inline_asm_name_present || is_unsupported_abi || miri - || ((arch == "powerpc" + || (arch == "powerpc" || arch == "powerpc64" || arch == "s390x" || arch.starts_with("mips")) - && !rustix_use_experimental_asm); + && !rustix_use_experimental_asm + || (endian == "big" + && (arch == "arm" || arch == "aarch64") + && !rustix_use_untested_linux_raw); if libc { // Use the libc backend. use_feature("libc"); @@ -174,6 +185,7 @@ fn main() { } println!("cargo:rerun-if-env-changed=CARGO_CFG_RUSTIX_USE_EXPERIMENTAL_ASM"); + println!("cargo:rerun-if-env-changed=CARGO_CFG_RUSTIX_USE_UNTESTED_LINUX_RAW"); println!("cargo:rerun-if-env-changed=CARGO_CFG_RUSTIX_USE_LIBC"); // Rerun this script if any of our features or configuration flags change,