Hi Brenton,

thank you very much for your detailed reply. I was aware of your project, from the mailing list. However, I have difficulties seeing how it addresses the main problem I referred to. In my opinion, the kernel version should be completely immaterial, as you can have any distribution on any kernel (within reason), and I don't understand how a library like this can depend on the kernel version. Something looks distinctly wrong.

Ubuntu does have certain kernel versions associated with each release, and that appears to be what tecmake relies on. But this is only true for host installs of Ubuntu, not even when running an Ubuntu-based container, and certainly not with other distributions.

Your approach to finding the right Webkit version is going in the right direction, as it doesn't appear to depend on the kernel, but on the distribution, but in a way it is even more cumbersome, as there are at least as many distributions. You effectively still require Ubuntu.

A better way would be to rely neither on the kernel nor the distribution, and detect the dependencies using a configuration generator like the old autoconf (shudder!) or the more common CMake. Indeed, there is an old CMake file in the sources of iup, but I guess people became discouraged while trying to develop it. CMake can also generate .deb packages, among other package formats, so in principle there would be a way to automate the whole process up to the generation of installable packages. But I guess that would be quite an effort.

For the moment I was hoping that I can build the missing logic around the existing tecmake, and fool tecmake into thinking that it has a certain kernel when it hasn't. Or, maybe even better, to find the required dependencies outside, and bypass tecmake's dependency logic, i.e. call tecmake to build the project with the dependencies I've determined outside. For example, this could be done with CMake's ExternalProject module.

I figure that this would be much easier than replacing the entire tecmake, as the problems are all with the configuration logic, not the build itself.

I hope this makes sense to you. If you are knowledgeable enough with tecmake, maybe you can say how the configuration logic in tecmake can be bypassed, and replaced with values passed in from the outside. That would get me started, I think.

Cheers
Stefan


On 11/05/2025 05:49, sur-behoffski wrote:
On 2025-05-10 01:56, Stefan Heinzmann via Iup-users wrote:
Hi all,

I am building the libraries with mixed success on Linux. My problems
appear to originate with the system detection built into tecmake. For a
reason I can't find an explanation for, the Linux kernel version appears
to play a major role. I wonder why, can anyone here enlighten me or
point me to a document with the rationale?

The problem is that you can't determine the versions of libraries
installed on the system from the kernel version with any reliability.
You can very easily have an up-to-date Ubuntu running on an old kernel,
for example when using containers. Containers don't include a kernel,
they use the kernel on the host. Having older kernels run a newer
distribution in the container is a common situation, and the opposite
also happens. Hence, the kernel version really should have no bearing at
all on the build process.

Given the tecmake system as it is, I would at least need a simple way to
"fake" or bypass the kernel detection in a way that would match the
distribution used, so that the dependencies are determined correctly.

I guess I would be able to figure this out from the tecmake sources, but
I was hoping there's an easier way somebody already knows about.

Thanks for any light you can shed on the matter.

Cheers
Stefan

G'day Stefan,

I've been working to bring GNU/Linux, Lua, and Tecgraf IM/CD/IUP
together.

I have a SourceForge project called lglicua:

         L -- Lua
         G -- GNU/Linux
         I -- IM
         C -- CD
         U -- IUP
         A -- Assistant

         https://sourceforge.net/projects/lglicua/

This has been mostly my own project, with help from Tecgraf and
PUC-Rio Lua folks.  Because it's failed to catch the imagination,
I'm only calling it a "beta" version.  In practice,

         https://sourceforge.net/projects/lglicua/files/

shows that releases have spanned early May 2021 to end July 2024.
Releases are often connected to Lua and/or LuaRocks releases
and/or bugfixes, as I whitelist these versions in the Assistant.

You can get a "hello, world" modal dialog box in only two lines:

```
         #!/bin/bash ../support/play-lua-tec
         iup=require("iuplua"); iup.Message("MyApp", "hello, world")
```
You don't specify the GNU/Linux distribution you are using.
Lglicua has been tested (briefly) on [as per 0.1-beta2 release]:

         * Debian/Ubuntu family:
                 - Debian
                 - Kali,
                 - Linux Mint,
                 - MX, and
                 Ubuntu;

         *Red Hat family:
                 - CentOS,
                 - CentOS-Stream, and
                 - Rocky

Whitelisting by name and major version number is used.

         ** CentOS: Core-7, Stream-8 and Stream-9;
         ** Debian 12.5;
         ** Kali 2024.2;
         ** Linux Mint 19.3, 20.3, 21.3 and newly-released 22;
         ** MX 23.3_ahs_x64;
         ** Rocky: 8.10, 9.3 and 9.4; and
         ** Ubuntu: 22.04.4, 23.10 and 24.04.

