#!/bin/bash # dpkg configuration script for linuxcnc # Copyright (C) 2006 Jeff Epler # 2025-2026 Steffen Moeller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # When used to produce a debian package, this file is a script "used to # control compilation and installation of the executable" set -e if [[ -z "$OSTYPE" ]]; then echo "E: The 'OSTYPE' environment variable is not set." echo " Failure to confirm Linux as the operating system cannot be determined." exit 1 else echo "D: Found operating system '$OSTYPE'." if [[ ! "$OSTYPE" == "linux-gnu"* ]]; then echo "W: LinuxCNC is not (yet) prepared for the operating system '$OSTYPE'." if [[ "$OSTYPE" == "freebsd"* ]]; then echo " For FreeBSD there have been reports for LinuxCNC to compile and be executable." else if [[ "$OSTYPE" == "darwin"* ]]; then echo echo " LinuxCNC is yet unlikely to be successfully built on MacOS because of missing dependencies." if command -v brew &> /dev/null; then echo " With brew, we are aware of packages" echo " autoconf automake libusb libmodbus libtircp pkgconf" echo " but missing is, e.g., a package for libgpiod." fi fi fi echo " Instead of this Debian+derivative-tailored configuration please invoke the compilation directly." exit 1 fi fi usage () { P=${0##*/} cat 1>&2 <&2 "Unknown option: $1" echo 1>&2 usage exit 99 ;; esac shift done DISTRIB_NAME= if [ "$(command -v lsb_release)" != "" ] || [ "$(which lsb_release)" != "" ]; then ID="$(lsb_release --short --id)" RELEASE="$(lsb_release --short --release)" # Workaround for broken lsb_release, case "$RELEASE" in n/a) RELEASE=unstable ;; esac DISTRIB_NAME="$ID-$RELEASE" elif [ -f /etc/lsb-release ]; then source /etc/lsb-release DISTRIB_NAME=$DISTRIB_ID-$DISTRIB_RELEASE fi if [ -n "$ENABLE_BUILD_DOCUMENTATION" ]; then DOC_DEPENDS="asciidoctor-pdf | ruby-asciidoctor-pdf,\n fonts-dejavu,\n fonts-noto-cjk,\n ghostscript,\n graphviz,\n librsvg2-bin,\n python3-fonttools,\n ruby-rouge,\n w3c-linkchecker" else DOC_DEPENDS='' fi MODUTILS_DEPENDS=kmod PYTHON_PACKAGING_DEPENDS=dh-python PYTHON_GST=python3-gst-1.0,gstreamer1.0-plugins-base TCLTK_VERSION=8.6 PYTHON_IMAGING=python3-pil PYTHON_IMAGING_TK=python3-pil.imagetk QTVCP_DEPENDS="python3-qtpy,\n python3-pyqt5,\n python3-pyqt5.qsci,\n python3-pyqt5.qtsvg,\n python3-pyqt5.qtopengl,\n python3-opencv,\n python3-dbus,\n python3-espeak,\n python3-dbus.mainloop.pyqt5,\n python3-pyqt5.qtwebengine,\n espeak-ng,\n pyqt5-dev-tools,\n gstreamer1.0-tools,\n espeak,\n sound-theme-freedesktop" YAPPS_RUNTIME="python3-yapps" DEBHELPER="debhelper (>= 12)" COMPAT="12" case $DISTRIB_NAME in Ubuntu-25.*|Ubuntu-24.*|Ubuntu-21.*|Debian-11|Debian-11.*|Debian-12|Debian-12.*|Debian-13|Debian-13.*|Debian-testing|Debian-unstable) LIBREADLINE_DEV=libeditreadline-dev COMPAT="" DEBHELPER="debhelper-compat (= 13)" ;; Ubuntu-20.*) ;; Debian-10|Debian-10.*|Raspbian-10|Raspbian-10.*) ;; *) echo "W: Unknown distribution: '$DISTRIB_NAME'." echo " Detected dependencies may be incomplete or wrong." echo " Please consider fixing it and submitting a pull request." ;; esac TARGET=uspace EXTRA_RECOMMENDS=hostmot2-firmware-all MODULE_PATH=usr/lib/linuxcnc/modules MODULE_EXT=.so KERNEL_DEPENDS=libudev-dev,iptables KERNEL_DEPENDS_BUILD=libudev-dev KERNEL_HEADERS= KERNEL_VERSION=uspace MODUTILS_DEPENDS= if false; then MAIN_PACKAGE_NAME=linuxcnc OTHER_MAIN_PACKAGE_NAME=linuxcnc-uspace else DISTRIB_NAME=uspace-$DISTRIB_NAME MAIN_PACKAGE_NAME=linuxcnc-uspace OTHER_MAIN_PACKAGE_NAME=linuxcnc fi EXTRA_RECOMMENDS="$EXTRA_RECOMMENDS, linux-image-rt-amd64 [linux-amd64], linux-image-rt-686-pae [linux-i386]" CONFIGURE_REALTIME_ARG=--with-realtime=uspace subst () { sed \ -e "s#@COMPAT@#$COMPAT#g" \ -e "s#@DEBHELPER@#$DEBHELPER#g" \ -e "s#@DISTRIB_NAME@#$DISTRIB_NAME#g" \ -e "s#@DOC_DEPENDS@#$DOC_DEPENDS#g" \ -e "s#@EXTRA_BUILD@#$EXTRA_BUILD#g" \ -e "s#@EXTRA_RECOMMENDS@#$EXTRA_RECOMMENDS#g" \ -e "s#@KERNEL_DEPENDS@#$KERNEL_DEPENDS#g" \ -e "s#@KERNEL_DEPENDS_BUILD@#$KERNEL_DEPENDS_BUILD#g" \ -e "s#@KERNEL_HEADERS@#$KERNEL_HEADERS#g" \ -e "s#@KERNEL_VERSION@#$KERNEL_VERSION#g" \ -e "s#@LIBREADLINE_DEV@#$LIBREADLINE_DEV#g" \ -e "s#@MAIN_PACKAGE_NAME@#$MAIN_PACKAGE_NAME#g" \ -e "s#@MODULE_EXT@#$MODULE_EXT#g" \ -e "s#@MODULE_PATH@#$MODULE_PATH#g" \ -e "s#@MODUTILS_DEPENDS@#$MODUTILS_DEPENDS#g" \ -e "s#@OTHER_MAIN_PACKAGE_NAME@#$OTHER_MAIN_PACKAGE_NAME#g" \ -e "s#@PYTHON_GST@#$PYTHON_GST#g" \ -e "s#@PYTHON_IMAGING@#$PYTHON_IMAGING#g" \ -e "s#@PYTHON_IMAGING_TK@#$PYTHON_IMAGING_TK#g" \ -e "s#@PYTHON_PACKAGING_DEPENDS@#$PYTHON_PACKAGING_DEPENDS#g" \ -e "s#@QTVCP_DEPENDS@#$QTVCP_DEPENDS#g" \ -e "s#@RTAI_ARCHITECTURE@#$RTAI_ARCHITECTURE#g" \ -e "s#@TARGET@#$TARGET#g" \ -e "s#@CONFIGURE_REALTIME_ARG@#$CONFIGURE_REALTIME_ARG#g" \ -e "s#@TCLTK_VERSION@#$TCLTK_VERSION#g" \ -e "s#@XENOMAI_ARCHITECTURE@#$XENOMAI_ARCHITECTURE#g" \ -e "s|@YAPPS_RUNTIME@|$YAPPS_RUNTIME|g" \ -e "s#@ENABLE_BUILD_DOCUMENTATION@#$ENABLE_BUILD_DOCUMENTATION#g" \ -e '/^\s*,\s*$/d' \ "$@" } if [[ -z "${COMPAT}" ]]; then rm -f compat else subst compat.in > compat fi subst control.top.in > control echo >> control subst control.main-pkg.in >> control subst linuxcnc.install.in > ${MAIN_PACKAGE_NAME}.install subst linuxcnc.lintian-overrides.in > ${MAIN_PACKAGE_NAME}.lintian-overrides subst linuxcnc.manpages.in > ${MAIN_PACKAGE_NAME}.manpages subst rules.in > rules chmod +x rules if [ -n "$ENABLE_BUILD_DOCUMENTATION" ]; then subst control.docs.in >> control fi rm -f ../build-stamp echo "I: Successfully configured for '$DISTRIB_NAME'." echo "I: You can now start the build of LinuxCNC Debian packages." echo " To build and test everything: fakeroot debian/rules binary" echo " To build the executables and man pages only: fakeroot debian/rules binary-arch" echo " To avoid tests: DEB_BUILD_OPTIONS=nocheck debian/rules binary" if [ -n "$ENABLE_BUILD_DOCUMENTATION" ]; then echo " To avoid documentation: DEB_BUILD_OPTIONS=nodocs fakeroot debian/rules binary" else echo " Building of documentation is disabled." fi echo " The DEB_BUILD_OPTIONS environment variable also works with dpkg-buildpackage." if command -v dpkg-checkbuilddeps > /dev/null; then a="" if [ -n "$ENABLE_BUILD_DOCUMENTATION" ]; then a=$(cd .. && dpkg-checkbuilddeps 2>&1 || true) if [ -n "$a" ]; then echo "W: To successfully build all of LinuxCNC, install the following build dependencies are mising:" else echo "I: All build dependencies available for complete builds including the documentation." fi else a=$(cd .. && dpkg-checkbuilddeps -B 2>&1 || true) if [ -n "$a" ]; then echo "W: To successfully build the architecture-dependent parts of LinuxCNC, the following build dependencies are mising:" else echo "I: No dependencies missing while not building the documentation." fi fi if [ -n "$a" ]; then # The common part once missing packages have been identified echo -n " "; echo "$a" | cut -f4 -d: echo " The missing packages are auto-installed by" echo " sudo apt build-dep ." fi else echo "W: Tool to check build-dependenices not found" echo " You may want to install it as follows:" echo " sudo apt install dpkg-dev" echo " and directly execute it like this:" echo " dpkg-checkbuilddeps" echo " or just execute" echo " sudo apt build-dep ." fi # vim: ts=4