diff options
author | Celeste <20312-Celeste@users.gitlab.alpinelinux.org> | 2024-05-06 06:04:27 +0000 |
---|---|---|
committer | Celeste <20312-Celeste@users.gitlab.alpinelinux.org> | 2024-05-06 13:28:53 +0000 |
commit | 3aa827ecaca3b820585ac0851d853c6c03dd8de7 (patch) | |
tree | 9acf3d33b655cb6e339dffc1af7a5777ab923532 | |
parent | f6f3fe49e5654474548834d50b6cb7df796446f8 (diff) |
community/wezterm: fix build with rust 1.78
-rw-r--r-- | community/wezterm/APKBUILD | 4 | ||||
-rw-r--r-- | community/wezterm/rust1.78-from_raw_parts.patch | 154 |
2 files changed, 157 insertions, 1 deletions
diff --git a/community/wezterm/APKBUILD b/community/wezterm/APKBUILD index 8310557d901..f854aee3818 100644 --- a/community/wezterm/APKBUILD +++ b/community/wezterm/APKBUILD @@ -3,7 +3,7 @@ pkgname=wezterm pkgver=20240203.110809 _pkgver="${pkgver/./-}-5046fc22" -pkgrel=1 +pkgrel=2 pkgdesc="GPU-accelerated cross-platform terminal emulator and multiplexer written in Rust" url="https://wezfurlong.org/wezterm/" # s390x blocked by nix crate @@ -53,6 +53,7 @@ subpackages=" source=" https://github.com/wez/wezterm/releases/download/$_pkgver/wezterm-$_pkgver-src.tar.gz link-against-system-libs.patch + rust1.78-from_raw_parts.patch " builddir="$srcdir/wezterm-$_pkgver" options="net" @@ -161,4 +162,5 @@ fonts() { sha512sums=" 2413e1537ed4cf699f0754d76f35cd679591e4e215e782fab61f5bd7c4615e3916398e16709445406ef241e3fb721111daed917c546abb1f5130109b40bb2774 wezterm-20240203-110809-5046fc22-src.tar.gz d4c13f079dd0348d60eed577a0467cf4da9b202c5c959902b0626019c95d945d2a91023bc6844c19d5a3aecaa8d0de007966a6a2113549fe5328c3c8de79381f link-against-system-libs.patch +a13edbf756ef697ecc640103589d686043f4790b36ac0867a777c47cae1b6cd7482eca229d514fb6feb61e5b274c564e304eacad90001dff82e3dc01f20a3ffa rust1.78-from_raw_parts.patch " diff --git a/community/wezterm/rust1.78-from_raw_parts.patch b/community/wezterm/rust1.78-from_raw_parts.patch new file mode 100644 index 00000000000..3ef4f95e3be --- /dev/null +++ b/community/wezterm/rust1.78-from_raw_parts.patch @@ -0,0 +1,154 @@ +Patch-Source: https://github.com/wez/wezterm/commit/67d4ba9f76470a7ff1f3e7609119cdbb9d33024c +-- +From 67d4ba9f76470a7ff1f3e7609119cdbb9d33024c Mon Sep 17 00:00:00 2001 +From: Wez Furlong <wez@wezfurlong.org> +Date: Sat, 4 May 2024 15:53:28 -0700 +Subject: [PATCH] fix when running on rust 1.78 + +std::slice::from_raw_parts will now panic if the ptr is null. +Resolve this by adding our own wrapper that translates that +case to an empty slice. +--- + wezterm-font/src/ftwrap.rs | 60 +++++++++++-------------- + wezterm-font/src/rasterizer/freetype.rs | 4 +- + 2 files changed, 29 insertions(+), 35 deletions(-) + +diff --git a/wezterm-font/src/ftwrap.rs b/wezterm-font/src/ftwrap.rs +index 5f06a3fb809..5c9bf128631 100644 +--- a/wezterm-font/src/ftwrap.rs ++++ b/wezterm-font/src/ftwrap.rs +@@ -260,10 +260,7 @@ impl Face { + } + + let bytes = unsafe { +- std::slice::from_raw_parts( +- sfnt_name.string as *const u8, +- sfnt_name.string_len as usize, +- ) ++ from_raw_parts(sfnt_name.string as *const u8, sfnt_name.string_len as usize) + }; + + let encoding = match (sfnt_name.platform_id as u32, sfnt_name.encoding_id as u32) { +@@ -350,14 +347,12 @@ impl Face { + { + let mm = &*mm; + +- let styles = +- std::slice::from_raw_parts(mm.namedstyle, mm.num_namedstyles as usize); ++ let styles = from_raw_parts(mm.namedstyle, mm.num_namedstyles as usize); + let instance = &styles[vidx]; +- let axes = std::slice::from_raw_parts(mm.axis, mm.num_axis as usize); ++ let axes = from_raw_parts(mm.axis, mm.num_axis as usize); + + for (i, axis) in axes.iter().enumerate() { +- let coords = +- std::slice::from_raw_parts(instance.coords, mm.num_axis as usize); ++ let coords = from_raw_parts(instance.coords, mm.num_axis as usize); + let value = coords[i].to_num::<f64>(); + let default_value = axis.def.to_num::<f64>(); + let scale = if default_value != 0. { +@@ -436,7 +431,7 @@ impl Face { + pub fn pixel_sizes(&self) -> Vec<u16> { + let sizes = unsafe { + let rec = &(*self.face); +- std::slice::from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) ++ from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) + }; + sizes + .iter() +@@ -494,7 +489,7 @@ impl Face { + + let sizes = unsafe { + let rec = &(*self.face); +- std::slice::from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) ++ from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) + }; + if sizes.is_empty() { + return Err(err); +@@ -723,24 +718,12 @@ impl Face { + let data = result.assume_init(); + let mut palettes = vec![]; + +- let name_ids = if data.palette_name_ids.is_null() { +- &[] +- } else { +- std::slice::from_raw_parts(data.palette_name_ids, data.num_palettes as usize) +- }; +- let flagses = if data.palette_flags.is_null() { +- &[] +- } else { +- std::slice::from_raw_parts(data.palette_flags, data.num_palettes as usize) +- }; +- let entry_name_ids = if data.palette_entry_name_ids.is_null() { +- &[] +- } else { +- std::slice::from_raw_parts( +- data.palette_entry_name_ids, +- data.num_palette_entries as usize, +- ) +- }; ++ let name_ids = from_raw_parts(data.palette_name_ids, data.num_palettes as usize); ++ let flagses = from_raw_parts(data.palette_flags, data.num_palettes as usize); ++ let entry_name_ids = from_raw_parts( ++ data.palette_entry_name_ids, ++ data.num_palette_entries as usize, ++ ); + + let entry_names: Vec<String> = entry_name_ids + .iter() +@@ -777,10 +760,8 @@ impl Face { + ft_result(FT_Get_Sfnt_Name(self.face, i, sfnt_name.as_mut_ptr()), ()) + .context("FT_Get_Sfnt_Name")?; + let sfnt_name = sfnt_name.assume_init(); +- let bytes = std::slice::from_raw_parts( +- sfnt_name.string as *const u8, +- sfnt_name.string_len as usize, +- ); ++ let bytes = ++ from_raw_parts(sfnt_name.string as *const u8, sfnt_name.string_len as usize); + + let encoding = match (sfnt_name.platform_id as u32, sfnt_name.encoding_id as u32) { + (TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE) +@@ -1472,6 +1453,19 @@ impl FreeTypeStream { + } + } + ++/// Wrapper around std::slice::from_raw_parts that allows for ptr to be ++/// null. In the null ptr case, an empty slice is returned. ++/// This is necessary because it is common for freetype to encode ++/// empty arrays in that way, and rust 1.78 will panic if a null ++/// ptr is passed in. ++pub(crate) unsafe fn from_raw_parts<'a, T>(ptr: *const T, size: usize) -> &'a [T] { ++ if ptr.is_null() { ++ &[] ++ } else { ++ std::slice::from_raw_parts(ptr, size) ++ } ++} ++ + #[derive(Debug)] + pub struct PaletteInfo { + pub num_palettes: usize, +diff --git a/wezterm-font/src/rasterizer/freetype.rs b/wezterm-font/src/rasterizer/freetype.rs +index 9f9cf334243..2e7a366a1cb 100644 +--- a/wezterm-font/src/rasterizer/freetype.rs ++++ b/wezterm-font/src/rasterizer/freetype.rs +@@ -20,8 +20,8 @@ use cairo::{Content, Context, Extend, Format, ImageSurface, Matrix, Operator, Re + use config::{DisplayPixelGeometry, FreeTypeLoadFlags, FreeTypeLoadTarget}; + use std::cell::RefCell; + use std::f64::consts::PI; ++use std::mem; + use std::mem::MaybeUninit; +-use std::{mem, slice}; + use wezterm_color_types::{linear_u8_to_srgb8, SrgbaPixel}; + + pub struct FreeTypeRasterizer { +@@ -93,7 +93,7 @@ impl FontRasterizer for FreeTypeRasterizer { + // pitch is the number of bytes per source row + let pitch = ft_glyph.bitmap.pitch.abs() as usize; + let data = unsafe { +- slice::from_raw_parts_mut( ++ crate::ftwrap::from_raw_parts( + ft_glyph.bitmap.buffer, + ft_glyph.bitmap.rows as usize * pitch, + ) |