Linux kernels include 3.10, 4.18, 5.4, 5.14, 5.15, 6.1, 6.5, 6.8, 6.8.11 and 
6.9.8.

GCC versions span 4.8.5 (CentOS Core-7) to 13.2 (Linux Mint-22 and Ubuntu 
24.04).

(Although GNU/Linux Mint 22.1 has been released, I haven't tested
lflicua against it).

------------------------------------------------

The Tecgraf sources for IM/CD/IUP nominate Ubuntu as the model
distribution for GNU/Linux releases.  Looking at the sources,
there looks to be acknowledgement for many different OSes,
especially in "project/src/tecmake.mak".

I've looked into dependencies of libraries (GTK etc), and have
tailored these according to distribution+release version.

--------

To your immediate difficulties:  I've encountered very similar problems
when preparing lglicua for the wide range of distributions and
release versions.  Two items stand out:

         1. I've replaced the IM/CD/IUP "tecmake.mak" with a rewritten
            version of my own.  This greatly streamlines GNU/Linux
            support, and, especially, adds support for all kernels 6.x
            (and, hopefully,) up to 9.x.

            Library versions have a maze of dependencies, and do refer
            to non-Linux platforms, so my rewrite may break things
            on non-GNU/Linux platforms -- but (of course), given that
            lglicua is, by definition, GNU/Linux, this doesn't matter.
            In particular, look at GTK selection.  The rewritten
            "tecmake.mak" uses (having just identified "Linux" as
            "TEC_SYSNAME"):

                    ifneq ($(filter 3 4 5 6 7 8 9, $(TEC_SYSVERSION)), )
                         USE_GTK3 = Yes
                    else # [...]

            whereas the Tecgraf-shipped version uses a verbose chain
            of Makefile "$(findstring ...)" to do the identification,
            and this chain hasn't been updated to include Kernel 6:

                    ifneq ($(findstring Linux5, $(TEC_UNAME)), )
                      USE_GTK3 = Yes
                    endif

           The practical upshot of not identifying Kernel 6.x as
           being compatible with GTK3 is that tecmake.mak gets confused
           and lapses back to GTK2, and then library selection and
           linking break.


-------- Newer tecmake.mak: --------

# Refine GTK default request:  Newer GNU/Linux systems get GTK3,
# unless GTK2 is specifically defined.
# 240510: CHANGED in lglicua: We incorporate a modified change of the
# Tecgraf IUP' r5950 change (r4.21->r4.22); the parent tested for
# Linux31, and only selected USE_GTK3 if, in addition, TEC_DIST is
# CentOS.  Here, we run this test (and, by extension, the following cygw
# test) if TEC_SYSNAME is Linux, but TEC_SYSVERSION is (effectively)
# less than 4.
ifdef GTK_DEFAULT
   ifndef USE_GTK2
     ifneq ($(filter linux Linux, $(TEC_SYSNAME)), )
       ifneq ($(filter 3 4 5 6 7 8 9, $(TEC_SYSVERSION)), )
         USE_GTK3 = Yes
       else ifneq ($(filter centos CentOS, $(TEC_DIST)), )
         USE_GTK3 = Yes
       endif
     else ifneq ($(filter cygw CYGW, $(TEC_UNAME)), )
       USE_GTK3 = Yes
     endif
   endif
endif

-------- Tecgraf-shipped tecmake.mak: --------

ifneq ($(findstring Linux24, $(TEC_UNAME)), )
   NO_GTK_DEFAULT = Yes
endif
ifeq ($(TEC_UNAME), Linux26)
   NO_GTK_DEFAULT = Yes
endif
ifeq ($(TEC_UNAME), Linux26_64)
   NO_GTK_DEFAULT = Yes
endif

ifndef NO_GTK_DEFAULT
   ifneq ($(findstring cygw, $(TEC_UNAME)), )
     GTK_DEFAULT = Yes
   endif
   ifneq ($(findstring CentOS, $(TEC_UNAME)), )
     GTK_DEFAULT = Yes
   endif
   ifneq ($(findstring Linux, $(TEC_UNAME)), )
     GTK_DEFAULT = Yes
   endif
   ifneq ($(findstring MacOS, $(TEC_UNAME)), )
     GTK_DEFAULT = Yes
   endif
   ifneq ($(findstring FreeBSD, $(TEC_UNAME)), )
     GTK_DEFAULT = Yes
   endif
   ifneq ($(findstring SunOS, $(TEC_UNAME)), )
     ifeq ($(TEC_SYSARCH), x86)
       GTK_DEFAULT = Yes
     endif
   endif
