TurboPrint in Guix

Hi! I’m running Guix for a few weeks now, and all in all I enjoy it. One challenge that has been greater then expected is my photo printer, a Canon PRO-100S. I use the turboprint driver since it supports the printer very well, and I have special papers and paper profiles made for them. Turboprint is basically the only viable option for high quality and color accurate printing on GNU/Linux.

But it’s proprietary software distributed as .deb and/or .rpm. They also have a .tgz that is ment for other distros. However, Guix does not follow the FHS standard, nor does it directly use a supported init daemon.

I’ve tried working with a virtual machine and distrobox without success (all sorts of errors). Now I’m trying to use Guix shell instead, and it seems I’m very very close to a solution. I’ve installed the driver into ~/.local/usr/bin by modifing the system.cfg file in the turboprint .tgz, and running the following command launches the turboprint monitor:

guix shell
  --container \
  --network \
  --emulate-fhs \
  --expose=/dev/bus/usb \
  --expose=/run/dbus \
  --expose=$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY \
  --preserve='^WAYLAND_DISPLAY$' \
  --preserve='^XDG_RUNTIME_DIR$' \
  --preserve='^QT_QPA_PLATFORM$' \
  --share=$HOME/.local/etc/turboprint=/etc/turboprint \
  coreutils tar gzip gtk+@2 bash patchelf cups qtbase@5   qtwayland@5 gcc-toolchain   libxcb xcb-util xcb-util-wm xcb-util-image xcb-util-keysyms   xcb-util-renderutil \
  -- bash -c '
    export QT_QPA_PLATFORM=wayland
    mkdir -p ~/.local/etc/turboprint
    ~/.local/usr/bin/turboprint
  '

However, when I try to add the printer, it fails:

Does anyone have a clue what I could do as a next step?

Anyone else interested in getting turboprint running on Guix?

ur container may not have access to cups directories

add

--share=/var/run/cups=/var/run/cups \

--share=/usr/lib/cups/backend=/usr/lib/cups/backend \

--share=/usr/share/cups/model=/usr/share/cups/model

and see

or try --expose=/var/run/cups cups

Thanks a lot for your response!

I tired what you said, the backend and model directories does not exist, so I could not expose those, but the /var/run/cups could be exposed. I got the exact same error though, so non the wiser just yet.

To expose your Canon PIXMA PRO-100S printer inside a guix shell container environment for compiling the TurboPrint app, you need to ensure the build environment has direct access to either the local system hardware (USB) or the host network (if it’s a network/Wi-Fi printer), along with the existing host CUPS configurations. [1, 2, 3, 4]

Because guix shell --container isolates namespaces strictly by default, you must explicitly pass flags to expose the relevant sockets and paths. [1, 5]

1. For a Network-Connected Printer (Wi-Fi / Ethernet)

If your Canon PRO-100S is sitting on your local network, you need to expose the host’s networking stack along with the system CUPS daemon socket. [1, 6, 7]

Run your shell like this:

guix shell --container --network \
  --expose=/var/run/cups/cups.sock \
  --emulate-fhs \
  gcc-toolchain pkg-config glib gtk+@2 <other-build-deps>

  • --network: Shares the host network stack, allowing build/configuration scripts to ping or discover the printer’s IP using protocols like BJNP or mDNS. [1, 8, 9]
  • --expose=/var/run/cups/cups.sock: Standard location for communicating with the host’s active CUPS daemon. [1]
  • --emulate-fhs: Fakes a standard Linux Filesystem Hierarchy (creating /lib, /usr, etc.), which is usually mandatory for closed/commercial source configuration scripts like TurboPrint. [10, 11, 12]

2. For a USB-Connected Printer

If your printer is plugged directly into the PC via a USB cable, you must pass the underlying raw USB devices (/dev/bus/usb) as writable shares so the compilation test scripts and TurboPrint setups can query the hardware. [1, 13, 14]

Run your shell like this:

guix shell --container \
  --share=/dev/bus/usb \
  --expose=/var/run/cups/cups.sock \
  --emulate-fhs \
  gcc-toolchain pkg-config glib gtk+@2 <other-build-deps>

  • --share=/dev/bus/usb: Mounts the host USB device paths as read-write inside the container, allowing low-level identification tools to see the printer hardware. [1]

Verifying Printer Access Inside the Shell

Once you drop into the environment, you can check that your setup exposes the system context correctly before starting the compile loop:

  1. Verify CUPS communication:

    lpstat -r
    # Should output: scheduler is running
    
    
  2. List detected printers:

    lpstat -p -d
    
    
  3. Verify USB visibility (if using USB):
    Ensure usbutils is included in your shell packages, then verify:

    lsusb
    # Look for the Canon, Inc. Pro-100S entry
    
    

If you let me know whether you’re targeting the TurboPrint daemon, GUI tools, or a specific build system like CMake or Make, I can help you structure the exact inputs or manifest.scm file for the environment.

copied from internet… hope it helps…

Hi @sudheer, thanks a lot for taking the time to respond. I’ve tried exposing the socket for cups as you mention as well, the other parts are you mention is part of the guix shell command already. This is the command I just tried.

kimothy@houston ~$ guix shell \
  --container \
  --network \
  --emulate-fhs \
  --expose=/dev/bus/usb \
  --expose=/run/dbus \
  --expose=$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY \
  --preserve='^WAYLAND_DISPLAY$' \
  --preserve='^XDG_RUNTIME_DIR$' \
  --preserve='^QT_QPA_PLATFORM$' \
  --expose=/var/run/cups/cups.sock \
  --share=$HOME/.local/etc/turboprint=/etc/turboprint \
  coreutils tar gzip gtk+@2 bash patchelf cups qtbase@5   qtwayland@5 gcc-toolchain   libxcb xcb-util xcb-util-wm xcb-util-image xcb-util-keysyms   xcb-util-renderutil \
  -- bash -c '
    export QT_QPA_PLATFORM=wayland
    mkdir -p ~/.local/etc/turboprint
    ~/.local/usr/bin/turboprint
  '
libEGL warning: failed to get driver name for fd -1

libEGL warning: MESA-LOADER: failed to retrieve device information

libEGL warning: failed to get driver name for fd -1

MESA: error: ZINK: failed to choose pdev
libEGL warning: egl: failed to create dri2 screen
kimothy@houston ~$ lpstat -r
scheduler is running
kimothy@houston ~$ lpstat -p -d
printer Canon_PRO-100S_series is idle.  enabled since Tue 06 Oct 2026 06:06:10 PM CEST
system default destination: Canon_PRO-100S_series
kimothy@houston ~$ 

Note that the /libEGL/ warnings comes after closing the gui, I don’t think they are relevant. The printer is on the same local network and not connected by USB.

When it comes to my goal, I would like to be able to run the tpdaemon and the related tools like I would on any other GNU/Linux distro. It does seem like printing is a bit of a challenge on Guix. There was an effort to include Gutenprint to Guix as well some years back, which never got pushed up stream cause they never got it working properly…

oh try --graphics in the manifest