site  contact  subhomenews

EasyOS built with Xlibre

June 02, 2026 — BarryK

Xlibre is a fork of x11, keeping it alive, for those who do not want to go the Wayland route. Xlibre webpage:

https://x11libre.net/

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