[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