diff options
Diffstat (limited to 'nixpkgs/pkgs/servers/klipper')
-rw-r--r-- | nixpkgs/pkgs/servers/klipper/default.nix | 75 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/klipper/klipper-firmware.nix | 61 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/klipper/klipper-flash.nix | 38 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/klipper/klipper-genconf.nix | 19 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/klipper/simulator.cfg | 31 |
5 files changed, 224 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/klipper/default.nix b/nixpkgs/pkgs/servers/klipper/default.nix new file mode 100644 index 000000000000..e1d15d55722c --- /dev/null +++ b/nixpkgs/pkgs/servers/klipper/default.nix @@ -0,0 +1,75 @@ +{ stdenv +, lib +, fetchFromGitHub +, python3 +, unstableGitUpdater +, makeWrapper +}: + +stdenv.mkDerivation rec { + pname = "klipper"; + version = "unstable-2024-02-17"; + + src = fetchFromGitHub { + owner = "KevinOConnor"; + repo = "klipper"; + rev = "28f06a104bc0cfe3a7d36db343ade5a805b3e132"; + sha256 = "sha256-v2nv4g3dQTMbUKIrEJo8s66WRWXnSkWO8K+12fK/cZw="; + }; + + sourceRoot = "${src.name}/klippy"; + + # NB: This is needed for the postBuild step + nativeBuildInputs = [ + (python3.withPackages ( p: with p; [ cffi ] )) + makeWrapper + ]; + + buildInputs = [ (python3.withPackages (p: with p; [ can cffi pyserial greenlet jinja2 markupsafe numpy ])) ]; + + # we need to run this to prebuild the chelper. + postBuild = '' + python ./chelper/__init__.py + ''; + + # Python 3 is already supported but shebangs aren't updated yet + postPatch = '' + for file in klippy.py console.py parsedump.py; do + substituteInPlace $file \ + --replace '/usr/bin/env python2' '/usr/bin/env python' + done + + # needed for cross compilation + substituteInPlace ./chelper/__init__.py \ + --replace 'GCC_CMD = "gcc"' 'GCC_CMD = "${stdenv.cc.targetPrefix}cc"' + ''; + + # NB: We don't move the main entry point into `/bin`, or even symlink it, + # because it uses relative paths to find necessary modules. We could wrap but + # this is used 99% of the time as a service, so it's not worth the effort. + installPhase = '' + runHook preInstall + mkdir -p $out/lib/klipper + cp -r ./* $out/lib/klipper + + # Moonraker expects `config_examples` and `docs` to be available + # under `klipper_path` + cp -r $src/docs $out/lib/docs + cp -r $src/config $out/lib/config + + mkdir -p $out/bin + chmod 755 $out/lib/klipper/klippy.py + makeWrapper $out/lib/klipper/klippy.py $out/bin/klippy --chdir $out/lib/klipper + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater { url = meta.homepage; }; + + meta = with lib; { + description = "The Klipper 3D printer firmware"; + homepage = "https://github.com/KevinOConnor/klipper"; + maintainers = with maintainers; [ lovesegfault zhaofengli cab404 ]; + platforms = platforms.linux; + license = licenses.gpl3Only; + }; +} diff --git a/nixpkgs/pkgs/servers/klipper/klipper-firmware.nix b/nixpkgs/pkgs/servers/klipper/klipper-firmware.nix new file mode 100644 index 000000000000..2f40c6fd86a4 --- /dev/null +++ b/nixpkgs/pkgs/servers/klipper/klipper-firmware.nix @@ -0,0 +1,61 @@ +{ stdenv +, lib +, pkg-config +, pkgsCross +, bintools-unwrapped +, libffi +, libusb1 +, wxGTK32 +, python3 +, gcc-arm-embedded +, klipper +, avrdude +, stm32flash +, mcu ? "mcu" +, firmwareConfig ? ./simulator.cfg +}: stdenv.mkDerivation rec { + name = "klipper-firmware-${mcu}-${version}"; + version = klipper.version; + src = klipper.src; + + nativeBuildInputs = [ + python3 + pkgsCross.avr.stdenv.cc + gcc-arm-embedded + bintools-unwrapped + libffi + libusb1 + avrdude + stm32flash + pkg-config + wxGTK32 # Required for bossac + ]; + + preBuild = "cp ${firmwareConfig} ./.config"; + + postPatch = '' + patchShebangs . + ''; + + makeFlags = [ + "V=1" + "KCONFIG_CONFIG=${firmwareConfig}" + "WXVERSION=3.2" + ]; + + installPhase = '' + mkdir -p $out + cp ./.config $out/config + cp out/klipper.bin $out/ || true + cp out/klipper.elf $out/ || true + ''; + + dontFixup = true; + + meta = with lib; { + inherit (klipper.meta) homepage license; + description = "Firmware part of Klipper"; + maintainers = with maintainers; [ vtuan10 ]; + platforms = platforms.linux; + }; +} diff --git a/nixpkgs/pkgs/servers/klipper/klipper-flash.nix b/nixpkgs/pkgs/servers/klipper/klipper-flash.nix new file mode 100644 index 000000000000..2f37745fd631 --- /dev/null +++ b/nixpkgs/pkgs/servers/klipper/klipper-flash.nix @@ -0,0 +1,38 @@ +{ lib +, writeShellApplication +, gnumake +, pkgsCross +, klipper +, klipper-firmware +, python3 +, avrdude +, stm32flash +, mcu ? "mcu" +, flashDevice ? "/dev/null" +, firmwareConfig ? ./simulator.cfg +}: +let + supportedArches = [ "avr" "stm32" "lpc176x" ]; + matchBoard = with builtins; match ''^.*CONFIG_BOARD_DIRECTORY="([a-zA-Z0-9_]+)".*$'' (readFile firmwareConfig); + boardArch = if matchBoard == null then null else builtins.head matchBoard; +in +writeShellApplication { + name = "klipper-flash-${mcu}"; + runtimeInputs = [ + python3 + pkgsCross.avr.stdenv.cc + gnumake + ] ++ lib.optionals (boardArch == "avr") [ avrdude ] ++ lib.optionals (boardArch == "stm32") [ stm32flash ]; + text = '' + if ${lib.boolToString (!builtins.elem boardArch supportedArches)}; then + printf "Flashing Klipper firmware to your board is not supported yet.\n" + printf "Please use the compiled firmware at ${klipper-firmware} and flash it using the tools provided for your microcontroller." + exit 1 + fi + if ${lib.boolToString (boardArch == "stm32")}; then + make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" serialflash + else + make -C ${klipper.src} FLASH_DEVICE="${toString flashDevice}" OUT="${klipper-firmware}/" KCONFIG_CONFIG="${klipper-firmware}/config" flash + fi + ''; +} diff --git a/nixpkgs/pkgs/servers/klipper/klipper-genconf.nix b/nixpkgs/pkgs/servers/klipper/klipper-genconf.nix new file mode 100644 index 000000000000..293a8112007b --- /dev/null +++ b/nixpkgs/pkgs/servers/klipper/klipper-genconf.nix @@ -0,0 +1,19 @@ +{ writeShellApplication +, klipper +, python3 +, gnumake +}: writeShellApplication { + name = "klipper-genconf"; + runtimeInputs = [ + python3 + gnumake + ]; + text = '' + CURRENT_DIR=$(pwd) + TMP=$(mktemp -d) + make -C ${klipper.src} OUT="$TMP" KCONFIG_CONFIG="$CURRENT_DIR/config" menuconfig + rm -rf "$TMP" config.old + printf "\nYour firmware configuration for klipper:\n\n" + cat config + ''; +} diff --git a/nixpkgs/pkgs/servers/klipper/simulator.cfg b/nixpkgs/pkgs/servers/klipper/simulator.cfg new file mode 100644 index 000000000000..6a4122ce3aa5 --- /dev/null +++ b/nixpkgs/pkgs/servers/klipper/simulator.cfg @@ -0,0 +1,31 @@ +# CONFIG_LOW_LEVEL_OPTIONS is not set +# CONFIG_MACH_AVR is not set +# CONFIG_MACH_ATSAM is not set +# CONFIG_MACH_ATSAMD is not set +# CONFIG_MACH_LPC176X is not set +# CONFIG_MACH_STM32 is not set +# CONFIG_MACH_HC32F460 is not set +# CONFIG_MACH_RP2040 is not set +# CONFIG_MACH_PRU is not set +# CONFIG_MACH_AR100 is not set +# CONFIG_MACH_LINUX is not set +CONFIG_MACH_SIMU=y +CONFIG_BOARD_DIRECTORY="simulator" +CONFIG_CLOCK_FREQ=20000000 +CONFIG_SERIAL=y +CONFIG_SIMULATOR_SELECT=y +CONFIG_SERIAL_BAUD=250000 +CONFIG_USB_VENDOR_ID=0x1d50 +CONFIG_USB_DEVICE_ID=0x614e +CONFIG_USB_SERIAL_NUMBER="12345" +CONFIG_WANT_GPIO_BITBANGING=y +CONFIG_WANT_DISPLAYS=y +CONFIG_WANT_SENSORS=y +CONFIG_WANT_LIS2DW=y +CONFIG_WANT_SOFTWARE_SPI=y +CONFIG_CANBUS_FREQUENCY=1000000 +CONFIG_HAVE_GPIO=y +CONFIG_HAVE_GPIO_ADC=y +CONFIG_HAVE_GPIO_SPI=y +CONFIG_HAVE_GPIO_HARD_PWM=y +CONFIG_INLINE_STEPPER_HACK=y |