G'day,
A long(ish?) description of lglicua installation, build, and then,
finally, narrowing in on both lglicua's GNU/Linux shared object (.so)
model, plus some thoughts/comparisons to Windows shared dynamic link
libraries (.dll).
1. Clone a "master" VM into a "work" VM, then use qemu-nbd to unpack
lglicua-0.1-beta1.tar.gz into /home/qm/lglicua-0.1-beta1/:
2. Use the following string of commands within the VM to install and
select Lua 5.4, along with LuaRocks 3.9.2, also configured for 5.4:
cd /home/qm/*/install/ && ./i lua-install 5.4 && ./i
lua-environment-force 5.4 fer-real && ./i reboot-now
The final reboot is because LuaRocks needs to have both LUA_PATH and
LUA_CPATH reference Lua 5.4, and so, upon login after startup, we run:
/etc/profile.d/17-LuaRocks-3.9.2-LUA_PATH-and-LUA_CPATH.sh
3. After reboot, we now have a working Lua environment, so the scripts
switch to relying on Lua resources, especially the Assistant database:
/home/qm/*/svn/assistant-database.lua
So, we re-enter the installation directory, and do:
3a. Install third-party packaged (OS) libraries needed by CD/IM/IUP.
(See e.g. DistroEnvStatic.ubuntu.Dependencies.);
./i imcdiup-osdepend-install
- im: libfftw3-dev libpng-dev
- pdflib7:
- ftgl: *im + libfreetype6-dev libglu1-mesa-dev
- cd: *im:ubuntu *pdflib7:ubuntu *ftgl:ubuntu + libgtk-3-dev
- iup: *im:ubuntu *cd:ubuntu + libwebkit2gtk-4.0-dev
[Of special note to your GTK problems, note that both CD and IUP
install libgtk-3-dev.]
[We only name the principal required packages; the Distribution's
packaging system will pull in downstream required packages.]
3b. Fetch the latest IM/CD/IUP Subversion sources from SourceForge;
./i imcdiup-svn-fetch
3c. Switch to the Assistant build directory, and:
- Nuke any existing workspace;
- Unpack the latest Subversion repository versions fetched in the
previous step;
- Build, in order: im, pdflib7, ftgl, cd, iup;
- Create a new runtime workspace "1":
/home/qm/*/1
/home/qm/*/1/play/
/home/qm/*/1/support/
- Gather the generated runtime objects from each package into
the "1/support" directory. The files are spelt out by the
Assistant in the "Runfiles" table; more entries (.a libraries?)
could be added here if desired:
- im: libimlua{LUALIBSFX}.so ../libim.so
- pdflib7: ../libpdflib.so
- ftgl:
- cd: ibcdlua{LUALIBSFX}.so libcdluapdf{LUALIBSFX}.so
../libcd.so ../libcdpdf.so
The command line for doing all of step 3 is:
cd /home/qm/*/install && ./i imcdiup-osdepend-install && ./i
imcdiup-svn-fetch && cd ../build && ./q nuke,unpack,build,gather fer-real
4. The workspace "support" directory is set up to do all of the
background slogging, so scripts in the "play" directory can offload
all details to "../1/support/play-lua-tec":
$ pushd ../1/play
$ ls -al ../support
total 7768
drwxr-xr-x 2 x x 4096 Jul 18 14:15 .
drwxr-xr-x 9 x x 4096 Jul 18 14:09 ..
-rwxr-xr-x 1 x x 212120 Jul 18 14:11 libcdlua54.so
-rwxr-xr-x 1 x x 16288 Jul 18 14:11 libcdluapdf54.so
-rwxr-xr-x 1 x x 47328 Jul 18 14:11 libcdpdf.so
-rwxr-xr-x 1 x x 928912 Jul 18 14:11 libcd.so
-rwxr-xr-x 1 x x 103088 Jul 18 14:10 libimlua54.so
-rwxr-xr-x 1 x x 1585288 Jul 18 14:09 libim.so
-rwxr-xr-x 1 x x 230944 Jul 18 14:14 libiuplua54.so
-rwxr-xr-x 1 x x 1303648 Jul 18 14:11 libiup.so
-rw-r--r-- 1 x x 307480 Jul 18 13:06 liblua5.4.so
-rw-r--r-- 1 x x 307480 Jul 18 13:06 liblua5.4.so.0
-rw-r--r-- 1 x x 307480 Jul 18 13:06 liblua5.4.so.0.0.0
-rwxr-xr-x 1 x x 1482128 Jul 18 14:10 libpdflib.so
-rwxr-xr-x 1 x x 311656 Jul 18 13:06 lua
-rwxr-xr-x 1 x x 311656 Jul 18 13:06 lua5.4
-rwxr-xr-x 1 x x 222560 Jul 18 13:06 luac
-rwxr-xr-x 1 x x 222560 Jul 18 13:06 luac5.4
-rwxr-xr-x 1 x x 1332 Jul 18 14:09 play-lua-tec
$
"play-lua-tec" is the key script that links up resources in
the "../1/support" directory with client scripts in the
"../1/play" directory. Here's a terse version:
LUAVER="5.4"
LUASFX="54"
LOCAL_SUPPORT_PACKAGE_CPATH=$(cat <<EOF
package.cpath = table.concat({
'../support/?.so',
'../support/lib?.so',
'../support/lib?${LUASFX}.so',
package.cpath}, ';')
EOF
LD_LIBRARY_PATH="../support:${LD_LIBRARY_PATH}" \
"../support/lua${LUAVER}" \
-e "$LOCAL_SUPPORT_PACKAGE_CPATH" \
"$@"
* We run Lua: "../support/lua${LUAVER}");
* We extend package.cpath to include various
"../support/*.so" library files generated during
installation, mainly Lua/CD/IM/IUP;
* We edit the dynamic linking library path, LD_LIBRARY_PATH,
for one command only (the Lua run command); and
* All the original script parameters are presented to the
calling client via the "$@" parameter.
--------
Whew! There's a lot above... but we can now write a two-line
"hello, world" GUI script, with the first line being a Bash shebang
line to invoke ../support/play-lua-tec, and the remainder of the
script (the second line) being Lua code to import IUP and put up a
"hello, world" MessageBox:
/home/qm/*/1/play$ cat ./hello-world
#!/bin/bash ../support/play-lua-tec
iup=require("iuplua"); iup.Message("MyApp", "hello,
world")
/home/qm/*/1/play$ ./hello-world
Other demo files include creating a PDF, a PowerPoint file, and
even patching the IUP MessageBox C code to subvert the ASCII characters
being displayed ("silly-iup", along with "../../patches/iup-silly-patch"),
using the "patch" subcommand:
1/play $ ./silly-iup
1/play $ popd
build$ ./q iup:nuke,unpack,patch,build,gather
build$ pushd ../1/play
1/play$ ./silly-iup
--------
If we remove "build/q::HackTecmakeConfigFiles", so that tecmake.mak
is version 4.21 (downloaded from the Subversion repository), instead
of 4.31 (Kernel 6+ fixes), and then try to build IUP, we get:
Tecmake: compiling iup_flattree.c ...
gcc -c -Wall -O2 -m64 -fPIC -I../include -I. -Igtk
-I/usr/include/lua5.4 -I/usr/include/atk-1.0 -I/usr/include/gtk-2.0
-I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include
-I/usr/lib64/gtk-2.0/include -I/usr/lib/glib-2.0/include
-I/usr/lib/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I/usr/lib/arm-linux-gnueabihf/glib-2.0/include
-I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/X11R6/include
-DGTK_DISABLE_DEPRECATED -DTEC_UNAME=Linux60_64 -DTEC_SYSNAME=Linux -DLinux=6.0
-DTEC_LITTLEENDIAN -DTEC_64 -DFUNCPROTO=15 -DNDEBUG -o
../obj/Linux60_64/iup_flattree.o iup_flattree.c
Tecmake: compiling iupgtk_focus.c ...
gcc -c -Wall -O2 -m64 -fPIC -I../include -I. -Igtk
-I/usr/include/lua5.4 -I/usr/include/atk-1.0 -I/usr/include/gtk-2.0
-I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include
-I/usr/lib64/gtk-2.0/include -I/usr/lib/glib-2.0/include
-I/usr/lib/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I/usr/lib/arm-linux-gnueabihf/glib-2.0/include
-I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/X11R6/include
-DGTK_DISABLE_DEPRECATED -DTEC_UNAME=Linux60_64 -DTEC_SYSNAME=Linux -DLinux=6.0
-DTEC_LITTLEENDIAN -DTEC_64 -DFUNCPROTO=15 -DNDEBUG -o
../obj/Linux60_64/iupgtk_focus.o gtk/iupgtk_focus.c
gtk/iupgtk_focus.c:7:10: fatal error: gtk/gtk.h: No such file or
directory
7 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
make[2]: *** [../tecmake.mak:1771: ../obj/Linux60_64/iupgtk_focus.o]
Error 1
make[1]: *** [Makefile:12: iup] Error 2
make: *** [Makefile:13: iup] Error 2
Execution of iup build failed:
Note Linux 6 and GTK 2 directives:
"-DLinux6.0";
"-I/usr/lib64/gtk-2.0/include";
"-I/usr/lib/gtk-2.0/include"; and
"-I/usr/lib/x86_64-linux-gnu/gtk-2.0/include"
in the compiler directives above. Tecmake.mak 4.21 has stuffed up the
GTK 3.0 selection for Kernel 6.0.
------------------------
Finally, I am uncomfortable about any set-up where a DLL in a stray
path can be loaded by the OS (Windows DLL in current directory?).
Where this is true, it might open a path for a malicious actor to
inject a subverted file, which, depending on the circumstances,
might be able to do undesirable things.
------------------------
Okay... hope that all of the above helps.
cheers,
sur-behoffski (Brenton Hoff)
programmer, Grouse Software
_______________________________________________
Iup-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/iup-users