diff --git a/local/patches/kf6-pty/01-no-utmp.patch b/local/patches/kf6-pty/01-no-utmp.patch index 25eace62f8..89eac2afad 100644 --- a/local/patches/kf6-pty/01-no-utmp.patch +++ b/local/patches/kf6-pty/01-no-utmp.patch @@ -1,37 +1,28 @@ --- a/src/kpty.cpp +++ b/src/kpty.cpp -@@ -464,6 +464,9 @@ +@@ -464,6 +464,7 @@ } - + #else +#if 0 -+ Q_UNUSED(user) -+ Q_UNUSED(remotehost) #if HAVE_UTMPX struct utmpx l_struct; - #else -@@ -532,6 +535,8 @@ - #endif + ... +@@ -532,6 +533,7 @@ #endif #endif +#endif } - - void KPty::logout() -@@ -551,6 +556,8 @@ + +@@ -551,6 +553,7 @@ } - + #else +#if 0 -+ return; - Q_D(KPty); - - const char *str_ptr = d->ttyName.data(); -@@ -611,6 +618,7 @@ + #if HAVE_UTMPX + ... endutent(); #endif #endif +#endif - #endif } - diff --git a/local/recipes/drivers/linux-kpi/recipe.toml b/local/recipes/drivers/linux-kpi/recipe.toml index 35cfb908ca..dcfb646324 100644 --- a/local/recipes/drivers/linux-kpi/recipe.toml +++ b/local/recipes/drivers/linux-kpi/recipe.toml @@ -18,4 +18,18 @@ DYNAMIC_INIT echo "linux-kpi: installing C compatibility headers into sysroot" mkdir -p "${COOKBOOK_STAGE}/usr/include/linux-kpi" cp -R "${COOKBOOK_SOURCE}/src/c_headers/." "${COOKBOOK_STAGE}/usr/include/linux-kpi/" + +echo "linux-kpi: building static library" +cd "${COOKBOOK_SOURCE}" +export CARGO_TARGET_DIR="${COOKBOOK_SOURCE}/target" +"${COOKBOOK_CARGO}" build \ + --manifest-path "${COOKBOOK_SOURCE}/Cargo.toml" \ + --lib \ + --release \ + --target "${TARGET}" \ + -j "${COOKBOOK_MAKE_JOBS}" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +cp "${CARGO_TARGET_DIR}/${TARGET}/release/liblinux_kpi.a" \ + "${COOKBOOK_STAGE}/usr/lib/liblinux_kpi.a" """ diff --git a/local/recipes/drivers/linux-kpi/source/src/rust_impl/drm_shim.rs b/local/recipes/drivers/linux-kpi/source/src/rust_impl/drm_shim.rs index c6486cb914..314d3fb2fb 100644 --- a/local/recipes/drivers/linux-kpi/source/src/rust_impl/drm_shim.rs +++ b/local/recipes/drivers/linux-kpi/source/src/rust_impl/drm_shim.rs @@ -1,8 +1,20 @@ use std::collections::{BTreeMap, HashMap}; +use std::ffi::CString; +use std::os::raw::{c_char, c_int, c_void}; use std::ptr; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Mutex; +use syscall::error::{EIO, EINVAL}; + +const O_RDWR: c_int = 2; + +extern "C" { + fn open(pathname: *const c_char, flags: c_int) -> c_int; + fn read(fd: c_int, buf: *mut c_void, count: usize) -> isize; + fn write(fd: c_int, buf: *const c_void, count: usize) -> isize; +} + static NEXT_GEM_HANDLE: AtomicU32 = AtomicU32::new(1); #[repr(C)] @@ -14,6 +26,15 @@ struct CallerGemObject { driver_private: *mut u8, } +#[repr(C)] +struct DrmFile { + pid: u32, + uid: u32, + authenticated: i32, + master: i32, + driver_priv: *mut u8, +} + unsafe fn write_handle_count(obj: *mut u8, count: u32) { let cobj = obj as *mut CallerGemObject; unsafe { @@ -34,6 +55,337 @@ struct ObjectState { handles: Vec, } +const DRM_IOCTL_BASE: u32 = 0x00A0; +const DRM_IOCTL_MODE_GETRESOURCES: u32 = DRM_IOCTL_BASE; +const DRM_IOCTL_MODE_GETCONNECTOR: u32 = DRM_IOCTL_BASE + 7; +const DRM_IOCTL_MODE_GETMODES: u32 = DRM_IOCTL_BASE + 8; +const DRM_IOCTL_MODE_SETCRTC: u32 = DRM_IOCTL_BASE + 2; +const DRM_IOCTL_MODE_GETCRTC: u32 = DRM_IOCTL_BASE + 3; +const DRM_IOCTL_MODE_GETENCODER: u32 = DRM_IOCTL_BASE + 6; +const DRM_IOCTL_MODE_PAGE_FLIP: u32 = DRM_IOCTL_BASE + 16; +const DRM_IOCTL_MODE_CREATE_DUMB: u32 = DRM_IOCTL_BASE + 18; +const DRM_IOCTL_MODE_MAP_DUMB: u32 = DRM_IOCTL_BASE + 19; +const DRM_IOCTL_MODE_DESTROY_DUMB: u32 = DRM_IOCTL_BASE + 20; +const DRM_IOCTL_MODE_ADDFB: u32 = DRM_IOCTL_BASE + 21; +const DRM_IOCTL_MODE_RMFB: u32 = DRM_IOCTL_BASE + 22; +const DRM_IOCTL_GET_CAP: u32 = DRM_IOCTL_BASE + 23; +const DRM_IOCTL_SET_CLIENT_CAP: u32 = DRM_IOCTL_BASE + 24; +const DRM_IOCTL_VERSION: u32 = DRM_IOCTL_BASE + 25; +const DRM_IOCTL_GEM_CREATE: u32 = DRM_IOCTL_BASE + 26; +const DRM_IOCTL_GEM_CLOSE: u32 = DRM_IOCTL_BASE + 27; +const DRM_IOCTL_GEM_MMAP: u32 = DRM_IOCTL_BASE + 28; +const DRM_IOCTL_PRIME_HANDLE_TO_FD: u32 = DRM_IOCTL_BASE + 29; +const DRM_IOCTL_PRIME_FD_TO_HANDLE: u32 = DRM_IOCTL_BASE + 30; + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmResourcesWire { + connector_count: u32, + crtc_count: u32, + encoder_count: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmConnectorWire { + connector_id: u32, + connection: u32, + connector_type: u32, + mm_width: u32, + mm_height: u32, + encoder_id: u32, + mode_count: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmModeWire { + clock: u32, + hdisplay: u16, + hsync_start: u16, + hsync_end: u16, + htotal: u16, + hskew: u16, + vdisplay: u16, + vsync_start: u16, + vsync_end: u16, + vtotal: u16, + vscan: u16, + vrefresh: u32, + flags: u32, + type_: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmSetCrtcWire { + crtc_id: u32, + fb_handle: u32, + connector_count: u32, + connectors: [u32; 8], + mode: DrmModeWire, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmPageFlipWire { + crtc_id: u32, + fb_handle: u32, + flags: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmCreateDumbWire { + width: u32, + height: u32, + bpp: u32, + flags: u32, + pitch: u32, + size: u64, + handle: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmMapDumbWire { + handle: u32, + offset: u64, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmDestroyDumbWire { + handle: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGetEncoderWire { + encoder_id: u32, + encoder_type: u32, + crtc_id: u32, + possible_crtcs: u32, + possible_clones: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmAddFbWire { + width: u32, + height: u32, + pitch: u32, + bpp: u32, + depth: u32, + handle: u32, + fb_id: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmRmFbWire { + fb_id: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGetCrtcWire { + crtc_id: u32, + fb_id: u32, + x: u32, + y: u32, + mode_valid: u32, + mode: DrmModeWire, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmVersionWire { + major: i32, + minor: i32, + patch: i32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGetCapWire { + capability: u64, + value: u64, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmSetClientCapWire { + capability: u64, + value: u64, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGemCreateWire { + size: u64, + handle: u32, + _pad: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGemCloseWire { + handle: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmGemMmapWire { + handle: u32, + _pad: u32, + offset: u64, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmPrimeHandleToFdWire { + handle: u32, + flags: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmPrimeFdToHandleWire { + fd: i32, + _pad: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmPrimeHandleToFdResponseWire { + fd: i32, + _pad: u32, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct DrmPrimeFdToHandleResponseWire { + handle: u32, + _pad: u32, +} + +fn ioctl_request(cmd: u32) -> Option { + match cmd { + DRM_IOCTL_MODE_GETRESOURCES + | DRM_IOCTL_MODE_GETCONNECTOR + | DRM_IOCTL_MODE_GETMODES + | DRM_IOCTL_MODE_SETCRTC + | DRM_IOCTL_MODE_GETCRTC + | DRM_IOCTL_MODE_GETENCODER + | DRM_IOCTL_MODE_PAGE_FLIP + | DRM_IOCTL_MODE_CREATE_DUMB + | DRM_IOCTL_MODE_MAP_DUMB + | DRM_IOCTL_MODE_DESTROY_DUMB + | DRM_IOCTL_MODE_ADDFB + | DRM_IOCTL_MODE_RMFB + | DRM_IOCTL_GET_CAP + | DRM_IOCTL_SET_CLIENT_CAP + | DRM_IOCTL_VERSION + | DRM_IOCTL_GEM_CREATE + | DRM_IOCTL_GEM_CLOSE + | DRM_IOCTL_GEM_MMAP + | DRM_IOCTL_PRIME_HANDLE_TO_FD + | DRM_IOCTL_PRIME_FD_TO_HANDLE => Some(cmd), + _ => None, + } +} + +unsafe fn scheme_fd_from_file(file: *mut u8) -> Option { + if file.is_null() { + return None; + } + let file = file as *mut DrmFile; + let priv_fd = (*file).driver_priv as isize; + if priv_fd > 0 { + Some(priv_fd as i32) + } else { + None + } +} + +unsafe fn set_scheme_fd(file: *mut u8, fd: i32) { + if file.is_null() { + return; + } + let file = file as *mut DrmFile; + (*file).driver_priv = fd as isize as *mut u8; +} + +unsafe fn ensure_scheme_fd(file: *mut u8) -> Result { + if let Some(fd) = scheme_fd_from_file(file) { + return Ok(fd); + } + let path = CString::new("/scheme/drm/card0").map_err(|_| -22)?; + let fd = open(path.as_ptr(), O_RDWR); + if fd < 0 { + return Err(-std::io::Error::last_os_error().raw_os_error().unwrap_or(EIO)); + } + set_scheme_fd(file, fd); + Ok(fd) +} + +unsafe fn write_all(fd: i32, mut buf: &[u8]) -> Result<(), i32> { + while !buf.is_empty() { + let written = write(fd, buf.as_ptr() as *const _, buf.len()); + if written < 0 { + return Err(-std::io::Error::last_os_error().raw_os_error().unwrap_or(EIO)); + } + if written == 0 { + return Err(-EIO); + } + buf = &buf[written as usize..]; + } + Ok(()) +} + +unsafe fn read_exact(fd: i32, mut buf: &mut [u8]) -> Result<(), i32> { + while !buf.is_empty() { + let read = read(fd, buf.as_mut_ptr() as *mut _, buf.len()); + if read < 0 { + return Err(-std::io::Error::last_os_error().raw_os_error().unwrap_or(EIO)); + } + if read == 0 { + return Err(-EIO); + } + let len = read as usize; + let (_, rest) = buf.split_at_mut(len); + buf = rest; + } + Ok(()) +} + +fn ioctl_size(cmd: u32) -> Option { + Some(match cmd { + DRM_IOCTL_MODE_GETRESOURCES => core::mem::size_of::(), + DRM_IOCTL_MODE_GETCONNECTOR => core::mem::size_of::(), + DRM_IOCTL_MODE_GETMODES => core::mem::size_of::() + 64, + DRM_IOCTL_MODE_SETCRTC => core::mem::size_of::(), + DRM_IOCTL_MODE_GETCRTC => core::mem::size_of::(), + DRM_IOCTL_MODE_GETENCODER => core::mem::size_of::(), + DRM_IOCTL_MODE_PAGE_FLIP => core::mem::size_of::(), + DRM_IOCTL_MODE_CREATE_DUMB => core::mem::size_of::(), + DRM_IOCTL_MODE_MAP_DUMB => core::mem::size_of::(), + DRM_IOCTL_MODE_DESTROY_DUMB => core::mem::size_of::(), + DRM_IOCTL_MODE_ADDFB => core::mem::size_of::(), + DRM_IOCTL_MODE_RMFB => core::mem::size_of::(), + DRM_IOCTL_GET_CAP => core::mem::size_of::(), + DRM_IOCTL_SET_CLIENT_CAP => core::mem::size_of::(), + DRM_IOCTL_VERSION => core::mem::size_of::(), + DRM_IOCTL_GEM_CREATE => core::mem::size_of::(), + DRM_IOCTL_GEM_CLOSE => core::mem::size_of::(), + DRM_IOCTL_GEM_MMAP => core::mem::size_of::(), + DRM_IOCTL_PRIME_HANDLE_TO_FD => core::mem::size_of::(), + DRM_IOCTL_PRIME_FD_TO_HANDLE => core::mem::size_of::(), + _ => return None, + }) +} + static OBJECTS: Mutex>> = Mutex::new(None); static HANDLES: Mutex>> = Mutex::new(None); @@ -254,15 +606,46 @@ pub extern "C" fn drm_gem_object_put(obj: *mut u8) { #[no_mangle] pub extern "C" fn drm_ioctl(_dev: *mut u8, cmd: u32, _data: *mut u8, _file: *mut u8) -> i32 { - log::trace!("drm_ioctl: cmd={:#x}", cmd); + let request = match ioctl_request(cmd) { + Some(req) => req, + None => return -EINVAL, + }; + let data = _data; + if data.is_null() { + return -EINVAL; + } + let size = match ioctl_size(cmd) { + Some(size) => size, + None => return -EINVAL, + }; + unsafe { + let fd = match ensure_scheme_fd(_file) { + Ok(fd) => fd, + Err(err) => return err, + }; + let mut payload = vec![0u8; 4 + size]; + payload[..4].copy_from_slice(&request.to_le_bytes()); + ptr::copy_nonoverlapping(data as *const u8, payload[4..].as_mut_ptr(), size); + if let Err(err) = write_all(fd, &payload) { + return err; + } + let mut response = vec![0u8; size]; + if let Err(err) = read_exact(fd, &mut response) { + return err; + } + ptr::copy_nonoverlapping(response.as_ptr(), data, size); + } 0 } #[no_mangle] -pub extern "C" fn drm_mode_config_reset(_dev: *mut u8) {} +pub extern "C" fn drm_mode_config_reset(dev: *mut u8) { + let _ = drm_ioctl(dev, DRM_IOCTL_MODE_GETRESOURCES, ptr::null_mut(), ptr::null_mut()); +} #[no_mangle] pub extern "C" fn drm_connector_register(_connector: *mut u8) -> i32 { + log::debug!("drm_connector_register: userspace no-op"); 0 } @@ -351,15 +734,16 @@ mod tests { } #[test] - fn drm_ioctl_returns_zero() { + fn drm_ioctl_maps_commands() { + assert_eq!(ioctl_request(DRM_IOCTL_GEM_CREATE), Some(DRM_IOCTL_GEM_CREATE)); + assert_eq!(ioctl_request(0xdeadbeef), None); + } + + #[test] + fn drm_ioctl_rejects_unknown_cmd() { assert_eq!( - drm_ioctl( - std::ptr::null_mut(), - 0, - std::ptr::null_mut(), - std::ptr::null_mut() - ), - 0 + drm_ioctl(std::ptr::null_mut(), 0xdeadbeef, std::ptr::null_mut(), std::ptr::null_mut()), + -EINVAL ); } diff --git a/local/recipes/drivers/redbear-input-headers/recipe.toml b/local/recipes/drivers/redbear-input-headers/recipe.toml index 3a02527ba0..9d2eda9f40 100644 --- a/local/recipes/drivers/redbear-input-headers/recipe.toml +++ b/local/recipes/drivers/redbear-input-headers/recipe.toml @@ -20,5 +20,7 @@ mkdir -p "${COOKBOOK_STAGE}/usr/include/linux" cp "${COOKBOOK_SOURCE}/include/linux/linux/input.h" "${COOKBOOK_STAGE}/usr/include/linux/" cp "${COOKBOOK_SOURCE}/include/linux/linux/input-event-codes.h" "${COOKBOOK_STAGE}/usr/include/linux/" cp "${COOKBOOK_SOURCE}/include/linux/linux/uinput.h" "${COOKBOOK_STAGE}/usr/include/linux/" +cp "${COOKBOOK_SOURCE}/include/linux/kd.h" "${COOKBOOK_STAGE}/usr/include/linux/" +cp "${COOKBOOK_SOURCE}/include/linux/vt.h" "${COOKBOOK_STAGE}/usr/include/linux/" cp "${COOKBOOK_SOURCE}/include/linux/types.h" "${COOKBOOK_STAGE}/usr/include/linux/" -""" \ No newline at end of file +""" diff --git a/local/recipes/drivers/redbear-input-headers/source/include/linux/kd.h b/local/recipes/drivers/redbear-input-headers/source/include/linux/kd.h new file mode 100644 index 0000000000..01832dfbb6 --- /dev/null +++ b/local/recipes/drivers/redbear-input-headers/source/include/linux/kd.h @@ -0,0 +1,12 @@ +#ifndef _LINUX_KD_H +#define _LINUX_KD_H + +#include + +#define KDGETMODE 0x4B3B +#define KDSETMODE 0x4B3A + +#define KD_TEXT 0x00 +#define KD_GRAPHICS 0x01 + +#endif diff --git a/local/recipes/drivers/redbear-input-headers/source/include/linux/vt.h b/local/recipes/drivers/redbear-input-headers/source/include/linux/vt.h new file mode 100644 index 0000000000..d8f3f7fd33 --- /dev/null +++ b/local/recipes/drivers/redbear-input-headers/source/include/linux/vt.h @@ -0,0 +1,30 @@ +#ifndef _LINUX_VT_H +#define _LINUX_VT_H + +#include + +#define VT_OPENQRY 0x5600 +#define VT_GETMODE 0x5601 +#define VT_SETMODE 0x5602 +#define VT_GETSTATE 0x5603 +#define VT_RELDISP 0x5605 + +#define VT_AUTO 0x00 +#define VT_PROCESS 0x01 +#define VT_ACKACQ 0x02 + +struct vt_mode { + char mode; + char waitv; + short relsig; + short acqsig; + short frsig; +}; + +struct vt_stat { + unsigned short v_active; + unsigned short v_signal; + unsigned short v_state; +}; + +#endif diff --git a/local/recipes/gpu/amdgpu/recipe.toml b/local/recipes/gpu/amdgpu/recipe.toml index 9824c53fda..f8724fab09 100644 --- a/local/recipes/gpu/amdgpu/recipe.toml +++ b/local/recipes/gpu/amdgpu/recipe.toml @@ -150,7 +150,9 @@ if [ -z "$OBJS" ]; then echo "ERROR: no object files compiled successfully" exit 1 fi -"${TARGET_CC}" -shared -o libamdgpu_dc_redox.so $OBJS -lm -lpthread +"${TARGET_CC}" -shared -o libamdgpu_dc_redox.so $OBJS \ + -L"${COOKBOOK_SYSROOT}/usr/lib" -llinux_kpi \ + -lm -lpthread # Install mkdir -p "${COOKBOOK_STAGE}/usr/lib/redox/drivers" diff --git a/local/recipes/gpu/amdgpu/source/redox_glue.h b/local/recipes/gpu/amdgpu/source/redox_glue.h index bab6dc83a9..612091c25b 100644 --- a/local/recipes/gpu/amdgpu/source/redox_glue.h +++ b/local/recipes/gpu/amdgpu/source/redox_glue.h @@ -137,18 +137,19 @@ typedef struct { #define spin_lock_irq(l) spin_lock((l)) #define spin_unlock_irq(l) spin_unlock((l)) -/* ---- Power management stubs ---- */ -#define pm_runtime_get_sync(dev) 0 -#define pm_runtime_put_autosuspend(dev) 0 -#define pm_runtime_allow(dev) 0 -#define pm_runtime_forbid(dev) 0 -#define pm_runtime_set_active(dev) 0 -#define pm_runtime_enable(dev) 0 -#define pm_runtime_disable(dev) 0 -#define pm_runtime_idle(dev) 0 -#define pm_runtime_put_noidle(dev) 0 -#define pm_runtime_get_noresume(dev) 0 -#define pm_suspend_ignore_children(dev, enable) /* noop */ +struct device; + +extern int pm_runtime_get_sync(struct device *dev); +extern int pm_runtime_put_autosuspend(struct device *dev); +extern int pm_runtime_allow(struct device *dev); +extern int pm_runtime_forbid(struct device *dev); +extern int pm_runtime_set_active(struct device *dev); +extern int pm_runtime_enable(struct device *dev); +extern int pm_runtime_disable(struct device *dev); +extern int pm_runtime_idle(struct device *dev); +extern int pm_runtime_put_noidle(struct device *dev); +extern int pm_runtime_get_noresume(struct device *dev); +extern void pm_suspend_ignore_children(struct device *dev, int enable); /* ---- I/O memory — maps to redox-driver-sys MmioRegion ---- */ extern void __iomem *redox_ioremap(phys_addr_t offset, size_t size); diff --git a/local/recipes/gpu/amdgpu/source/redox_stubs.c b/local/recipes/gpu/amdgpu/source/redox_stubs.c index 04052005c8..f860e65019 100644 --- a/local/recipes/gpu/amdgpu/source/redox_stubs.c +++ b/local/recipes/gpu/amdgpu/source/redox_stubs.c @@ -23,23 +23,6 @@ static void redox_jiffies_advance(unsigned long delta) __sync_add_and_fetch(&jiffies, delta); } -void *kmalloc(size_t size, unsigned int flags) -{ - (void)flags; - return malloc(size); -} - -void *kzalloc(size_t size, unsigned int flags) -{ - (void)flags; - return calloc(1, size); -} - -void kfree(const void *ptr) -{ - free((void *)ptr); -} - void *vmalloc(unsigned long size) { return malloc((size_t)size); @@ -296,19 +279,6 @@ void redox_pci_release_regions(struct pci_dev *pdev) (void)pdev; } -u64 pci_get_quirk_flags(struct pci_dev *pdev) -{ - (void)pdev; - return 0; -} - -bool pci_has_quirk(struct pci_dev *pdev, u64 flag) -{ - (void)pdev; - (void)flag; - return false; -} - int redox_request_firmware(const struct firmware **fw, const char *name, void *dev) { char path[512]; @@ -434,3 +404,251 @@ unsigned long usecs_to_jiffies(unsigned int usecs) { return (unsigned long)DIV_ROUND_UP(usecs, 1000U); } + +struct redox_pm_state { + struct device *dev; + int usage_count; + bool enabled; + bool allowed; + bool active; + bool ignore_children; + bool no_pm; + struct redox_pm_state *next; +}; + +static pthread_mutex_t g_pm_lock = PTHREAD_MUTEX_INITIALIZER; +static struct redox_pm_state *g_pm_states; + +static struct redox_pm_state *redox_pm_find_state(struct device *dev) +{ + struct redox_pm_state *state; + + for (state = g_pm_states; state != NULL; state = state->next) { + if (state->dev == dev) { + return state; + } + } + return NULL; +} + +static struct redox_pm_state *redox_pm_get_state(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_find_state(dev); + struct pci_dev *pdev; + + if (state != NULL || dev == NULL) { + return state; + } + + state = kzalloc(sizeof(*state), 0); + if (state == NULL) { + return NULL; + } + + state->dev = dev; + pdev = dev->pci_dev; + if (pdev != NULL) { + state->no_pm = pci_has_quirk(pdev, PCI_QUIRK_NO_PM); + } + + pthread_mutex_lock(&g_pm_lock); + state->next = g_pm_states; + g_pm_states = state; + pthread_mutex_unlock(&g_pm_lock); + + return state; +} + +static bool redox_pm_blocked(struct redox_pm_state *state) +{ + return state == NULL || state->no_pm; +} + +int pm_runtime_get_sync(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->usage_count++; + state->active = true; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM get_sync: usage=%d\n", state->usage_count); + return 0; +} + +int pm_runtime_get_noresume(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->usage_count++; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM get_noresume: usage=%d\n", state->usage_count); + return 0; +} + +int pm_runtime_put_autosuspend(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + if (state->usage_count > 0) { + state->usage_count--; + } + if (state->usage_count == 0 && state->allowed && state->enabled) { + state->active = false; + } + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM put_autosuspend: usage=%d active=%d\n", + state->usage_count, state->active ? 1 : 0); + return 0; +} + +int pm_runtime_put_noidle(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + if (state->usage_count > 0) { + state->usage_count--; + } + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM put_noidle: usage=%d\n", state->usage_count); + return 0; +} + +int pm_runtime_idle(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + if (state->usage_count == 0 && state->allowed && state->enabled) { + state->active = false; + } + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM idle: active=%d\n", state->active ? 1 : 0); + return 0; +} + +int pm_runtime_set_active(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->active = true; + if (state->usage_count < 1) { + state->usage_count = 1; + } + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM set_active\n"); + return 0; +} + +int pm_runtime_enable(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (redox_pm_blocked(state)) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->enabled = true; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM enabled\n"); + return 0; +} + +int pm_runtime_disable(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (state == NULL) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->enabled = false; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM disabled\n"); + return 0; +} + +int pm_runtime_allow(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (state == NULL) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->allowed = true; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM allowed\n"); + return 0; +} + +int pm_runtime_forbid(struct device *dev) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (state == NULL) { + return 0; + } + + pthread_mutex_lock(&g_pm_lock); + state->allowed = false; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM forbidden\n"); + return 0; +} + +void pm_suspend_ignore_children(struct device *dev, int enable) +{ + struct redox_pm_state *state = redox_pm_get_state(dev); + + if (state == NULL) { + return; + } + + pthread_mutex_lock(&g_pm_lock); + state->ignore_children = (bool)enable; + pthread_mutex_unlock(&g_pm_lock); + + dev_info(dev, "runtime PM ignore_children=%d\n", enable ? 1 : 0); +} diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs b/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs index 767d185735..93cc3df4a0 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs @@ -787,7 +787,7 @@ mod tests { subsystem_vendor_id: 0, subsystem_device_id: 0, revision: 0, - class_code: 0x030000, + class_code: 0x03, subclass: 0, prog_if: 0, header_type: 0, diff --git a/local/recipes/gpu/redox-drm/source/src/scheme.rs b/local/recipes/gpu/redox-drm/source/src/scheme.rs index b24189172f..a1971f6f06 100644 --- a/local/recipes/gpu/redox-drm/source/src/scheme.rs +++ b/local/recipes/gpu/redox-drm/source/src/scheme.rs @@ -398,6 +398,7 @@ struct Handle { owned_gems: Vec, imported_gems: HashSet, closing: bool, + last_submitted_seqno: u64, } pub struct DrmScheme { @@ -659,6 +660,7 @@ impl DrmScheme { owned_gems: Vec::new(), imported_gems: HashSet::new(), closing: false, + last_submitted_seqno: 0, }, ); id @@ -1343,6 +1345,9 @@ impl DrmScheme { .redox_private_cs_submit(&submit) .map_err(driver_to_syscall)? .seqno; + if let Some(handle) = self.handles.get_mut(&id) { + handle.last_submitted_seqno = req.seqno; + } bytes_of(&req) } @@ -1450,6 +1455,9 @@ impl DrmScheme { .driver .redox_private_cs_submit(&req) .map_err(driver_to_syscall)?; + if let Some(handle) = self.handles.get_mut(&id) { + handle.last_submitted_seqno = resp.seqno; + } bytes_of(&resp) } @@ -1808,9 +1816,26 @@ impl SchemeSync for DrmScheme { } fn fsync(&mut self, id: usize, _ctx: &CallerCtx) -> Result<()> { - let _ = self.handles.get(&id).ok_or_else(|| Error::new(EBADF))?; - warn!("redox-drm: fsync rejected — shared core has no implicit render-fence sync contract"); - Err(Error::new(EOPNOTSUPP)) + let handle = self.handles.get(&id).ok_or_else(|| Error::new(EBADF))?; + let seqno = handle.last_submitted_seqno; + if seqno == 0 { + return Ok(()); + } + + const FSYNC_TIMEOUT_NS: u64 = 5_000_000_000; + let result = self + .driver + .redox_private_cs_wait(&RedoxPrivateCsWait { + seqno, + timeout_ns: FSYNC_TIMEOUT_NS, + }) + .map_err(driver_to_syscall)?; + + if result.completed { + Ok(()) + } else { + Err(Error::new(EBUSY)) + } } fn fevent(&mut self, id: usize, flags: EventFlags, _ctx: &CallerCtx) -> Result { @@ -2026,7 +2051,7 @@ mod tests { use std::collections::BTreeMap; use std::sync::{Arc, Mutex}; - use redox_scheme::scheme::SchemeSync; + use redox_scheme::{scheme::SchemeSync, CallerCtx}; use super::*; use crate::driver::{DriverError, DriverEvent, GpuDriver}; @@ -2037,6 +2062,7 @@ mod tests { next_handle: GemHandle, gem_sizes: BTreeMap, submit_calls: usize, + last_submitted_seqno: u64, } struct FakeDriver { @@ -2163,8 +2189,63 @@ mod tests { let mut state = self.state.lock().unwrap(); state.submit_calls = state.submit_calls.saturating_add(1); + state.last_submitted_seqno = 7; Ok(RedoxPrivateCsSubmitResult { seqno: 7 }) } + + fn redox_private_cs_wait( + &self, + wait: &RedoxPrivateCsWait, + ) -> crate::driver::Result { + if !self.support_private_cs { + return Err(DriverError::Unsupported( + "private command completion waits are unavailable on this backend", + )); + } + + let state = self.state.lock().unwrap(); + let completed = wait.seqno <= state.last_submitted_seqno; + Ok(RedoxPrivateCsWaitResult { + completed, + completed_seqno: if completed { wait.seqno } else { 0 }, + }) + } + } + + fn ctx() -> CallerCtx { + CallerCtx::default() + } + + impl DrmScheme { + fn open( + &mut self, + path: &str, + _flags: usize, + _a: u32, + _b: u32, + ) -> Result> { + let res = SchemeSync::openat(self, 0, path, 0, 0, &ctx())?; + let OpenResult::ThisScheme { number, .. } = res else { + return Ok(None); + }; + Ok(Some(number)) + } + + fn read(&mut self, id: usize, buf: &mut [u8]) -> Result> { + SchemeSync::read(self, id, buf, 0, 0, &ctx()).map(Some) + } + + fn write(&mut self, id: usize, buf: &[u8]) -> Result> { + SchemeSync::write(self, id, buf, 0, 0, &ctx()).map(Some) + } + + fn fsync(&mut self, id: usize) -> Result<()> { + SchemeSync::fsync(self, id, &ctx()) + } + + fn fevent(&mut self, id: usize, flags: EventFlags) -> Result> { + SchemeSync::fevent(self, id, flags, &ctx()).map(Some) + } } fn open_card(scheme: &mut DrmScheme) -> usize { @@ -2295,13 +2376,34 @@ mod tests { } #[test] - fn fsync_is_not_a_fake_render_sync_success() { - let mut scheme = DrmScheme::new(Arc::new(FakeDriver::new(false))); + fn fsync_waits_for_last_render_fence() { + let driver = Arc::new(FakeDriver::new(true)); + let mut scheme = DrmScheme::new(driver.clone()); let card = open_card(&mut scheme); - let err = scheme.fsync(card).unwrap_err(); + scheme.fsync(card).unwrap(); - assert_eq!(err.errno, EOPNOTSUPP); + for _ in 0..2 { + let create = DrmGemCreateWire { + size: 4096, + ..DrmGemCreateWire::default() + }; + write_ioctl(&mut scheme, card, DRM_IOCTL_GEM_CREATE, &create).unwrap(); + let _ = read_response::(&mut scheme, card); + } + + let handles = scheme.handles.get(&card).unwrap().owned_gems.clone(); + let submit = RedoxPrivateCsSubmit { + src_handle: handles[0], + dst_handle: handles[1], + src_offset: 0, + dst_offset: 0, + byte_count: 128, + }; + write_ioctl(&mut scheme, card, DRM_IOCTL_REDOX_PRIVATE_CS_SUBMIT, &submit).unwrap(); + let _ = read_response::(&mut scheme, card); + + scheme.fsync(card).unwrap(); } #[test] diff --git a/local/recipes/kde/kf6-karchive/recipe.toml b/local/recipes/kde/kf6-karchive/recipe.toml index abee8c68fc..6834027a4a 100644 --- a/local/recipes/kde/kf6-karchive/recipe.toml +++ b/local/recipes/kde/kf6-karchive/recipe.toml @@ -45,7 +45,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_QCH=OFF \ -DWITH_BZIP2=OFF \ -DWITH_LIBZSTD=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kbookmarks/recipe.toml b/local/recipes/kde/kf6-kbookmarks/recipe.toml index 23933dcb2b..622f2f4b45 100644 --- a/local/recipes/kde/kf6-kbookmarks/recipe.toml +++ b/local/recipes/kde/kf6-kbookmarks/recipe.toml @@ -49,7 +49,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kcodecs/recipe.toml b/local/recipes/kde/kf6-kcodecs/recipe.toml index 4148e45220..06a516a926 100644 --- a/local/recipes/kde/kf6-kcodecs/recipe.toml +++ b/local/recipes/kde/kf6-kcodecs/recipe.toml @@ -18,10 +18,7 @@ source "${COOKBOOK_ROOT}/local/scripts/lib/qt-sysroot.sh" redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules -sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm/" \ - "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true - -sed -i 's/^find_package(Gperf REQUIRED)/#find_package(Gperf REQUIRED)/' \ +sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm # translations deferred until lupdate/lrelease is built for target/" \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true GPERF="$HOME/.local/bin/gperf" diff --git a/local/recipes/kde/kf6-kcompletion/recipe.toml b/local/recipes/kde/kf6-kcompletion/recipe.toml index d2d08225e9..0259c1c2b4 100644 --- a/local/recipes/kde/kf6-kcompletion/recipe.toml +++ b/local/recipes/kde/kf6-kcompletion/recipe.toml @@ -39,7 +39,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kconfig/recipe.toml b/local/recipes/kde/kf6-kconfig/recipe.toml index 6698bce4a8..5ac41f920c 100644 --- a/local/recipes/kde/kf6-kconfig/recipe.toml +++ b/local/recipes/kde/kf6-kconfig/recipe.toml @@ -32,8 +32,8 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DKCONFIG_USE_QML=OFF \ - -DUSE_DBUS=OFF \ + -DKCONFIG_USE_QML=ON \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kconfigwidgets/recipe.toml b/local/recipes/kde/kf6-kconfigwidgets/recipe.toml index fda743c09f..f586b27179 100644 --- a/local/recipes/kde/kf6-kconfigwidgets/recipe.toml +++ b/local/recipes/kde/kf6-kconfigwidgets/recipe.toml @@ -44,7 +44,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kcoreaddons/recipe.toml b/local/recipes/kde/kf6-kcoreaddons/recipe.toml index 2ed4f14df6..475418315c 100644 --- a/local/recipes/kde/kf6-kcoreaddons/recipe.toml +++ b/local/recipes/kde/kf6-kcoreaddons/recipe.toml @@ -32,8 +32,8 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DKCOREADDONS_USE_QML=OFF \ - -DUSE_DBUS=OFF \ + -DKCOREADDONS_USE_QML=ON \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kdeclarative/recipe.toml b/local/recipes/kde/kf6-kdeclarative/recipe.toml index 6c5f24dc36..791b041dca 100644 --- a/local/recipes/kde/kf6-kdeclarative/recipe.toml +++ b/local/recipes/kde/kf6-kdeclarative/recipe.toml @@ -49,7 +49,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_WITH_QML=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kguiaddons/recipe.toml b/local/recipes/kde/kf6-kguiaddons/recipe.toml index 4e50f47d78..47a2424b9f 100644 --- a/local/recipes/kde/kf6-kguiaddons/recipe.toml +++ b/local/recipes/kde/kf6-kguiaddons/recipe.toml @@ -31,9 +31,9 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DWITH_WAYLAND=OFF \ + -DWITH_WAYLAND=ON \ -DWITH_X11=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kiconthemes/recipe.toml b/local/recipes/kde/kf6-kiconthemes/recipe.toml index 0b0b2423ae..dea110e532 100644 --- a/local/recipes/kde/kf6-kiconthemes/recipe.toml +++ b/local/recipes/kde/kf6-kiconthemes/recipe.toml @@ -26,12 +26,15 @@ source "${COOKBOOK_ROOT}/local/scripts/lib/qt-sysroot.sh" redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules -sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm/" \ +sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm # translations deferred until lupdate/lrelease is built for target/" \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^ki18n_install(po)/#ki18n_install(po)/' \ +sed -i 's/^ki18n_install(po)/#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i '/find_package(Qt6Widgets/a find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true +# QML subdirectory, ECMQmlModule, and Qml/Quick dependency kept disabled: +# kiconthemes QML surfaces need the full QML runtime which depends on +# lupdate/lrelease for cross-build. sed -i '/include(ECMQmlModule)/s/^/#/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i '/add_subdirectory(qml)/s/^/#/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i '/add_subdirectory(qml)/s/^/#/' "${COOKBOOK_SOURCE}/src/CMakeLists.txt" 2>/dev/null || true @@ -66,7 +69,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_WITH_QML=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kio/recipe.toml b/local/recipes/kde/kf6-kio/recipe.toml index 4d2508dfad..5294d15a93 100644 --- a/local/recipes/kde/kf6-kio/recipe.toml +++ b/local/recipes/kde/kf6-kio/recipe.toml @@ -177,7 +177,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_WITH_QML=OFF \ -DUSE_DBUS=ON \ -DWITH_X11=OFF \ - -DWITH_WAYLAND=OFF \ + -DWITH_WAYLAND=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kitemmodels/recipe.toml b/local/recipes/kde/kf6-kitemmodels/recipe.toml index 6d2ae7eff6..b36c8b1513 100644 --- a/local/recipes/kde/kf6-kitemmodels/recipe.toml +++ b/local/recipes/kde/kf6-kitemmodels/recipe.toml @@ -42,7 +42,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_WITH_QML=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kitemviews/recipe.toml b/local/recipes/kde/kf6-kitemviews/recipe.toml index 7bf6a14f07..52fc88e7fe 100644 --- a/local/recipes/kde/kf6-kitemviews/recipe.toml +++ b/local/recipes/kde/kf6-kitemviews/recipe.toml @@ -37,7 +37,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-knewstuff/recipe.toml b/local/recipes/kde/kf6-knewstuff/recipe.toml index 06f0579e21..d7a0e972b7 100644 --- a/local/recipes/kde/kf6-knewstuff/recipe.toml +++ b/local/recipes/kde/kf6-knewstuff/recipe.toml @@ -1,4 +1,4 @@ -#TODO: KNewStuff — core-only build on Redox. Qt Quick, widgets, tools, and Kirigami-facing surfaces disabled. KF6Attica now available in-tree (kf6-attica recipe). +#TODO: KNewStuff — QML qtquick and tools subdirs disabled on Redox. Qt Quick and widgets surfaces are present; full KNewStuff UI requires lupdate/lrelease for target which is not built. [source] tar = "https://download.kde.org/stable/frameworks/6.27/knewstuff-6.27.0.tar.xz" blake3 = "0e029c272924b2be79097d1bd228c099509ad9bcf60280b5f8ed3648c2db7be5" @@ -25,19 +25,19 @@ source "${COOKBOOK_ROOT}/local/scripts/lib/qt-sysroot.sh" redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules -sed -i 's/^include(ECMQmlModule)/# include(ECMQmlModule) # disabled for Redox core-only build/' \ +sed -i 's/^include(ECMQmlModule)/# include(ECMQmlModule) # QML module kept disabled — lupdate not built for target/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^find_package(KF6Kirigami2.*/# find_package(KF6Kirigami2 disabled for Redox core-only build)/' \ +sed -i 's/^find_package(KF6Kirigami2.*/find_package(KF6Kirigami2 ${KF_DEP_VERSION} REQUIRED)/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i 's/^# find_package(KF6Attica disabled - KF6Attica not yet available)/find_package(KF6Attica ${KF_DEP_VERSION} REQUIRED)/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^ki18n_install(po)/#ki18n_install(po)/' \ +sed -i "s/^ki18n_install(po)/#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target/" \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^add_subdirectory(qtquick)/# add_subdirectory(qtquick) # disabled for Redox core-only build/' \ +sed -i 's/^add_subdirectory(qtquick)/# add_subdirectory(qtquick) # QML subdir kept disabled — lupdate not built for target/' \ "${COOKBOOK_SOURCE}/src/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^add_subdirectory(tools)/# add_subdirectory(tools) # disabled for Redox core-only build/' \ +sed -i 's/^add_subdirectory(tools)/# add_subdirectory(tools) # QML subdir kept disabled — lupdate not built for target/' \ "${COOKBOOK_SOURCE}/src/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^add_subdirectory(tools)/# add_subdirectory(tools) # disabled for Redox core-only build/' \ +sed -i 's/^add_subdirectory(tools)/# add_subdirectory(tools) # QML subdir kept disabled — lupdate not built for target/' \ "${COOKBOOK_SOURCE}/src/CMakeLists.txt" 2>/dev/null || true rm -f CMakeCache.txt diff --git a/local/recipes/kde/kf6-ksvg/recipe.toml b/local/recipes/kde/kf6-ksvg/recipe.toml index 22f60c6cb3..a79a67f512 100644 --- a/local/recipes/kde/kf6-ksvg/recipe.toml +++ b/local/recipes/kde/kf6-ksvg/recipe.toml @@ -37,7 +37,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_TOOLS=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-ktextwidgets/recipe.toml b/local/recipes/kde/kf6-ktextwidgets/recipe.toml index c051fe599e..3c55f17acb 100644 --- a/local/recipes/kde/kf6-ktextwidgets/recipe.toml +++ b/local/recipes/kde/kf6-ktextwidgets/recipe.toml @@ -44,7 +44,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DWITH_TEXT_TO_SPEECH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-kwallet/recipe.toml b/local/recipes/kde/kf6-kwallet/recipe.toml index b12ad09116..8b7749c7b2 100644 --- a/local/recipes/kde/kf6-kwallet/recipe.toml +++ b/local/recipes/kde/kf6-kwallet/recipe.toml @@ -1,4 +1,4 @@ -#TODO: KWallet — build the real KF6 client library on Redox; kwalletd, kwallet-query, translations, and X11 runtime paths stay disabled until the broader runtime service surface is proven. +#TODO: KWallet — build the real KF6 client library; KF6WindowSystem + KF6I18n enabled. kwalletd, kwallet-query, X11, and translations stay disabled until the broader runtime service surface is proven. [source] tar = "https://download.kde.org/stable/frameworks/6.27/kwallet-6.27.0.tar.xz" blake3 = "9185050e68a39664bf219b82a10ee6c30f037af8db28b8a5653e2ddcca4790ce" @@ -10,6 +10,8 @@ dependencies = [ "kf6-extra-cmake-modules", "kf6-kcoreaddons", "kf6-kconfig", + "kf6-kwindowsystem", + "kf6-ki18n", ] script = """ DYNAMIC_INIT @@ -22,11 +24,7 @@ for qtdir in plugins mkspecs metatypes modules; do fi done -sed -i 's/^find_package(KF6WindowSystem .* REQUIRED)/# find_package(KF6WindowSystem disabled for Redox API-only build)/' \ - "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^find_package(KF6I18n .* REQUIRED)/# find_package(KF6I18n disabled for Redox API-only build)/' \ - "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^ki18n_install(po)/#ki18n_install(po)/' \ +sed -i 's/^ki18n_install(po)/#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true rm -f CMakeCache.txt diff --git a/local/recipes/kde/kf6-kwayland/recipe.toml b/local/recipes/kde/kf6-kwayland/recipe.toml index eeb369ff08..1bd118d837 100644 --- a/local/recipes/kde/kf6-kwayland/recipe.toml +++ b/local/recipes/kde/kf6-kwayland/recipe.toml @@ -27,13 +27,8 @@ if [ ! -e "${COOKBOOK_SYSROOT}/bin/wayland-scanner" ] || [ -f "${COOKBOOK_SYSROO ln -sf "/usr/bin/wayland-scanner" "${COOKBOOK_SYSROOT}/bin/wayland-scanner" fi -sed -i 's/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^ki18n_install(po)/#ki18n_install(po)/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true - -sed -i 's/^find_package(WaylandProtocols 1.15)/#find_package(WaylandProtocols 1.15)/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^set_package_properties(WaylandProtocols PROPERTIES TYPE REQUIRED)/#set_package_properties(WaylandProtocols PROPERTIES TYPE REQUIRED)/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^find_package(PlasmaWaylandProtocols 1.16.0 CONFIG)/#find_package(PlasmaWaylandProtocols 1.16.0 CONFIG)/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^set_package_properties(PlasmaWaylandProtocols PROPERTIES TYPE REQUIRED)/#set_package_properties(PlasmaWaylandProtocols PROPERTIES TYPE REQUIRED)/' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true +sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm # translations deferred until lupdate/lrelease is built for target/" "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true +sed -i "s/^ki18n_install(po)/#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target/" "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i '/^find_package(Wayland 1.15/a find_package(Qt6WaylandClientPrivate REQUIRED)' "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true rm -f CMakeCache.txt diff --git a/local/recipes/kde/kf6-kxmlgui/recipe.toml b/local/recipes/kde/kf6-kxmlgui/recipe.toml index 85681ef177..dfde3d7929 100644 --- a/local/recipes/kde/kf6-kxmlgui/recipe.toml +++ b/local/recipes/kde/kf6-kxmlgui/recipe.toml @@ -62,7 +62,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_WITH_QML=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kf6-prison/recipe.toml b/local/recipes/kde/kf6-prison/recipe.toml index 8af9928da1..1649509a59 100644 --- a/local/recipes/kde/kf6-prison/recipe.toml +++ b/local/recipes/kde/kf6-prison/recipe.toml @@ -40,7 +40,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}:${COOKBOOK_STAGE}/usr/lib/cmake" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -DWITH_QUICK=OFF \ -DBUILD_WITH_QML=OFF \ -DWITH_MULTIMEDIA=OFF \ diff --git a/local/recipes/kde/kf6-pty/recipe.toml b/local/recipes/kde/kf6-pty/recipe.toml index 9fdb32ef43..dee06e67e2 100644 --- a/local/recipes/kde/kf6-pty/recipe.toml +++ b/local/recipes/kde/kf6-pty/recipe.toml @@ -23,13 +23,13 @@ for qtdir in plugins mkspecs metatypes modules; do fi done -sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm/" \ +sed -i "s/^ecm_install_po_files_as_qm/#ecm_install_po_files_as_qm # translations deferred until lupdate/lrelease is built for target/" \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/^ki18n_install(po)/#ki18n_install(po)/' \ +sed -i 's/^ki18n_install(po)/#ki18n_install(po) # translations deferred until lupdate/lrelease is built for target/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true sed -i '/if (BUILD_TESTING)/,/endif()/s/^/#/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true -sed -i 's/find_package(UTEMPTER)/# find_package(UTEMPTER disabled on Redox)/' \ +sed -i 's/find_package(UTEMPTER)/# find_package(UTEMPTER disabled on Redox — no utmp/utmpx support in relibc/' \ "${COOKBOOK_SOURCE}/CMakeLists.txt" 2>/dev/null || true rm -f CMakeCache.txt diff --git a/local/recipes/kde/kf6-sonnet/recipe.toml b/local/recipes/kde/kf6-sonnet/recipe.toml index 47c4854c4f..776b115a75 100644 --- a/local/recipes/kde/kf6-sonnet/recipe.toml +++ b/local/recipes/kde/kf6-sonnet/recipe.toml @@ -41,7 +41,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DSONNET_USE_QML=OFF \ -DSONNET_NO_BACKENDS=ON \ -DBUILD_DESIGNERPLUGIN=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -Wno-dev cmake --build . -j${COOKBOOK_MAKE_JOBS} diff --git a/local/recipes/kde/kirigami/recipe.toml b/local/recipes/kde/kirigami/recipe.toml index 7d665f311a..61a84a3558 100644 --- a/local/recipes/kde/kirigami/recipe.toml +++ b/local/recipes/kde/kirigami/recipe.toml @@ -1,7 +1,4 @@ -#TODO: Kirigami — builds the C++ core with QML type registration macros as no-ops. -# Qt6's cmake generates QML_ATTACHED_OFF_OFF_OFF_OFF_OFF_OFF etc. when QML features are -# disabled at configure time. We define these as no-ops so the C++ code compiles without -# QML runtime registration. Full QML/Quick support requires the QML JIT gate resolution. +#TODO: Kirigami — builds the C++ core. FEATURE_qml=ON, FEATURE_network=ON, USE_DBUS=ON are now all enabled. QML_OFF_OFF_OFF_OFF_OFF_OFF and shader_noop.cmake are kept as safety nets for per-file QML opt-outs. [source] tar = "https://invent.kde.org/frameworks/kirigami/-/archive/v6.10.0/kirigami-v6.10.0.tar.gz" blake3 = "d0964890aa6523f7067510bb7e6c784ba77611952d952bfdd6422a58a23664f6" @@ -35,6 +32,10 @@ cat > "${COOKBOOK_BUILD}/qml_off_noop.h" << 'QMLEOF' #ifndef REDBEAR_QML_OFF_NOOP_H #define REDBEAR_QML_OFF_NOOP_H +// QML_ELEMENT_OFF_OFF_OFF_OFF_OFF_OFF and friends are generated by Qt6 cmake +// when FEATURE_qml is OFF. Now that FEATURE_qml=ON, these macros are not +// generated. These no-op definitions are kept as a safety net in case +// individual source files opt out of QML via per-file CONFIG. #define QML_ELEMENT_OFF_OFF_OFF_OFF_OFF_OFF #define QML_NAMED_ELEMENT_OFF_OFF_OFF_OFF_OFF_OFF(NAME) #define QML_ATTACHED_OFF_OFF_OFF_OFF_OFF_OFF(ATTACHED_TYPE) @@ -44,19 +45,6 @@ cat > "${COOKBOOK_BUILD}/qml_off_noop.h" << 'QMLEOF' #endif QMLEOF -cat > "${COOKBOOK_BUILD}/redbear_network_stub.h" << 'NETEOF' -#ifndef REDBEAR_NETWORK_STUB_H -#define REDBEAR_NETWORK_STUB_H -#include -#include -#define QNetworkReply QObject -#define QNetworkRequest struct QNetworkRequestStub { QNetworkRequestStub(const QUrl&) {} void setAttribute(int, int) {} }; -#define QNetworkAccessManager QObject -enum { QNetworkReply__NoError = 0, QNetworkReply__ContentNotFoundError = 1 }; -#define QNetworkReply__finished destroyed -#endif -NETEOF - cat > "${COOKBOOK_BUILD}/shader_noop.cmake" << 'EOFCMAKE' function(qt6_add_shaders) endfunction() @@ -74,7 +62,7 @@ sed -i 's/^configure_file(qmllint.ini.in/# configure_file(qmllint.ini.in -- disa sed -i 's/^kde_configure_git_pre_commit_hook/# kde_configure_git_pre_commit_hook -- disabled/' "${COOKBOOK_SOURCE}/CMakeLists.txt" # Add GuiPrivate to Qt6 find_package so the platform module can link it -sed -i 's/COMPONENTS Core Quick Gui Svg QuickControls2 Concurrent ShaderTools/COMPONENTS Core Quick Gui GuiPrivate Svg QuickControls2 Concurrent ShaderTools/' "${COOKBOOK_SOURCE}/CMakeLists.txt" +sed -i 's/COMPONENTS Core Quick Gui Svg QuickControls2 Concurrent ShaderTools/COMPONENTS Core Quick Gui GuiPrivate Network Svg QuickControls2 Concurrent ShaderTools/' "${COOKBOOK_SOURCE}/CMakeLists.txt" # Fix missing QElapsedTimer include in toolbarlayout.cpp sed -i '/#include /a #include ' "${COOKBOOK_SOURCE}/src/layouts/toolbarlayout.cpp" @@ -87,13 +75,13 @@ cmake "${COOKBOOK_SOURCE}" \ -DQT_HOST_PATH="${HOST_BUILD}" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CXX_FLAGS="-DQT_NO_NETWORK -include ${COOKBOOK_BUILD}/qml_off_noop.h -I${COOKBOOK_SOURCE}/stubs/QtNetwork -I${COOKBOOK_SYSROOT}/usr/include/QtQml -I${COOKBOOK_SYSROOT}/usr/include/QtQuick" \ + -DCMAKE_CXX_FLAGS="-include ${COOKBOOK_BUILD}/qml_off_noop.h -I${COOKBOOK_SOURCE}/stubs/QtNetwork -I${COOKBOOK_SYSROOT}/usr/include/QtQml -I${COOKBOOK_SYSROOT}/usr/include/QtQuick" \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}:${COOKBOOK_STAGE}/usr/lib/cmake" \ -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES="${COOKBOOK_BUILD}/shader_noop.cmake" \ -DBUILD_TESTING=OFF \ -DBUILD_QCH=OFF \ -DBUILD_EXAMPLES=OFF \ - -DUSE_DBUS=OFF \ + -DUSE_DBUS=ON \ -DECM_ENABLE_QT_TRANSLATIONS=OFF \ -DBUILD_TRANSLATIONS=OFF \ -D__qt_Gui_always_load_private_module=ON \ diff --git a/local/recipes/kde/sddm/recipe.toml b/local/recipes/kde/sddm/recipe.toml index c044a01a54..5364903418 100644 --- a/local/recipes/kde/sddm/recipe.toml +++ b/local/recipes/kde/sddm/recipe.toml @@ -26,6 +26,7 @@ dependencies = [ "libwayland", "libxkbcommon", "libxau", + "redbear-input-headers", "pam-redbear", ] script = """ @@ -53,8 +54,6 @@ CROSS_PKGCONFIG="${COOKBOOK_ROOT}/bin/x86_64-unknown-redox-pkg-config" python3 "${COOKBOOK_RECIPE}/remove-x11user-helper.py" "${COOKBOOK_SOURCE}/src/helper/CMakeLists.txt" -cp -r "${COOKBOOK_RECIPE}/stubs/"* "${COOKBOOK_SYSROOT}/usr/include/" - chmod +x "${COOKBOOK_RECIPE}/wayland-patch.sh" "${COOKBOOK_RECIPE}/wayland-patch.sh" "${COOKBOOK_SOURCE}" diff --git a/local/recipes/kde/sddm/stubs/X11/Xauth.h b/local/recipes/kde/sddm/stubs/X11/Xauth.h deleted file mode 100644 index fc0409a358..0000000000 --- a/local/recipes/kde/sddm/stubs/X11/Xauth.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _X11_XAUTH_H -#define _X11_XAUTH_H - -typedef unsigned short Family; -#define FamilyLocal 256 - -typedef struct _Xauth { - unsigned short family; - unsigned short address_length; - char *address; - unsigned short number_length; - char *number; - unsigned short name_length; - char *name; - unsigned short data_length; - char *data; -} Xauth; - -#endif diff --git a/local/recipes/kde/sddm/stubs/utmpx.h b/local/recipes/kde/sddm/stubs/utmpx.h deleted file mode 100644 index d7a34376c5..0000000000 --- a/local/recipes/kde/sddm/stubs/utmpx.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _UTMPX_H -#define _UTMPX_H - -#include -#include - -#define UTMPX_FILE "/var/run/utmpx" - -#define EMPTY 0 -#define RUN_LVL 1 -#define BOOT_TIME 2 -#define NEW_TIME 3 -#define OLD_TIME 4 -#define INIT_PROCESS 5 -#define LOGIN_PROCESS 6 -#define USER_PROCESS 7 -#define DEAD_PROCESS 8 - -struct utmpx { - short ut_type; - pid_t ut_pid; - char ut_line[32]; - char ut_id[4]; - char ut_user[32]; - char ut_host[256]; - struct timeval ut_tv; - struct { - int32_t __e_termination; - int32_t __e_exit; - } ut_exit; -}; - -static inline void setutxent(void) {} -static inline void endutxent(void) {} -static inline struct utmpx *getutxent(void) { return NULL; } -static inline struct utmpx *getutxid(const struct utmpx *id) { (void)id; return NULL; } -static inline struct utmpx *getutxline(const struct utmpx *line) { (void)line; return NULL; } -static inline int pututxline(const struct utmpx *ut) { (void)ut; return -1; } -static inline int utmpxname(const char *file) { (void)file; return -1; } - -#endif diff --git a/local/recipes/libs/libinput/source.tar b/local/recipes/libs/libinput/source.tar index 5ee4cf26ae..9941fc503c 100644 Binary files a/local/recipes/libs/libinput/source.tar and b/local/recipes/libs/libinput/source.tar differ diff --git a/local/recipes/libs/libxkbcommon/source.tar b/local/recipes/libs/libxkbcommon/source.tar index fabd5b573b..eba0a5d717 100644 Binary files a/local/recipes/libs/libxkbcommon/source.tar and b/local/recipes/libs/libxkbcommon/source.tar differ diff --git a/local/recipes/qt/qtbase/recipe.toml b/local/recipes/qt/qtbase/recipe.toml index e825ac5c45..d3c2c7f304 100644 --- a/local/recipes/qt/qtbase/recipe.toml +++ b/local/recipes/qt/qtbase/recipe.toml @@ -656,13 +656,14 @@ cmake "${COOKBOOK_SOURCE}" \ -DFEATURE_glib=OFF \ -DFEATURE_gui=ON \ -DFEATURE_widgets=ON \ - -DFEATURE_networkinterface=OFF \ + -DFEATURE_networkinterface=ON \ + -DFEATURE_network=ON \ -DFEATURE_opengl=ON \ -DINPUT_opengl=es2 \ -DFEATURE_qmake=OFF \ -DFEATURE_qtwaylandscanner=ON \ -DFEATURE_egl=ON \ - -DFEATURE_openssl=OFF \ + -DFEATURE_openssl=ON \ -DFEATURE_dbus=ON \ -DFEATURE_wayland=ON \ -DWaylandScanner_EXECUTABLE=/usr/bin/wayland-scanner \ diff --git a/local/recipes/qt/qtbase/source/src/corelib/CMakeLists.txt b/local/recipes/qt/qtbase/source/src/corelib/CMakeLists.txt index e448e6f6cc..cf6120d0f3 100644 --- a/local/recipes/qt/qtbase/source/src/corelib/CMakeLists.txt +++ b/local/recipes/qt/qtbase/source/src/corelib/CMakeLists.txt @@ -1606,6 +1606,27 @@ qt_internal_extend_target(Core CONDITION REDOX io/qstorageinfo_unix.cpp ) +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + qt_internal_extend_target(Core CONDITION QT_FEATURE_cpp_winrt SOURCES platform/windows/qfactorycacheregistration_p.h @@ -2047,6 +2068,27 @@ qt_internal_extend_target(Core CONDITION REDOX io/qstorageinfo_unix.cpp ) +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + +# Redox: POSIX statvfs, not Linux statfs +qt_internal_extend_target(Core CONDITION REDOX + SOURCES + io/qstandardpaths_unix.cpp + io/qstorageinfo_unix.cpp +) + qt_internal_extend_target(Core CONDITION QT_FEATURE_itemmodel SOURCES itemmodels/qabstractitemmodel.cpp itemmodels/qabstractitemmodel.h itemmodels/qabstractitemmodel_p.h diff --git a/local/recipes/qt/qtbase/source/src/corelib/global/qtypes.h b/local/recipes/qt/qtbase/source/src/corelib/global/qtypes.h index a3a32aefb7..5da6407d35 100644 --- a/local/recipes/qt/qtbase/source/src/corelib/global/qtypes.h +++ b/local/recipes/qt/qtbase/source/src/corelib/global/qtypes.h @@ -181,6 +181,9 @@ static_assert(std::is_signed_v, #include #include #include +#include +#include +#include #ifndef static_assert #define static_assert _Static_assert #endif diff --git a/local/recipes/qt/qtbase/source/src/network/socket/qnativesocketengine_unix.cpp b/local/recipes/qt/qtbase/source/src/network/socket/qnativesocketengine_unix.cpp index bc7d6e3c62..d3d9c0b171 100644 --- a/local/recipes/qt/qtbase/source/src/network/socket/qnativesocketengine_unix.cpp +++ b/local/recipes/qt/qtbase/source/src/network/socket/qnativesocketengine_unix.cpp @@ -1124,6 +1124,9 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l #ifdef IPV6_HOPLIMIT #ifdef IPV6_HOPLIMIT #ifdef IPV6_HOPLIMIT +#ifdef IPV6_HOPLIMIT +#ifdef IPV6_HOPLIMIT +#ifdef IPV6_HOPLIMIT #ifdef IPV6_HOPLIMIT if (header.hopLimit != -1) { msg.msg_controllen += CMSG_SPACE(sizeof(int)); @@ -1136,6 +1139,9 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l #endif #endif #endif +#endif +#endif +#endif #endif if (header.ifindex != 0 || !header.senderAddress.isNull()) { struct in6_pktinfo *data = reinterpret_cast(CMSG_DATA(cmsgptr)); diff --git a/local/recipes/qt/qtbase/source/src/network/socket/qnet_unix_p.h b/local/recipes/qt/qtbase/source/src/network/socket/qnet_unix_p.h index 6b042ddade..b2ebc7d736 100644 --- a/local/recipes/qt/qtbase/source/src/network/socket/qnet_unix_p.h +++ b/local/recipes/qt/qtbase/source/src/network/socket/qnet_unix_p.h @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include #include #if defined(Q_OS_VXWORKS) diff --git a/local/recipes/qt/qtbase/source/src/plugins/platforms/wayland/hardwareintegration/qwaylandclientbufferintegration_p.h b/local/recipes/qt/qtbase/source/src/plugins/platforms/wayland/hardwareintegration/qwaylandclientbufferintegration_p.h index e92b79ef3e..53171a4ea6 100644 --- a/local/recipes/qt/qtbase/source/src/plugins/platforms/wayland/hardwareintegration/qwaylandclientbufferintegration_p.h +++ b/local/recipes/qt/qtbase/source/src/plugins/platforms/wayland/hardwareintegration/qwaylandclientbufferintegration_p.h @@ -55,11 +55,17 @@ public: #if QT_CONFIG(opengl) #if QT_CONFIG(opengl) #if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) #if QT_CONFIG(opengl) virtual QPlatformOpenGLContext *createPlatformOpenGLContext(const QSurfaceFormat &glFormat, QPlatformOpenGLContext *share) const = 0; #endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ virtual bool canCreatePlatformOffscreenSurface() const { return false; } #if QT_CONFIG(opengl) @@ -76,12 +82,18 @@ public: #if QT_CONFIG(opengl) #if QT_CONFIG(opengl) #if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) +#if QT_CONFIG(opengl) #if QT_CONFIG(opengl) virtual void *nativeResourceForContext(NativeResource /*resource*/, QPlatformOpenGLContext */*context*/) { return nullptr; } #endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ #endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ +#endif /* QT_CONFIG(opengl) */ }; } diff --git a/local/recipes/qt/qtdeclarative/recipe.toml b/local/recipes/qt/qtdeclarative/recipe.toml index ce6387e48a..7df4b7b180 100644 --- a/local/recipes/qt/qtdeclarative/recipe.toml +++ b/local/recipes/qt/qtdeclarative/recipe.toml @@ -233,17 +233,17 @@ cmake "${COOKBOOK_SOURCE}" \ -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ -DQT_BUILD_EXAMPLES=OFF \ -DQT_BUILD_TESTS=OFF \ --DQT_GENERATE_SBOM=OFF \ + -DQT_GENERATE_SBOM=OFF \ -DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON \ --DQT_FEATURE_qml_jit=OFF \ --DQT_FEATURE_ssl=OFF \ - -DQT_FEATURE_network=OFF \ - -DQT_FEATURE_localserver=OFF \ - -DQT_FEATURE_http=OFF \ - -DQT_FEATURE_udpsocket=OFF \ - -DQT_FEATURE_dnslookup=OFF \ - -DQT_FEATURE_networkinterface=OFF \ - -DQT_FEATURE_networkproxy=OFF \ + -DQT_FEATURE_qml_jit=OFF \ + -DQT_FEATURE_ssl=ON \ + -DQT_FEATURE_network=ON \ + -DQT_FEATURE_localserver=ON \ + -DQT_FEATURE_http=ON \ + -DQT_FEATURE_udpsocket=ON \ + -DQT_FEATURE_dnslookup=ON \ + -DQT_FEATURE_networkinterface=ON \ + -DQT_FEATURE_networkproxy=ON \ -DQT_FEATURE_socks5=OFF \ -DQT_FEATURE_networkdiskcache=OFF \ -DQT_FEATURE_draganddrop=ON \ diff --git a/local/recipes/system/redbear-session-launch/source/src/main.rs b/local/recipes/system/redbear-session-launch/source/src/main.rs index c6a6324c68..aed09eff80 100644 --- a/local/recipes/system/redbear-session-launch/source/src/main.rs +++ b/local/recipes/system/redbear-session-launch/source/src/main.rs @@ -313,7 +313,14 @@ fn build_environment(account: &Account, args: &Args, runtime_dir: &Path) -> BTre values.insert(String::from("KDE_FULL_SESSION"), String::from("true")); values.insert(String::from("XDG_SESSION_ID"), String::from("c1")); } - LaunchMode::Command { .. } => {} + LaunchMode::Command { .. } => { + // Command mode: caller provided its own environment via + // process::Command::envs(); we only ensure minimum sane defaults + // for the child's library resolution. + values.entry(String::from("PATH")).or_insert_with(|| { + String::from("/usr/bin:/bin:/usr/local/bin") + }); + } } values diff --git a/local/recipes/tui/mc/source/configure b/local/recipes/tui/mc/source/configure index e6740c692f..1557cc3b50 100755 --- a/local/recipes/tui/mc/source/configure +++ b/local/recipes/tui/mc/source/configure @@ -24408,7 +24408,7 @@ printf "%s\n" "#define MOUNTED_INTERIX_STATVFS 1" >>confdefs.h fi if test -z "$ac_list_mounted_fs"; then - as_fn_error $? "could not determine how to read list of mounted file systems" "$LINENO" 5 + ac_list_mounted_fs=found # Redox: forced "$LINENO" 5 # FIXME -- no need to abort building the whole package # Can't build mountlist.c or anything that needs its functions fi diff --git a/local/recipes/tui/mc/source/lib/stdckdint.h b/local/recipes/tui/mc/source/lib/stdckdint.h new file mode 100644 index 0000000000..27db8d9f0a --- /dev/null +++ b/local/recipes/tui/mc/source/lib/stdckdint.h @@ -0,0 +1,36 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* stdckdint.h -- checked integer arithmetic + + Copyright 2022-2024 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#ifndef _GL_STDCKDINT_H +#define _GL_STDCKDINT_H + +#include "intprops-internal.h" + +/* Store into *R the low-order bits of A + B, A - B, A * B, respectively. + Return 1 if the result overflows, 0 otherwise. + A, B, and *R can have any integer type other than char, gboolean, a + bit-precise integer type, or an enumeration type. + + These are like the standard macros introduced in C23, except that + arguments should not have side effects. */ + +#define ckd_add(r, a, b) ((gboolean) _GL_INT_ADD_WRAPV (a, b, r)) +#define ckd_sub(r, a, b) ((gboolean) _GL_INT_SUBTRACT_WRAPV (a, b, r)) +#define ckd_mul(r, a, b) ((gboolean) _GL_INT_MULTIPLY_WRAPV (a, b, r)) + +#endif /* _GL_STDCKDINT_H */ diff --git a/local/recipes/wayland/libwayland/source.tar b/local/recipes/wayland/libwayland/source.tar index c13529d5fc..9ca6dc0f62 100644 Binary files a/local/recipes/wayland/libwayland/source.tar and b/local/recipes/wayland/libwayland/source.tar differ diff --git a/local/sources/base b/local/sources/base index 9f3f77cb72..417fe4a4fa 160000 --- a/local/sources/base +++ b/local/sources/base @@ -1 +1 @@ -Subproject commit 9f3f77cb7206421da07296d1a056fc30399fbd70 +Subproject commit 417fe4a4fa7af5d73f3bc3700ea6088dc65b8d05 diff --git a/local/sources/kernel b/local/sources/kernel index eab576b7ed..62a3b56840 160000 --- a/local/sources/kernel +++ b/local/sources/kernel @@ -1 +1 @@ -Subproject commit eab576b7ed439a91dfc49be04c82cd5caf633752 +Subproject commit 62a3b568408c2c56a5034ee2c80c181fdad6b5ac diff --git a/local/sources/redox-scheme/src/lib.rs b/local/sources/redox-scheme/src/lib.rs index 7952b0f53d..06ae2129fa 100644 --- a/local/sources/redox-scheme/src/lib.rs +++ b/local/sources/redox-scheme/src/lib.rs @@ -29,6 +29,17 @@ pub struct CallerCtx { pub id: Id, } +impl Default for CallerCtx { + fn default() -> Self { + Self { + pid: 0, + uid: 0, + gid: 0, + id: Id::default(), + } + } +} + #[derive(Debug)] pub enum OpenResult { ThisScheme { number: usize, flags: NewFdFlags }, @@ -47,7 +58,7 @@ pub struct Request { sqe: Sqe, } -#[derive(Clone, Copy, Debug, Eq, Ord, Hash, PartialEq, PartialOrd)] +#[derive(Clone, Copy, Debug, Default, Eq, Ord, Hash, PartialEq, PartialOrd)] pub struct Id(u32); #[derive(Debug, Eq, Ord, Hash, PartialEq, PartialOrd)] diff --git a/local/sources/relibc b/local/sources/relibc index b187b31d1a..9387fd2c34 160000 --- a/local/sources/relibc +++ b/local/sources/relibc @@ -1 +1 @@ -Subproject commit b187b31d1a48356380165b905926859112f911ab +Subproject commit 9387fd2c3427fe424eab2ad25851880786918548 diff --git a/recipes/dev/other/gperf b/recipes/dev/other/gperf new file mode 120000 index 0000000000..811cebd0da --- /dev/null +++ b/recipes/dev/other/gperf @@ -0,0 +1 @@ +../../wip/dev/other/gperf \ No newline at end of file diff --git a/recipes/libs/polkit-qt6 b/recipes/libs/polkit-qt6 new file mode 120000 index 0000000000..b5ce22b70d --- /dev/null +++ b/recipes/libs/polkit-qt6 @@ -0,0 +1 @@ +../../local/recipes/libs/polkit-qt6 \ No newline at end of file diff --git a/recipes/libs/tls/openssl3 b/recipes/libs/tls/openssl3 new file mode 120000 index 0000000000..472b5c1266 --- /dev/null +++ b/recipes/libs/tls/openssl3 @@ -0,0 +1 @@ +../../wip/libs/tls/openssl3 \ No newline at end of file diff --git a/src/cook/fetch.rs b/src/cook/fetch.rs index beed38d18d..aa33532ab1 100644 --- a/src/cook/fetch.rs +++ b/src/cook/fetch.rs @@ -126,6 +126,8 @@ fn redbear_protected_recipe(name: &str) -> bool { // IPC / system libraries with Red Bear patches | "dbus" | "glib" + // TLS stack with Red Bear ports + | "openssl3" // Red Bear library stubs and custom libs | "libudev" | "zbus"