xfce.xfce4-notes-plugin: Generate C code with newer Vala (#359006)
[NixPkgs.git] / pkgs / servers / klipper / default.nix
blob30bf9464955c751862cebb3fe6c246652e5537d0
1 { stdenv
2 , lib
3 , fetchFromGitHub
4 , python3
5 , unstableGitUpdater
6 , makeWrapper
7 , writeShellScript
8 }:
10 stdenv.mkDerivation rec {
11   pname = "klipper";
12   version = "0.12.0-unstable-2024-10-26";
14   src = fetchFromGitHub {
15     owner = "KevinOConnor";
16     repo = "klipper";
17     rev = "31fe50ffa387ed4a45950c1043a3b214a9d554dd";
18     sha256 = "sha256-szGAQ5ttT1Y0q3pf6m9xNHreNjdmdWU8k0hwcT/6MDA=";
19   };
21   sourceRoot = "${src.name}/klippy";
23   # NB: This is needed for the postBuild step
24   nativeBuildInputs = [
25     (python3.withPackages ( p: with p; [ cffi ] ))
26     makeWrapper
27   ];
29   buildInputs = [ (python3.withPackages (p: with p; [ python-can cffi pyserial greenlet jinja2 markupsafe numpy ])) ];
31   # we need to run this to prebuild the chelper.
32   postBuild = ''
33     python ./chelper/__init__.py
34   '';
36   # Python 3 is already supported but shebangs aren't updated yet
37   postPatch = ''
38     for file in klippy.py console.py parsedump.py; do
39       substituteInPlace $file \
40         --replace '/usr/bin/env python2' '/usr/bin/env python'
41     done
43     # needed for cross compilation
44     substituteInPlace ./chelper/__init__.py \
45       --replace 'GCC_CMD = "gcc"' 'GCC_CMD = "${stdenv.cc.targetPrefix}cc"'
46   '';
48   pythonInterpreter =
49     (python3.withPackages (
50       p: with p; [
51         numpy
52         matplotlib
53       ]
54     )).interpreter;
56   pythonScriptWrapper = writeShellScript pname ''
57     ${pythonInterpreter} "@out@/lib/scripts/@script@" "$@"
58   '';
60   # NB: We don't move the main entry point into `/bin`, or even symlink it,
61   # because it uses relative paths to find necessary modules. We could wrap but
62   # this is used 99% of the time as a service, so it's not worth the effort.
63   installPhase = ''
64     runHook preInstall
65     mkdir -p $out/lib/klipper
66     cp -r ./* $out/lib/klipper
68     # Moonraker expects `config_examples` and `docs` to be available
69     # under `klipper_path`
70     cp -r $src/docs $out/lib/docs
71     cp -r $src/config $out/lib/config
72     cp -r $src/scripts $out/lib/scripts
73     cp -r $src/klippy $out/lib/klippy
75     # Add version information. For the normal procedure see https://www.klipper3d.org/Packaging.html#versioning
76     # This is done like this because scripts/make_version.py is not available when sourceRoot is set to "${src.name}/klippy"
77     echo "${version}-NixOS" > $out/lib/klipper/.version
79     mkdir -p $out/bin
80     chmod 755 $out/lib/klipper/klippy.py
81     makeWrapper $out/lib/klipper/klippy.py $out/bin/klippy --chdir $out/lib/klipper
83     substitute "$pythonScriptWrapper" "$out/bin/klipper-calibrate-shaper" \
84       --subst-var "out" \
85       --subst-var-by "script" "calibrate_shaper.py"
86     chmod 755 "$out/bin/klipper-calibrate-shaper"
88     runHook postInstall
89   '';
91   passthru.updateScript = unstableGitUpdater {
92     url = meta.homepage;
93     tagPrefix = "v";
94   };
96   meta = with lib; {
97     description = "Klipper 3D printer firmware";
98     mainProgram = "klippy";
99     homepage = "https://github.com/KevinOConnor/klipper";
100     maintainers = with maintainers; [ lovesegfault zhaofengli cab404 ];
101     platforms = platforms.linux;
102     license = licenses.gpl3Only;
103   };