Alternative method to build EasyOS with Xlibre
Continuing a series of blog posts how Xlibre was compiled in
EasyOS:
- Xlibre video drivers compiled in EasyOS — June 05, 2026
- Xlibre input drivers compiled in EasyOS — June 05, 2026
- Xlibre server and drivers compiled in EasyOS — June 05, 2026
An earlier post described how Xlibre was builtin to EasyOS 7.3.8:
- EasyOS built with Xlibre — June 02, 2026
...in a nutshell, setup two repositories for APT to access;
'xlibre-devuan' and 'excalibur-backports'
On reflection, decided on a much simpler method; do away with all of that previous effort. Instead, just build Easy from Devuan packages as normal, then as a final step, install a single xlibre package that will overwrite all the Devuan X11 packages. And, those Devuan packages will be put on "hold" so won't get updated.
Simple, and the single big xlibre package could be a .deb package, but instead I chose the build a .pet package. PET packages are the original native package format in Puppy Linux, still supported in the EasyOS PKGget package manager. Note, it was forum member lobster who, a long time ago, stated that PET is an acronym for "Puppy Extra Treats".
A good thing about PET packages is that APT knows nothing about them. This is something that we can take advantage of; the script '4create-pet' will create a package, named, for example 'xlibre-25.1.0-260605-amd64.pet' that, when installed, will overwrite all of the X11 files. Here is the script:
#!/bin/sh
V="$(grep -o "version: '.*" xserver/meson.build | head -n 1 | cut -f 2 -d "'")"
D0="$(date +%y%m%d)"
D="${V}-${D0}" #ex: 25.1.0-260607
[ -d xlibre-${D}-amd64 ] && rm -rf xlibre-${D}-amd64
[ -d xlibre_DEV-${D}-amd64 ] && rm -rf xlibre_DEV-${D}-amd64
[ -f xlibre-${D}-amd64.pet ] && rm -f xlibre-${D}-amd64.pet
[ -f xlibre_DEV-${D}-amd64.pet ] && rm -f xlibre_DEV-${D}-amd64.pet
cp -a image xlibre-${D}-amd64
sync
#for debian compatibility...
mv -f xlibre-${D}-amd64/usr/bin/Xorg xlibre-${D}-amd64/usr/lib/xorg/
echo '#!/bin/sh
#
# Execute Xorg.wrap if it exists otherwise execute Xorg directly.
# This allows distros to put the suid wrapper in a separate package.
basedir=/usr/lib/xorg
if [ -x "$basedir"/Xorg.wrap ]; then
exec "$basedir"/Xorg.wrap "$@"
else
exec "$basedir"/Xorg "$@"
fi' > xlibre-${D}-amd64/usr/bin/Xorg
chmod 755 xlibre-${D}-amd64/usr/bin/Xorg
find xlibre-${D}-amd64 -type f -exec sh -c 'file "$1" | grep -qE "ELF.*(executable|shared object)"' _ {} \; -exec strip --strip-unneeded {} +
sync
mkdir -p xlibre_DEV-${D}-amd64/usr/lib/xorg/modules/drivers
mkdir -p xlibre_DEV-${D}-amd64/usr/lib/xorg/modules/input
mv -f xlibre-${D}-amd64/usr/include xlibre_DEV-${D}-amd64/usr/
mv -f xlibre-${D}-amd64/usr/lib/pkgconfig xlibre_DEV-${D}-amd64/usr/lib/
mv -f xlibre-${D}-amd64/usr/lib/xorg/modules/drivers/*.la xlibre_DEV-${D}-amd64/usr/lib/xorg/modules/drivers/
mv -f xlibre-${D}-amd64/usr/lib/xorg/modules/input/*.la xlibre_DEV-${D}-amd64/usr/lib/xorg/modules/input/
sync
S="$(du -sk xlibre-${D}-amd64 | cut -f 1)"
echo "xlibre-${D}-amd64|xlibre|${D}-amd64||BuildingBlock|${S}K||xlibre-${D}-amd64.pet||Xlibre X11 server and drivers|devuan|excalibur||" > xlibre-${D}-amd64/pet.specs
S="$(du -sk xlibre_DEV-${D}-amd64 | cut -f 1)"
echo "xlibre_DEV-${D}-amd64|xlibre_DEV|${D}-amd64||BuildingBlock|${S}K||xlibre_DEV-${D}-amd64.pet||Xlibre X11 server and drivers|devuan|excalibur||" > xlibre_DEV-${D}-amd64/pet.specs
dir2tgz xlibre-${D}-amd64
tgz2pet xlibre-${D}-amd64.tar.gz
dir2tgz xlibre_DEV-${D}-amd64
tgz2pet xlibre_DEV-${D}-amd64.tar.gz
sync
echo "Created: xlibre-${D}-amd64.pet, xlibre_DEV-${D}-amd64.pet"
###end###
...the script also creates a separate 'xlibre_DEV-25.1.0-260605-amd64.pet' package.
The '4create-pet' script uploaded, with false '.gz' appended, here.
I could have created a 'pinstall.sh' post-install script inside the .pet, to put all the Devuan packages on "hold", for example:
# apt-mark hold xserver-xorg-video-vmware
However, I intend to do that in woofQ2. The xlibre PET is going to be installed into 'easy.sfs' in woofQ2, and one of the build scripts will do those "hold" operations.
Installing files without APT knowing, or removing, is done all
over the place in woofQ2, mostly as exercises to reduce the bloat
of 'easy.sfs'. So not doing anything new here.
Tags: easy
Xlibre video drivers compiled in EasyOS
Here are the two previous blog posts:
- Xlibre input drivers compiled in EasyOS — June 05, 2026
- Xlibre server and drivers compiled in EasyOS — June 05, 2026
Here is the '3xvideo' script:
#!/bin/sh
mkdir -p video
export XLIBRE_SRC="$(pwd)"
export XLIBRE_BUILD="${XLIBRE_SRC}/build"
export XLIBRE_PREFIX="${XLIBRE_SRC}/image"
cd video
#fail, rem: qxl v4l
Vn="intel amdgpu voodoo siliconmotion vmware ati cirrus geode xgi savage ast r128 fbdev dummy chips trident sisusb s3virge rendition nouveau mach64 neomagic mga i128 i740 ark apm vesa nested"
for aV in ${Vn}
do
[ -z "$aV" ] && continue
[ -d xf86-video-${aV} ] && rm -rf xf86-video-${aV}
case "$aV" in
amdgpu)
#requires pkgs from stable-backports. hmmm, don't want that, get older..
Br="-b release/25.0"
;;
*) Br='' ;;
esac
git clone ${Br} https://github.com/X11Libre/xf86-video-${aV}.git --depth=1
sync
cd xf86-video-${aV}
if [ -x autogen.sh ];then
#hack so autogen.sh doesn't complain...
#note, tricky, to escape ] it has to be the first after ^ ...
[ -f configure.ac ] && sed -i 's%xorg-server >= [23456][^] ]*%xorg-server >= 21.0.0%' configure.ac
case "$aV" in
intel) Ex="--enable-sna --enable-uxa --with-default-accel=sna --enable-dri2 --enable-dri3 --with-default-dri=2 --enable-udev --enable-dga" ;;
amdgpu) Ex="--enable-udev" ;;
vmware) Ex="--with-libudev" ;;
qxl) Ex="--enable-udev --enable-xspice=no --enable-kms" ;;
ati) Ex="--enable-glamor --enable-udev" ;;
savage) Ex="--enable-dri" ;;
r128|mach64|mga) Ex="--enable-exa --enable-dri" ;;
vesa)
#compile fail, needs hacks...
grep -qF '<signal.h>' src/vesa.c
if [ $? -ne 0 ];then
sed -i 's%#include <fcntl.h>%#include <fcntl.h>\n#include <signal.h>%' src/vesa.c
fi
sed -i 's%std=c99%std=gnu99%' configure.ac
Ex=''
;;
*) Ex="" ;;
esac
NOCONFIGURE=1 ./autogen.sh
PKG_CONFIG_PATH="${XLIBRE_PREFIX}/usr/lib/pkgconfig" \
./configure --prefix=/usr --sysconfdir=/etc/X11 --localstatedir=/var ${Ex}
make
DESTDIR=${XLIBRE_PREFIX} make install
fi
cd ..
#hack, avoid conflicting .h files...
cp -a -f --remove-destination ${XLIBRE_PREFIX}/usr/include/xorg/* /usr/include/xorg/
sync
echo -n "ENTER: "; read keepgoing
done
There were some issues. Firstly, the latest xf86-video-amdgpu source requires packages from 'excalibur-backports', also known as 'stable-backports'. This is unfortunate, as backporting from 'testing' can cause issues elsewhere. So I downloaded the "release/25.0" branch, which is 6 months old. Not satisfactory.
The 'xf86-video-vesa' source does not compile. As can be seen above, I patched it so it will compile. This needs to be raised as an issue on the github project site. I took out 'qxl' and 'v4l' drivers, as they failed, but didn't bother to try and fix them.
Script '3xvideo' is uploaded, with false '.gz' appended, here.
I set these three scripts to all install into the 'image' folder.
The reason for this is want to create just one package, that will
install and replace all the Devuan X11 packages. Will explain that
in the next blog post.
Tags: easy
Xlibre input drivers compiled in EasyOS
Previous blog post, explains how compiled the Xlibre server:
- Xlibre server and drivers compiled in EasyOS — June 05, 2026
For the input drivers, created script '2xinput':
#!/bin/sh
mkdir -p input
export XLIBRE_SRC="$(pwd)"
export XLIBRE_BUILD="${XLIBRE_SRC}/build"
export XLIBRE_PREFIX="${XLIBRE_SRC}/image"
#export XLIBRE_PREFIX="/usr"
cd input
#rem: egalax elographics
In="evdev joystick vmmouse wacom libinput void synaptics keyboard mouse"
for aI in ${In}
do
[ -d xf86-input-${aI} ] && rm -rf xf86-input-${aI}
git clone https://github.com/X11Libre/xf86-input-${aI}.git --depth=1
sync
cd xf86-input-${aI}
case "$aI" in
joystick) Ex="--disable-debug" ;;
synaptics) Ex="--disable-unit-tests" ;;
void) Ex="" ;;
wacom) Ex="--disable-unit-tests --disable-debug --with-systemd-unit-dir=no" ;;
*) Ex="" ;;
esac
NOCONFIGURE=1 ./autogen.sh
PKG_CONFIG_PATH="${XLIBRE_PREFIX}/usr/lib/pkgconfig" \
./configure --prefix=/usr --sysconfdir=/etc/X11 --localstatedir=/var ${Ex}
make
DESTDIR=${XLIBRE_PREFIX} make install
cd ..
#hack, avoid conflicting .h files...
cp -a -f --remove-destination ${XLIBRE_PREFIX}/usr/include/xorg/* /usr/include/xorg/
sync
echo -n "ENTER: "; read keepgoing
done
Not much explanation required, pretty straightforward. Perhaps could have figured a way around it, but to be sure that the correct header files are always seen, copied them to /usr/include/xorg, as mentioned in the previous blog post.
Notice the "--with-systemd-unit-dir=no" for the wacom driver.
This is because EasyOS uses busybox init, with pup_event service
management. Definitely no systemd!
The script '2xinput', with false ".gz" appended, uploaded here.
Next blog post will explain how the video drivers were
compiled.
Tags: easy
Xlibre server and drivers compiled in EasyOS
Easy version 7.3.8, the latest release, is built with Xlibre Devuan .deb packages, from here:
https://github.com/xlibre-debian/devuan/
...a couple of problems with that; firstly, the xf86-video-amdgpu driver requires some packages from 'excalibur-backports' repository, secondly, not all of the video drivers have been compiled.
So, decided to compile it all myself. This was a good starting point:
https://github.com/X11Libre/xserver/wiki/Building-XLibre
However, I got a bit messed up with how they have done it. Instead, decided that it is better to compile in the normal way that source packages expect, with, most importantly, "--prefix=/usr --sysconfdir=/etc/X11 --localstatedir=/var". Installation can be to wherever required, by "DESTDIR=..." prefix in autotools make, or "--prefixdir ..." for meson.
I will split up these blog posts, firstly explaining about compiling the Xlibre server. This is script '1xserver':
#!/bin/sh
#ref: https://github.com/X11Libre/xserver/wiki/Building-XLibre
[ -d build ] && rm -rf build
mkdir build
[ -d image ] && rm -rf image
mkdir -p image/usr
export XLIBRE_SRC="$(pwd)"
export XLIBRE_BUILD="${XLIBRE_SRC}/build"
export XLIBRE_PREFIX="${XLIBRE_SRC}/image"
[ -d xserver ] && rm -rf xserver
git clone https://github.com/X11Libre/xserver.git "${XLIBRE_SRC}/xserver" --depth=1
echo -n "ENTER: "; read keepgoing
cd xserver
#installs into usr/lib/xorg/modules/xlibre-25, remove 'xlibre-25':
sed -i "s%^module_abi_tag =.*%module_abi_tag = ''%" meson.build
#modules install path is wrong for debian and devuan...
sed -i 's%^input_drivers_dir=.*%input_drivers_dir=@moduledir@/input%' xlibre-server.pc.in #was: input_drivers_dir=@moduledir@/drivers/input
sed -i 's%^video_drivers_dir=.*%video_drivers_dir=@moduledir@/drivers%' xlibre-server.pc.in #was: video_drivers_dir=@moduledir@/drivers/video
sed -i 's%^input_drivers_dir=.*%input_drivers_dir=@moduledir@/input%' xorg-server.pc.in
sed -i 's%^video_drivers_dir=.*%video_drivers_dir=@moduledir@/drivers%' xorg-server.pc.in
# -Dsha1=libnettle instead of -Dsha1=libcrypto (openssl) (debian has nettle, oe has openssl)
# debian: libunwind=true xselinux=true
#-Dlibdir=lib prevents install into usr/lib/x86_64-linux-gnu
meson setup --prefix /usr "$XLIBRE_BUILD" --buildtype release --localstatedir /var --sysconfdir /etc/X11 -Dxnest=true -Ddtrace=false -Dint10=x86emu -Dxkb_output_dir=/var/lib/xkb -Dudev=true -Ddga=true -Ddri1=true -Ddri2=true -Ddri3=true -Dglx=true -Dglamor=true -Dlibunwind=true -Dsystemd_logind=false -Dxinerama=true -Dxvfb=false -Dxephyr=true -Dsha1=libnettle -Dxorg=true -Dxwin=false -Dxquartz=false -Dgbm=true -Dglx_dri=true -Dglx=true -Dxdmcp=true -Dpciaccess=true -Dudev=true -Dudev_kms=true -Dsystemd_notify=false -Dscreensaver=true -Dxres=true -Dxselinux=false -Dxv=true -Dxvmc=true -Dmitshm=true -Ddrm=true -Dseatd_libseat=false -Dlibdir=lib
echo -n "ENTER: "; read keepgoing
ninja -C "$XLIBRE_BUILD"
echo -n "ENTER: "; read keepgoing
#use meson, not ninja, as meson allows --destdir
meson install -C "$XLIBRE_BUILD" --destdir "${XLIBRE_PREFIX}"
#no, avoid trouble with .h files, copy to /usr/include...
##hack .h path for compiling drivers...
#sed -i "s%includedir=.*%includedir=${XLIBRE_PREFIX}/usr/include%" ${XLIBRE_PREFIX}/usr/lib/pkgconfig/xlibre-server.pc
cp -a -f --remove-destination ${XLIBRE_PREFIX}/usr/include/xorg/* /usr/include/xorg/
#also a hack, probably not necessary (running in devx container with xephyr so this ok)
cp -a -f --remove-destination ${XLIBRE_PREFIX}/usr/lib/xorg/modules/*.so /usr/lib/xorg/modules/
cp -a -f --remove-destination ${XLIBRE_PREFIX}/usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/
sync
Compiling in EasyOS is very simple, just click on the "devx" desktop icon, and you are flipped into a full desktop in a container, with all required "-dev" Devuan/Debian Excalibur/Trixie packages automatically installed. Well almost, there were some missing, but that will be fixed in the next release of Easy, so all that you will need is to download the '1xserver' and others that I will post for compiling the drivers, and just run them -- they should be in a partition with ext4 filesystem -- don't do it within the "/" folder hierarchy as EasyOS is running in RAM and there is limited RAM space.
So, download to a ext4 partition, open a terminal, and run the script "# ./1xserver", and you will find the result installed to folder "image".
There are four scripts, and they will be in woofQ2, the EasyOS build system. However, have uploaded '1xserver', with a false ".gz" appended, here. It may change, the latest will be found in woofQ2.
I was a little bit concerned that when compiling the drivers,
that they see the correct .h header files, so copied them to
/usr/include/xorg as you can see near the end of the script.
Note that installation is to image/usr/lib/xorg/modules/xlibre-25; however, I don't want that, want a result that will completely replace the current Xorg installation, so want the exact same paths. So I emptied the "module_abi_tag" variable in 'meson.build'. See also the video and input drivers paths had to be fixed for Debian. Also see "-Dlibdir=lib" to prevent installation into usr/lib/x86_64-linux-gnu
Meson has been configured with lots of options, that are defaults anyway, but I put them in explicitly in case a missing library won't just silently fall back to disabled. Notice "-Dxselinux=false" as I don't use selinux in EasyOS.
Enough explanation I think. The next post will explain '2input',
compiling the input drivers.
Tags: easy
EasyOS Excalibur-series version 7.3.8
Major changes this time!
Release notes since version 7.3.7:
- Custom desktop icons lost after version update — June 03, 2026
- Limine Installer tested — June 03, 2026
- EasyOS built with Xlibre — June 02, 2026
- EcoTube media player — May 31, 2026
- Global IP TV Panel bumped to 2026MK9 — May 31, 2026
- Overhaul of optical drive detection — May 30, 2026
- unifont package removed — May 29, 2026
- Chromium 148.0.7778.215
- Built with excalibur-backports repository
As Easy is positioned as a "retro" distribution, it would seem a good idea to replace Xorg/X11 with Xlibre. That is done, but there is one downside; there are less xserver-xorg-video-* drivers, which may be an issue on very old hardware. Will see how it goes; if anyone running on an old PC reports video problems... well, I suppose will go back to Debian Xorg.
One requirement of Xlibre is that it requires some packages from
the Debian "excalibur-backports" repository. I went the whole way,
and gave that repository the highest priority, so Easy got built
with all packages in excalibur-backports getting preference.
Upside is later package versions, downside is not as well tested
as the stable repository. Again, we shall see.
Note, excalibur-backports, also known as stable-backports, has
packages back-ported from the Debian "testing" repository.
Easy 7.3.7 has the SMPlayer media player, as Celluloid, that we have had just about forever in earlier releases of Easy, has been troublesome. EcoTube is a fork of Celluloid, works for me; let me know how it works for you.
Newcomers to EasyOS, recommend read the 7.3 announcement:
- EasyOS Excalibur-series version 7.3 released — April 26, 2026
Download 7.3.8:
https://distro.ibiblio.org/easyos/amd64/releases/excalibur/2026/7.3.8/
If already running EasyOS, just click the "update" desktop icon, as usual. The .img and devx sfs delta (difference) files are big this time, due to so many changes. Normally, we would expect the delta file to be small, under 100MB, but this time about 300MB.
Feedback welcome at the forum:
https://forum.puppylinux.com/viewtopic.php?p=171493#p171493
Have fun!
Tags: easy
Custom desktop icons lost after version update
Forum member retiredt00 reported this problem and Caramel posted a fix a bit further down the page:
https://forum.puppylinux.com/viewtopic.php?p=171362#p171362
The fix has been implemented.
Tags: easy
Limine Installer tested
Forum member l0wt3ch reported boot fail after installing Limine, using Limine Installer:
https://forum.puppylinux.com/viewtopic.php?p=171406#p171406
...there is no need to install the Limine .pet, it is already builtin in EasyOS.
Running the latest EasyOS, 7.3.8RC on a usb-stick, ran "limine-installer" in a terminal, so as to see any error messages. Firstly, booted on my Zenbook laptop, UEFI bootup, and OS installations were found:
/EasyOS Excalibur64 (partition nvme0n1p2, path excalibur)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=a6446008-7f3a-4196-be5c-c0416f4edf44 wkg_dir=excalibur
kernel_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/excalibur/vmlinuz
module_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/excalibur/initrd
/EasyOS Scarthgap64 (partition nvme0n1p2, path scarthgap)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=a6446008-7f3a-4196-be5c-c0416f4edf44 wkg_dir=scarthgap
kernel_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/scarthgap/vmlinuz
module_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/scarthgap/initrd
/EasyOS Daedalus64 (partition nvme0n1p2, path daedalus)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=a6446008-7f3a-4196-be5c-c0416f4edf44 wkg_dir=daedalus
kernel_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/daedalus/vmlinuz
module_path: guid(cd4fe787-417f-4806-a16e-f63c360b135d):/daedalus/initrd
/EasyOS Excalibur64 (partition sda2, path easyos)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=ee414d80-252b-45e1-a9eb-f687271ee44e wkg_dir=easyos
kernel_path: fslabel(easyos2):/easyos/vmlinuz
module_path: fslabel(easyos2):/easyos/initrd
...drive /dev/nvme0n1 is gpt, the USB-stick /dev/sda is mbr.
Chose to install to the usb-stick, rebooted, all of the above are in 'limine.conf' in first partition of the USB-stick, and all menu entries work.
Next, booted the Easy 7.3.8RC usb-stick on my Lenovo PC, which is UEFI but capable of legacy-BIOS bootup; chose the latter. This time, Limine Installer put up this message:

...clicked "CONTINUE", OS installations were found:
/EasyOS Excalibur64 (partition nvme0n1p2, path easyos)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=f992c44c-80f3-4c0c-b915-5a40907fb548 wkg_dir=easyos
kernel_path: guid(641de803-19ae-43c6-b886-b4687e99ce6d):/easyos/vmlinuz
module_path: guid(641de803-19ae-43c6-b886-b4687e99ce6d):/easyos/initrd
/EasyOS Excalibur64 (partition sda2, path easyos)
comment: EasyOS bootup
resolution: 800x600
protocol: linux
kernel_cmdline: rw intel_iommu=igfx_off wkg_uuid=ee414d80-252b-45e1-a9eb-f687271ee44e wkg_dir=easyos
kernel_path: fslabel(easyos2):/easyos/vmlinuz
module_path: fslabel(easyos2):/easyos/initrd
...note, drive /dev/nvme0n1 is gpt, the usb-stick /dev/sda is
mbr.
Chose again to install to the usb-stick, rebooted, again chose
legacy-BIOS bootup, got the above two menu entries, both
work.
Tags: easy
EasyOS built with Xlibre
Xlibre is a fork of x11, keeping it alive, for those who do not want to go the Wayland route. Xlibre webpage:
More information about Xlibre in my blog post in October 2025:
https://bkhome.org/news/202510/xlibre-is-rocketing-ahead.html
Some of the guys on the forum who build Puppy-variants have experimented with Xlibre, for example fredx181:
https://forum.puppylinux.com/viewtopic.php?t=15924
Also rockedge:
https://forum.puppylinux.com/viewtopic.php?t=16966
fredx181 used a Xlibre repository for Debian here, showing the devuan folder:
https://github.com/xlibre-deb/devuan
Unfortunately, it is a bit out of date. rockedge used this repository, again showing devuan folder:
https://github.com/xlibre-debian/devuan
...very active and up-to-date, so I am using this one for EasyOS.
There is one problem with the xlibre-debian repository; it requires packages to be obtained from "stable-backports". Discovered this when building the 'xserver-xlibre-video-amdgpu' package; package versions in Debian-stable were too old.
There is potentially a problem building with stable-backports, actually excalibur-backports; these are packages backported from the "testing" branch and potentially introducing instability or undesirable behaviour. It is possible to pick out certain packages from excalibur-backports and for the rest of the build only use excalibur-stable; however, I got into a mess with the dependency chain. Instead, have enabled excalibur-backports globally as first choice when building.
EasyOS is built with woofQ2. The script that creates the basic rootfs is woofq2/rootfs/1create-rootfs. Now building with Xlibre, but don't want to "burn the bridges", so there is a new variable in woofq2/configure/x86_64/build-choices:
BUILD_X_XLIBRE='yes'
Here are changes made to 1create-rootfs:
. ${L1}/configure/${xARCH}/build-choices #20260602 has BUILD_X_XLIBRE=yes
Add keyfile for Xlibre repository, also download Packages.gz for later use:
#20260601 add xlibre repo keyfile...
if [ "$BUILD_X_XLIBRE" == "yes" ];then #20260602
cd $SB
if [ -f Packages-xlibre ];then rm -f Packages-xlibre; fi
if [ -f Packages.gz ];then rm -f Packages.gz; fi
if [ -f Packages-xlibre.gz ];then rm -f Packages-zlibre.gz; fi
download_file https://github.com/xlibre-debian/devuan/raw/refs/heads/master/dists/main/stable/binary-amd64/Packages.gz
mv -f Packages.gz Packages-xlibre.gz
gunzip Packages-xlibre.gz
if [ ! -f /usr/share/keyrings/NexusSfan.pgp ];then
#download_file https://github.com/xlibre-debian/devuan/raw/refs/heads/master/pool/stable/n/nexussfan-archive-keyring/nexussfan-archive-keyring_1.0.0-1_all.deb
KEYdeb="$(grep '^Filename: pool/stable/n/nexussfan-archive-keyring/nexussfan-archive-keyring_' Packages-xlibre)"
KEYdeb="${KEYdeb##*/}" #ex: nexussfan-archive-keyring_1.0.0-1_all.deb
if [ -f ./${KEYdeb} ];then rm -f ./${KEYdeb}; fi
download_file https://github.com/xlibre-debian/devuan/raw/refs/heads/master/pool/stable/n/nexussfan-archive-keyring/${KEYdeb}
dpkg -i ${KEYdeb}
fi
if [ ! -s /usr/share/keyrings/NexusSfan.pgp ];then
echo "Failed to install NexusSfan.pgp"
exit 1
fi
cd $L0
fi
The excalibur-backports and xlibre repositories added:
#20260601 add xlibre repo...
echo -n '' > ${SB}/rootfs/etc/apt/sources.list
if [ "$BUILD_X_XLIBRE" == "yes" ];then #20260602
mkdir -p ${SB}/rootfs/etc/apt/sources.list.d
echo 'deb [signed-by=/usr/share/keyrings/NexusSfan.pgp] https://xlibre-debian.github.io/devuan main stable' > ${SB}/rootfs/etc/apt/sources.list.d/repo-xlibre-debian.list
#ref: http://deb.devuan.org/merged/dists/
echo 'deb http://pkgmaster.devuan.org/merged excalibur-backports main' >> ${SB}/rootfs/etc/apt/sources.list
#20260601 set priority...
mkdir -p ${SB}/rootfs/etc/apt/preferences.d
echo 'Package: *
Pin: release a=excalibur-backports
Pin-Priority: 501' > ${SB}/rootfs/etc/apt/preferences.d/backports-priority.pref
echo 'Package: *
Pin: origin xlibre-debian.github.io
Pin-Priority: 502' > ${SB}/rootfs/etc/apt/preferences.d/xlibre-priority.pref
fi
echo -n 'deb http://pkgmaster.devuan.org/merged excalibur main contrib non-free non-free-firmware
deb http://pkgmaster.devuan.org/merged excalibur-updates main contrib non-free non-free-firmware
deb http://pkgmaster.devuan.org/merged excalibur-security main
' >> ${SB}/rootfs/etc/apt/sources.list
...notice the "Pin-Priority" to give these new repositories
first-choice when building.
Alternative sources.list files for URLs elsewhere in the world. Take out excalibur-backports if not required:
if [ "$BUILD_X_XLIBRE" != "yes" ];then #20260602
#get rid of excalibur-backports repo...
sed -i '/excalibur-backports/d' ${SB}/rootfs/etc/apt/sources.list*
fi
Further down, building from a list of Devuan packages, exclude these:
for aPKG in ${PKGLIST}
do
[ "$aPKG" == "" ] && continue
if [ "${aPKG:0:1}" == "#" ];then continue; fi
if [ "$BUILD_X_XLIBRE" == "yes" ];then #20260602
case "$aPKG" in
*xorg*|*xserver*) continue ;;
esac
fi
...
Then, build the Xlibre packages:
if [ "$BUILD_X_XLIBRE" == "yes" ];then #20260602
XL='xlibre-x11-common xserver-xlibre-core xserver-xlibre xserver-xlibre-xnest xserver-xlibre-common xserver-xlibre-xephyr xserver-xlibre-input-evdev xserver-xlibre-input-kbd xserver-xlibre-input-libinput xserver-xlibre-input-mouse xserver-xlibre-input-synaptics xserver-xlibre-input-wacom xserver-xlibre-video-amdgpu xserver-xlibre-video-ati xserver-xlibre-video-fbdev xserver-xlibre-video-intel xserver-xlibre-video-nouveau xserver-xlibre-video-qxl xserver-xlibre-video-radeon xserver-xlibre-video-sisusb xserver-xlibre-video-vesa xserver-xlibre-video-vmware xserver-xlibre-video-voodoo'
for aPKG in xlibre-archive-keyring ${XL} #20260601
do
[ "$aPKG" == "" ] && continue
if [ "${aPKG:0:1}" == "#" ];then continue; fi
if [ -n "$WAITASK" ];then
echo
echo -n "ENTER to install '${aPKG}', any other char to quit: "
read WANTMORE
if [ -n "$WANTMORE" ];then
break
fi
else
sleep 2
fi
chroot ${SB}/rootfs apt install ${aPKG}
chroot ${SB}/rootfs apt-mark hold ${aPKG}
#is there a post-install fix?...
if [ -d ${L1}/builtin/deb/fixes/${aPKG} ];then
echo " ...found builtin/deb/fixes/${aPKG}"
if [ -f ${L1}/builtin/deb/fixes/${aPKG}/pinstall.sh ];then
cat ${L1}/builtin/deb/fixes/${aPKG}/pinstall.sh >> ${SB}/pinstall-1.sh
fi
if [ -f ${L1}/builtin/deb/fixes/${aPKG}/FIXUPHACK ];then
cd ${SB}/rootfs
bash ${L1}/builtin/deb/fixes/${aPKG}/FIXUPHACK
cd ${L1}/rootfs
fi
if [ -d ${L1}/builtin/deb/fixes/${aPKG}/REPLACEMENTS ];then
cp -a -f --remove-destination ${L1}/builtin/deb/fixes/${aPKG}/REPLACEMENTS/* ${SB}/rootfs/
fi
fi
sync
done
...this will uninstall any conflicting packages from the stable repositories. Note, I did try to install the Xlibre packages first, then the stable, on the reasoning that the Xlibre package "provides" field in the control file will cause the normal stable package names to be recognized as already installed; however, that didn't work.
Notice also above, "apt-mark hold" on each of the Xlibre
packages.
Unfortunately, the Xlibre packages have some "-dev" packages as
dependencies. Very odd, for example 'xserver-xlibre-video-amdgpu'
has dependency 'mesa-common-dev', which also pulls in some more
-dev packages. Yes, very odd.
These -dev packages are not needed in easy.sfs, only required in the devx sfs; however, cannot just delete them as it will break apt dependency handling. So have used this brute-force method of removing them:
echo -n '' > ${SB}/dev-rootfs-removed
if [ "$BUILD_X_XLIBRE" == "yes" ];then #20260602
#xlibre pkgs have installed lots of -dev pkgs
for aDEV in $(grep -o -- '^[a-z0-9-]*-dev/' ${SB}/pkgs-installed.txt | tr -d '/')
do
[ -z "$aDEV" ] && continue
chroot ${SB}/rootfs dpkg --remove --force-depends ${aDEV}
chroot ${SB}/rootfs apt-mark hold ${aDEV}
sed -i "/^${aDEV}/d" ${SB}/pkgs-installed.txt
echo "$aDEV" >> ${SB}/dev-rootfs-removed
done
fi
The intention is that when building the devx sfs, "apt-mark unhold" will be run on these packages and they will get installed. That is not yet implemented.
Went ahead and did a build, created 'easy-7.3.8-amd64.img', wrote
it to a usb drive, booted, all OK.
Tags: easy