[packages/libcaca] - rel 2 - fix building ruby bindings - java bindings disabled, too old and broken - switch to python
baggins
baggins at pld-linux.org
Mon Apr 20 17:53:04 CEST 2026
commit 118ae7b230436f8dfeb3035efd3f318b38a24ecc
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Mon Apr 20 19:52:18 2026 +0200
- rel 2
- fix building ruby bindings
- java bindings disabled, too old and broken
- switch to python3
libcaca.spec | 24 ++++----
ruby-c99.patch | 80 +++++++++++++++++++++++++++
typed-ruby.patch | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 260 insertions(+), 10 deletions(-)
---
diff --git a/libcaca.spec b/libcaca.spec
index 8427654..94490e2 100644
--- a/libcaca.spec
+++ b/libcaca.spec
@@ -1,7 +1,7 @@
#
# Conditional build:
%bcond_without dotnet # C#/Mono binding
-%bcond_without java # Java binding
+%bcond_with java # Java binding
%bcond_without ruby # Ruby binding
%bcond_without python # Python binding
%bcond_without ncurses # ncurses driver
@@ -14,7 +14,7 @@
%undefine with_dotnet
%endif
-%define rel 1
+%define rel 2
%define subver beta20
Summary: Graphics library that outputs text instead of pixels
Summary(pl.UTF-8): Biblioteka graficzna wyświetlająca tekst zamiast pikseli
@@ -31,6 +31,8 @@ Patch1: ruby-vendordir.patch
Patch2: %{name}-sh.patch
Patch3: %{name}-plugins.patch
Patch4: %{name}-javah.patch
+Patch5: ruby-c99.patch
+Patch6: typed-ruby.patch
URL: http://caca.zoy.org/wiki/libcaca
BuildRequires: OpenGL-devel
BuildRequires: autoconf >= 2.50
@@ -64,13 +66,14 @@ BuildRequires: rpm-javaprov
BuildRequires: libcaca-devel
%endif
%if %{with python}
-BuildRequires: python-devel >= 2.2
+BuildRequires: python3-devel
BuildRequires: rpm-pythonprov
%endif
%if %{with ruby}
BuildRequires: rpm-rubyprov
BuildRequires: ruby-devel
%endif
+Obsoletes: python-caca < 0.99-0.beta20.2
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
%define specflags -fomit-frame-pointer
@@ -245,18 +248,18 @@ Java bindings for libcaca.
%description -n java-caca -l pl.UTF-8
Wiązania Javy do libcaca.
-%package -n python-caca
+%package -n python3-caca
Summary: Python bindings for libcaca
Summary(pl.UTF-8): Wiązania Pythona do libcaca
Group: Development/Languages/Python
Requires: %{name} = %{version}-%{release}
# ctypes
-Requires: python-modules
+Requires: python3-modules
-%description -n python-caca
+%description -n python3-caca
Python bindings for libcaca.
-%description -n python-caca -l pl.UTF-8
+%description -n python3-caca -l pl.UTF-8
Wiązania Pythona do libcaca.
%package -n ruby-caca
@@ -278,6 +281,8 @@ Wiązania języka Ruby do libcaca.
%patch -P2 -p1
%patch -P3 -p1
%patch -P4 -p1
+%patch -P5 -p1
+%patch -P6 -p1
%build
%{__libtoolize}
@@ -426,10 +431,9 @@ rm -rf $RPM_BUILD_ROOT
%{_javadir}/libjava.jar
%endif
-%files -n python-caca
+%files -n python3-caca
%defattr(644,root,root,755)
-%dir %{py_sitescriptdir}/caca
-%{py_sitescriptdir}/caca/*.py[co]
+%{py3_sitescriptdir}/caca
%files -n ruby-caca
%defattr(644,root,root,755)
diff --git a/ruby-c99.patch b/ruby-c99.patch
new file mode 100644
index 0000000..a7278bd
--- /dev/null
+++ b/ruby-c99.patch
@@ -0,0 +1,80 @@
+From 1a818d4c2dfb4fbe45d81ac1d50fbe5736f65cbf Mon Sep 17 00:00:00 2001
+From: Pascal Terjan <pterjan at mageia.org>
+Date: Mon, 27 Oct 2025 22:04:51 +0000
+Subject: [PATCH] Fix Ruby binding for new GCC
+
+Patch from Fedora
+https://src.fedoraproject.org/rpms/libcaca/blob/rawhide/f/libcaca-0.99.beta20-c99.patch
+---
+ ruby/caca-canvas.c | 9 +++++----
+ ruby/caca-display.c | 2 +-
+ ruby/caca-font.c | 2 +-
+ 3 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/ruby/caca-canvas.c b/ruby/caca-canvas.c
+index 5dc66abb..1bf05385 100644
+--- a/ruby/caca-canvas.c
++++ b/ruby/caca-canvas.c
+@@ -16,6 +16,7 @@
+ #include <errno.h>
+ #include "caca-dither.h"
+ #include "caca-font.h"
++#include "caca_internals.h"
+ #include "common.h"
+
+ VALUE cCanvas;
+@@ -742,7 +743,7 @@ void Init_caca_canvas(VALUE mCaca)
+ rb_define_method(cCanvas, "put_str", put_str, 3);
+ rb_define_method(cCanvas, "printf", cprintf, -1);
+
+- rb_define_method(cCanvas, "get_attr", get_attr, 3);
++ rb_define_method(cCanvas, "get_attr", get_attr, 2);
+ rb_define_method(cCanvas, "attr=", set_attr, 1);
+ rb_define_method(cCanvas, "set_attr", set_attr2, 1);
+ rb_define_method(cCanvas, "put_attr", put_attr, 3);
+@@ -773,7 +774,7 @@ void Init_caca_canvas(VALUE mCaca)
+ rb_define_method(cCanvas, "draw_triangle", draw_triangle, 7);
+ rb_define_method(cCanvas, "draw_thin_triangle", draw_thin_triangle, 6);
+ rb_define_method(cCanvas, "fill_triangle", fill_triangle, 7);
+- rb_define_method(cCanvas, "fill_triangle_textured", fill_triangle_textured, 4);
++ rb_define_method(cCanvas, "fill_triangle_textured", fill_triangle_textured, 3);
+ rb_define_method(cCanvas, "dither_bitmap", dither_bitmap, 6);
+
+ rb_define_method(cCanvas, "frame_count", get_frame_count, 0);
+@@ -792,8 +793,8 @@ void Init_caca_canvas(VALUE mCaca)
+ rb_define_method(cCanvas, "import_area_from_file", import_area_from_file, 4);
+ rb_define_method(cCanvas, "export_to_memory", export_to_memory, 1);
+ rb_define_method(cCanvas, "export_area_to_memory", export_area_to_memory, 5);
+- rb_define_singleton_method(cCanvas, "export_list", export_list, 0);
+- rb_define_singleton_method(cCanvas, "import_list", import_list, 0);
++ rb_define_singleton_method(cCanvas, "export_list", (VALUE (*)(VALUE)) export_list, 0);
++ rb_define_singleton_method(cCanvas, "import_list", (VALUE (*)(VALUE)) import_list, 0);
+
+ rb_define_method(cCanvas, "disable_dirty_rect", disable_dirty_rect, 0);
+ rb_define_method(cCanvas, "enable_dirty_rect", enable_dirty_rect, 0);
+diff --git a/ruby/caca-display.c b/ruby/caca-display.c
+index ac29dafd..6e4cfa20 100644
+--- a/ruby/caca-display.c
++++ b/ruby/caca-display.c
+@@ -226,7 +226,7 @@ static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout)
+ return e;
+ }
+
+-static VALUE driver_list(void)
++static VALUE driver_list(VALUE unused)
+ {
+ VALUE ary;
+ char const* const* list;
+diff --git a/ruby/caca-font.c b/ruby/caca-font.c
+index 705f928c..72b56298 100644
+--- a/ruby/caca-font.c
++++ b/ruby/caca-font.c
+@@ -41,7 +41,7 @@ static VALUE font_initialize(VALUE self, VALUE name)
+ return self;
+ }
+
+-static VALUE font_list(void)
++static VALUE font_list(VALUE unused)
+ {
+ VALUE ary;
+ char const* const* list;
diff --git a/typed-ruby.patch b/typed-ruby.patch
new file mode 100644
index 0000000..e52d8dd
--- /dev/null
+++ b/typed-ruby.patch
@@ -0,0 +1,166 @@
+From 7c8e3338a1bda8a34297d16ac546c43548e4864d Mon Sep 17 00:00:00 2001
+From: Pascal Terjan <pterjan at mageia.org>
+Date: Sun, 12 Apr 2026 21:32:36 +0100
+Subject: [PATCH] Switch to typed Ruby wrapping
+
+---
+ ruby/caca-canvas.c | 37 ++++++++++++++++++++++++++++++++-----
+ ruby/caca-display.c | 11 ++++++++---
+ ruby/caca-dither.c | 9 ++++++++-
+ ruby/caca-font.c | 9 ++++++++-
+ 4 files changed, 56 insertions(+), 10 deletions(-)
+
+diff --git a/ruby/caca-canvas.c b/ruby/caca-canvas.c
+index b82e0781..33ced761 100644
+--- a/ruby/caca-canvas.c
++++ b/ruby/caca-canvas.c
+@@ -18,6 +18,7 @@
+ #include "caca-font.h"
+ #include "caca_internals.h"
+ #include "common.h"
++#include "limits.h"
+
+ VALUE cCanvas;
+
+@@ -41,16 +42,42 @@ static void canvas_free(void * p)
+ caca_free_canvas((caca_canvas_t *)p);
+ }
+
++static size_t canvas_size(const void *p)
++{
++ const caca_canvas_t *cv = (const caca_canvas_t *)p;
++
++ if (cv->height * cv->width > INT_MAX / cv->framecount) {
++ return INT_MAX;
++ }
++
++ return cv->height * cv->width * cv->framecount;
++}
++
++static const rb_data_type_t canvas_dt = {
++ .wrap_struct_name = "Caca::Canvas",
++ .function = {
++ .dsize = canvas_size,
++ .dfree = canvas_free,
++ },
++};
++
++static const rb_data_type_t display_autocreated_canvas_dt = {
++ .wrap_struct_name = "Caca::Canvas",
++ .function = {
++ .dsize = canvas_size,
++ },
++};
++
+ static VALUE canvas_alloc(VALUE klass)
+ {
+ VALUE obj;
+- obj = Data_Wrap_Struct(klass, NULL, canvas_free, NULL);
++ obj = TypedData_Wrap_Struct(klass, &canvas_dt, NULL);
+ return obj;
+ }
+
+ VALUE canvas_create(caca_canvas_t *canvas)
+ {
+- return Data_Wrap_Struct(cCanvas, NULL, NULL, canvas);
++ return TypedData_Wrap_Struct(cCanvas, &display_autocreated_canvas_dt, canvas);
+ }
+
+ static VALUE canvas_initialize(VALUE self, VALUE width, VALUE height)
+@@ -223,7 +250,7 @@ static VALUE blit(int argc, VALUE* argv, VALUE self) {
+ {
+ rb_raise(rb_eArgError, "src is not a Caca::Canvas");
+ }
+- Data_Get_Struct(src, caca_canvas_t, csrc);
++ TypedData_Get_Struct(src, caca_canvas_t, &canvas_dt, csrc);
+
+ if(!NIL_P(mask))
+ {
+@@ -231,7 +258,7 @@ static VALUE blit(int argc, VALUE* argv, VALUE self) {
+ {
+ rb_raise(rb_eArgError, "mask is not a Caca::Canvas");
+ }
+- Data_Get_Struct(mask, caca_canvas_t, cmask);
++ TypedData_Get_Struct(mask, caca_canvas_t, &canvas_dt, cmask);
+ }
+ else
+ cmask = NULL;
+@@ -504,7 +531,7 @@ static VALUE fill_triangle_textured(VALUE self, VALUE coords, VALUE texture, VAL
+ {
+ rb_raise(rb_eArgError, "texture is not a Caca::Canvas");
+ }
+- Data_Get_Struct(texture, caca_canvas_t, ctexture);
++ TypedData_Get_Struct(texture, caca_canvas_t, &canvas_dt, ctexture);
+
+ caca_fill_triangle_textured(_SELF, ccoords, ctexture, cuv);
+ return self;
+diff --git a/ruby/caca-display.c b/ruby/caca-display.c
+index a3b34877..b478fc21 100644
+--- a/ruby/caca-display.c
++++ b/ruby/caca-display.c
+@@ -23,11 +23,16 @@ void display_free(void *display)
+ caca_free_display((caca_display_t *)display);
+ }
+
++static const rb_data_type_t display_dt = {
++ .wrap_struct_name = "Caca::Display",
++ .function = {
++ .dfree = display_free,
++ },
++};
++
+ static VALUE display_alloc(VALUE klass)
+ {
+- VALUE obj;
+- obj = Data_Wrap_Struct(klass, 0, display_free, NULL);
+- return obj;
++ return TypedData_Wrap_Struct(klass, &display_dt, NULL);
+ }
+
+ static VALUE display_initialize(int argc, VALUE* argv, VALUE self)
+diff --git a/ruby/caca-dither.c b/ruby/caca-dither.c
+index 0ca5e5f6..b4e8d9c3 100644
+--- a/ruby/caca-dither.c
++++ b/ruby/caca-dither.c
+@@ -21,10 +21,17 @@ void dither_free(void *dither)
+ caca_free_dither((caca_dither_t *)dither);
+ }
+
++static const rb_data_type_t dither_dt = {
++ .wrap_struct_name = "Caca::Dither",
++ .function = {
++ .dfree = dither_free,
++ },
++};
++
+ static VALUE dither_alloc(VALUE klass)
+ {
+ VALUE obj;
+- obj = Data_Wrap_Struct(klass, 0, dither_free, NULL);
++ obj = TypedData_Wrap_Struct(klass, &dither_dt, NULL);
+ return obj;
+ }
+
+diff --git a/ruby/caca-font.c b/ruby/caca-font.c
+index 72b56298..20c0e31c 100644
+--- a/ruby/caca-font.c
++++ b/ruby/caca-font.c
+@@ -21,10 +21,17 @@ void font_free(void *font)
+ caca_free_font((caca_font_t *)font);
+ }
+
++static const rb_data_type_t font_dt = {
++ .wrap_struct_name = "Caca::Font",
++ .function = {
++ .dfree = font_free,
++ },
++};
++
+ static VALUE font_alloc(VALUE klass)
+ {
+ VALUE obj;
+- obj = Data_Wrap_Struct(klass, 0, font_free, NULL);
++ obj = TypedData_Wrap_Struct(klass, &font_dt, NULL);
+ return obj;
+ }
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/libcaca.git/commitdiff/118ae7b230436f8dfeb3035efd3f318b38a24ecc
More information about the pld-cvs-commit
mailing list