endif

ifdef GTK_DEFAULT
   ifndef USE_GTK2
     ifneq ($(findstring Linux5, $(TEC_UNAME)), )
       USE_GTK3 = Yes
     endif
     ifneq ($(findstring Linux4, $(TEC_UNAME)), )
       USE_GTK3 = Yes
     endif
     ifneq ($(findstring Linux31, $(TEC_UNAME)), )
       USE_GTK3 = Yes
     endif
     ifneq ($(findstring cygw, $(TEC_UNAME)), )
       USE_GTK3 = Yes
     endif
     #Homebrew
     #ifneq ($(findstring MacOS10, $(TEC_UNAME)), )
     #  USE_GTK3 = Yes
     #endif
   endif
endif



-------- end of tecmake.mak comparison --------



         2. I had serious trouble trying to match GNU/Linux
            distributions, Release versions and libraries,
            so I extended tec_uname to help out:  For example,
            see how WebKit is chosen according to distribution
            name and version.  [There may be redundancies that
            can be merged/eliminated in a future release.]:

            $ ./tec_uname webkit


ReportWebkitItems()
{
     local I
     local L

     # At the time of writing (240726), GetLinuxDistro sets TEC_DISTID,
     # but *not* GTK.
     GTK="/usr/"
     GetLinuxDistro

     # Use short names to keep line lengths under control.
     I="${GTK}include/"
     L="${GTK}lib/"

     # (Note to self: We rely on the package manager to pull in
     # dependencies for the package list only, notably
     # libsoup-2.4-dev[el] or libsoup-3.0-dev[el].  However, we probably
     # still have to name them explicitly for #include directories.)
     case "${TEC_DISTID}" in
         centos-core.7 )
             WK_PACKAGES="webkitgtk4-devel"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         centos-stream.8 )
             WK_PACKAGES="webkit2gtk3-devel"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         centos-stream.9 )
             WK_PACKAGES="webkit2gtk3-devel"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         debian.12 )
             WK_PACKAGES="webkit2gtk-4.0-dev"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         kali.2024 )
             WK_PACKAGES="webkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         linuxmint.19 )
             WK_PACKAGES="libwebkit2gtk-4.0-dev"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         linuxmint.20 )
             # LM20.3 does not have wk-4.1 etc.
             WK_PACKAGES="libwebkit2gtk-4.0-dev"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         linuxmint.21 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         linuxmint.22 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         MX.23 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         rocky.8 )
             WK_PACKAGES="webkit2gtk3-devel"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         rocky.9 )
             # Works for both Rocky 9.3 and 9.4.
             WK_PACKAGES="webkit2gtk3-devel"
             WK_INCLUDES="${I}libsoup-2.4 ${I}webkitgtk-4.0"
             WK_LIBRARIES="webkit2gtk-4.0"
             ;;

         ubuntu.22 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         ubuntu.23 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         ubuntu.24 )
             WK_PACKAGES="libwebkit2gtk-4.1-dev"
             WK_INCLUDES="${I}libsoup-3.0 ${I}webkitgtk-4.1"
             WK_LIBRARIES="webkit2gtk-4.1"
             ;;

         * )
             echo "Warning:__Ignoring__${TEC_DISTID}"
             return 42
     esac

     # ?? WARNING:  Several consumers of one-liner output use the text as
     # a subfield within another field.  While the client could edit out
     # the trailing whitespace (Bash or Lua versions), it's easier on
     # them, and gives more readable code, if we use "echo -n" here.

     case "$1" in
         webkit )
             cat <<EOF
WK_DISTID=${TEC_DISTID}
WK_PACKAGES=${WK_PACKAGES}
WK_INCLUDES=${WK_INCLUDES}
WK_LIBRARIES=${WK_LIBRARIES}
EOF
             ;;

         webkit-packages )
             echo -n "$WK_PACKAGES"
             ;;

         webkit-includes )
             echo -n "$WK_INCLUDES"
             ;;

         webkit-libraries )
             echo -n "$WK_LIBRARIES"
             ;;

         default )
             echo "Unknown ReportWebkitItems selection: ${1}"
             ;;
     esac
}

-------- end of tec_uname snippet --------

(There are more build/include/library dependencies in
"LGLICUA/svn/assistant-database.lua", but I'll omit these
as this message is getting too long.]

--

Cheers,

sur-behoffski (Brenton Hoff)
programmer, Grouse Software


_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users



_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to