diff --git a/.builds/check-musl.yml b/.builds/check-musl.yml new file mode 100644 index 00000000..de05be0c --- /dev/null +++ b/.builds/check-musl.yml @@ -0,0 +1,12 @@ +image: archlinux +sources: + - https://github.com/mahkoh/jay +tasks: + - install: | + sudo pacman -Syu --noconfirm + sudo pacman -S --noconfirm rustup shaderc musl + rustup toolchain install stable + rustup target install x86_64-unknown-linux-musl + - build: | + cd jay + cargo check --target x86_64-unknown-linux-musl diff --git a/Cargo.lock b/Cargo.lock index bc8963a1..7734b960 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -578,6 +578,7 @@ dependencies = [ "bstr", "byteorder", "cc", + "cfg-if", "chrono", "clap", "clap_complete", @@ -749,6 +750,15 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "link-cplusplus" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6f6da007f968f9def0d65a05b187e2960183de70c160204ecfccf0ee330212" +dependencies = [ + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -1088,12 +1098,9 @@ checksum = "9e110b7d5a1335c2e801176c42a626a905c23eecdee104d9bdfbd6ea5f0b8368" [[package]] name = "roxmltree" -version = "0.14.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "run-on-drop" @@ -1204,9 +1211,9 @@ dependencies = [ [[package]] name = "shaderc" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e07913ada18607bb60d12431cbe3358d3bbebbe95948e1618851dc01e63b7b" +checksum = "1cdc8a26f751f141968dbc08fc01cfa3f4a288351f81cfd9148db41aa189f635" dependencies = [ "libc", "shaderc-sys", @@ -1214,12 +1221,14 @@ dependencies = [ [[package]] name = "shaderc-sys" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73120d240fe22196300f39ca8547ca2d014960f27b19b47b21288b396272f7f7" +checksum = "275f0ea572da7183c0cd0a060ba67c9fb54934523d4c9a9494ce5828c533d40b" dependencies = [ "cmake", "libc", + "link-cplusplus", + "pkg-config", "roxmltree", ] @@ -1656,12 +1665,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 36752338..1e6f214f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,12 +64,13 @@ tracy-client-sys = { version = "0.24.1", features = ["ondemand", "manual-lifetim kbvm = "0.1.4" tiny-skia = { version = "0.11.4", default-features = false, features = ["std"] } regex = "1.11.1" +cfg-if = "1.0.0" [build-dependencies] repc = "0.1.1" anyhow = "1.0.79" bstr = { version = "1.9.0", default-features = false, features = ["std"] } -shaderc = "0.8.3" +shaderc = "0.9.1" cc = "1.0.86" #[profile.dev.build-override] diff --git a/src/io_uring/ops/sendmsg.rs b/src/io_uring/ops/sendmsg.rs index 8d495a7e..c6231b39 100644 --- a/src/io_uring/ops/sendmsg.rs +++ b/src/io_uring/ops/sendmsg.rs @@ -6,7 +6,7 @@ use { sys::{IORING_OP_SENDMSG, io_uring_sqe}, }, time::Time, - utils::{buf::Buf, vec_ext::UninitVecExt}, + utils::{buf::Buf, compat::IovLength, vec_ext::UninitVecExt}, }, std::{mem::MaybeUninit, ptr, rc::Rc}, uapi::{OwnedFd, c}, @@ -44,11 +44,9 @@ impl IoUring { st.cmsg.clear(); st.cmsg.reserve(space); st.cmsg.set_len_safe(space); - let hdr = c::cmsghdr { - cmsg_len: 0, - cmsg_level: c::SOL_SOCKET, - cmsg_type: c::SCM_RIGHTS, - }; + let mut hdr: c::cmsghdr = uapi::pod_zeroed(); + hdr.cmsg_level = c::SOL_SOCKET; + hdr.cmsg_type = c::SCM_RIGHTS; uapi::cmsg_write(&mut &mut st.cmsg[..], hdr, &fd_ids[..]).unwrap(); st.msghdr.msg_control = st.cmsg.as_ptr() as _; st.msghdr.msg_controllen = st.cmsg.len() as _; @@ -66,7 +64,7 @@ impl IoUring { iov_len: b.len(), })); st.msghdr.msg_iov = st.iovecs.as_ptr() as _; - st.msghdr.msg_iovlen = st.iovecs.len(); + st.msghdr.msg_iovlen = st.iovecs.len() as IovLength; st.data = Some(SendmsgTaskData { _fd: fd.clone(), res: pr.clone(), diff --git a/src/udmabuf.rs b/src/udmabuf.rs index 271cdf46..d2c55056 100644 --- a/src/udmabuf.rs +++ b/src/udmabuf.rs @@ -2,7 +2,7 @@ use { crate::{ allocator::{Allocator, AllocatorError, BufferObject, BufferUsage, MappedBuffer}, format::Format, - utils::{oserror::OsError, page_size::page_size}, + utils::{compat::IoctlNumber, oserror::OsError, page_size::page_size}, video::{ LINEAR_MODIFIER, Modifier, dmabuf::{DmaBuf, DmaBufIds, DmaBufPlane, PlaneVec}, @@ -267,4 +267,4 @@ struct udmabuf_create { size: u64, } -const UDMABUF_CREATE: u64 = _IOW::(b'u' as u64, 0x42); +const UDMABUF_CREATE: IoctlNumber = _IOW::(b'u' as u64, 0x42) as IoctlNumber; diff --git a/src/utils.rs b/src/utils.rs index bae62b58..298b663f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -11,6 +11,7 @@ pub mod bufio; pub mod cell_ext; pub mod clone3; pub mod clonecell; +pub mod compat; pub mod copyhashmap; pub mod debug_fn; pub mod double_buffered; diff --git a/src/utils/clone3.rs b/src/utils/clone3.rs index 2d2e0feb..672d3256 100644 --- a/src/utils/clone3.rs +++ b/src/utils/clone3.rs @@ -100,11 +100,9 @@ pub fn double_fork() -> Result, ForkerError> { Forked::Parent { pidfd, .. } => { let pidfd = pidfd.raw(); let mut buf = [MaybeUninit::uninit(); 128]; - let hdr = c::cmsghdr { - cmsg_len: 0, - cmsg_level: c::SOL_SOCKET, - cmsg_type: c::SCM_RIGHTS, - }; + let mut hdr: c::cmsghdr = uapi::pod_zeroed(); + hdr.cmsg_level = c::SOL_SOCKET; + hdr.cmsg_type = c::SCM_RIGHTS; let _ = uapi::cmsg_write(&mut &mut buf[..], hdr, &pidfd); let iov: &[&[u8]] = &[]; let msghdr = Msghdr { diff --git a/src/utils/compat.rs b/src/utils/compat.rs new file mode 100644 index 00000000..c8de61db --- /dev/null +++ b/src/utils/compat.rs @@ -0,0 +1,11 @@ +use {cfg_if::cfg_if, uapi::c}; + +cfg_if! { + if #[cfg(target_env = "musl")] { + pub type IoctlNumber = c::c_int; + pub type IovLength = c::c_int; + } else { + pub type IoctlNumber = c::c_ulong; + pub type IovLength = usize; + } +} diff --git a/src/video/dmabuf.rs b/src/video/dmabuf.rs index b31b280e..f16bba9d 100644 --- a/src/video/dmabuf.rs +++ b/src/video/dmabuf.rs @@ -1,5 +1,9 @@ use { - crate::{format::Format, utils::oserror::OsError, video::Modifier}, + crate::{ + format::Format, + utils::{compat::IoctlNumber, oserror::OsError}, + video::Modifier, + }, arrayvec::ArrayVec, std::rc::Rc, uapi::{_IOW, _IOWR, OwnedFd, c::ioctl}, @@ -74,8 +78,10 @@ struct dma_buf_import_sync_file { pub const DMA_BUF_SYNC_READ: u32 = 1 << 0; pub const DMA_BUF_SYNC_WRITE: u32 = 1 << 1; -const DMA_BUF_IOCTL_EXPORT_SYNC_FILE: u64 = _IOWR::(DMA_BUF_BASE, 2); -const DMA_BUF_IOCTL_IMPORT_SYNC_FILE: u64 = _IOW::(DMA_BUF_BASE, 3); +const DMA_BUF_IOCTL_EXPORT_SYNC_FILE: IoctlNumber = + _IOWR::(DMA_BUF_BASE, 2) as IoctlNumber; +const DMA_BUF_IOCTL_IMPORT_SYNC_FILE: IoctlNumber = + _IOW::(DMA_BUF_BASE, 3) as IoctlNumber; pub fn dma_buf_export_sync_file(dmabuf: &OwnedFd, flags: u32) -> Result { let mut data = dma_buf_export_sync_file { flags, fd: -1 }; diff --git a/src/video/drm/sys.rs b/src/video/drm/sys.rs index 4a59ecba..2f3a53b4 100644 --- a/src/video/drm/sys.rs +++ b/src/video/drm/sys.rs @@ -3,7 +3,7 @@ use { crate::{ - utils::{bitflags::BitflagsExt, oserror::OsError}, + utils::{bitflags::BitflagsExt, compat::IoctlNumber, oserror::OsError}, video::drm::{ DrmBlob, DrmCardResources, DrmConnector, DrmConnectorInfo, DrmCrtc, DrmEncoder, DrmEncoderInfo, DrmError, DrmFb, DrmModeInfo, DrmPlane, DrmPlaneInfo, DrmProperty, @@ -23,7 +23,7 @@ use { pub unsafe fn ioctl(fd: c::c_int, request: c::c_ulong, t: &mut T) -> Result { let mut ret; loop { - ret = unsafe { c::ioctl(fd, request, &mut *t) }; + ret = unsafe { c::ioctl(fd, request as IoctlNumber, &mut *t) }; if ret != -1 { return Ok(ret); }