From 0ca75bc294d38a420f67307b6de6ac1fd5d93620 Mon Sep 17 00:00:00 2001 From: Charles Duffy Date: Sun, 5 May 2019 18:31:51 -0500 Subject: [PATCH] curaLulzbot: 15.02.1-1.03-5064 -> 3.6.18 Move Cura Lulzbot Edition to be based on the same generation of the codebase as the upstream (Ultimaker) branch, away from a many-year-old legacy tree. Since prior Lulzbot Edition packaging simply wrapped binaries unpacked from Debian binary packages, doing this right requires forking the same dependencies that Lulzbot has branched themselves as well. --- pkgs/applications/misc/cura/lulzbot.nix | 96 ++++++++++--------- pkgs/applications/misc/curaengine/lulzbot.nix | 26 +++++ .../python-modules/libarcus/lulzbot.nix | 33 +++++++ .../python-modules/libsavitar/lulzbot.nix | 33 +++++++ .../python-modules/uranium/lulzbot.nix | 41 ++++++++ .../uranium/qt512-support.patch | 16 ++++ pkgs/top-level/all-packages.nix | 8 +- pkgs/top-level/python-packages.nix | 3 + 8 files changed, 208 insertions(+), 48 deletions(-) create mode 100644 pkgs/applications/misc/curaengine/lulzbot.nix create mode 100644 pkgs/development/python-modules/libarcus/lulzbot.nix create mode 100644 pkgs/development/python-modules/libsavitar/lulzbot.nix create mode 100644 pkgs/development/python-modules/uranium/lulzbot.nix create mode 100644 pkgs/development/python-modules/uranium/qt512-support.patch diff --git a/pkgs/applications/misc/cura/lulzbot.nix b/pkgs/applications/misc/cura/lulzbot.nix index f3f1972f6e6..9073c5fae49 100644 --- a/pkgs/applications/misc/cura/lulzbot.nix +++ b/pkgs/applications/misc/cura/lulzbot.nix @@ -1,58 +1,66 @@ -{ stdenv, fetchurl, dpkg, bash, python27Packages }: +{ lib, fetchgit, curaengineLulzbot, cmake, jq, python3Packages, qtbase, qtquickcontrols2 }: let - py = python27Packages; + # admittedly, we're using (printer firmware) blobs when we could compile them ourselves. + curaBinaryDataVersion = "3.6.18"; # Marlin v2.0.0.144. Keep this accurate wrt. the below. + curaBinaryData = fetchgit { + url = https://code.alephobjects.com/diffusion/CBD/cura-binary-data.git; + rev = "cdc046494bbfe1f65bfb34659a257eef9a0100a0"; + sha256 = "0v0s036gxdjiglas2yzw95alv60sw3pq5k1zrrhmw9mxr4irrblb"; + }; + curaengine = curaengineLulzbot; + libarcus = python3Packages.libarcusLulzbot; + uranium = python3Packages.uraniumLulzbot; + libsavitar = python3Packages.libsavitarLulzbot; in -stdenv.mkDerivation rec { +python3Packages.buildPythonApplication rec { name = "cura-lulzbot-${version}"; - version = "15.02.1-1.03-5064"; + version = "3.6.18"; - src = - if stdenv.hostPlatform.system == "x86_64-linux" then - fetchurl { - url = "https://download.alephobjects.com/ao/aodeb/dists/jessie/main/binary-amd64/cura_${version}_amd64.deb"; - sha256 = "1gsfidg3gim5pjbl82vkh0cw4ya253m4p7nirm8nr6yjrsirkzxg"; - } - else if stdenv.hostPlatform.system == "i686-linux" then - fetchurl { - url = "http://download.alephobjects.com/ao/aodeb/dists/jessie/main/binary-i386/cura_${version}_i386.deb"; - sha256 = "0xd3df6bxq4rijgvsqvps454jkc1nzhxbdzzj6j2w317ppsbhyc1"; - } - else throw "${name} is not supported on ${stdenv.hostPlatform.system}"; + src = fetchgit { + url = https://code.alephobjects.com/source/cura-lulzbot.git; + rev = "71f1ac5a2b9f535175a3858a565930348358a9ca"; + sha256 = "0by06fpxvdgy858lwhsccbmvkdq67j2s1cz8v6jnrnjrsxk7vzka"; + }; - python_deps = with py; [ pyopengl pyserial numpy wxPython30 power setuptools ]; - pythonPath = python_deps; - propagatedBuildInputs = python_deps; - buildInputs = [ dpkg bash py.wrapPython ]; + format = "other"; # using cmake to build + buildInputs = [ qtbase qtquickcontrols2 ]; + # numpy-stl temporarily disabled due to https://code.alephobjects.com/T8415 + propagatedBuildInputs = with python3Packages; [ pyserial requests zeroconf ] ++ [ libsavitar uranium libarcus ]; # numpy-stl + nativeBuildInputs = [ cmake python3Packages.wrapPython ]; - phases = [ "unpackPhase" "installPhase" ]; - unpackPhase = "dpkg-deb -x ${src} ./"; + cmakeFlags = [ + "-DURANIUM_DIR=${uranium.src}" + "-DCURA_VERSION=${version}" + ]; - installPhase = '' - mkdir -p $out/bin - cp -r usr/share $out/share - find $out/share -type f -exec sed -i 's|/usr/share/cura|$out/share/cura|g' "{}" \; - - cat < $out/bin/cura - #!${bash}/bin/bash - PYTHONPATH=$PYTHONPATH:$out/share/cura ${py.python}/bin/python $out/share/cura/cura.py "\$@" - EOT - - chmod 555 $out/bin/cura + postPatch = '' + sed -i 's,/python''${PYTHON_VERSION_MAJOR}/dist-packages,/python''${PYTHON_VERSION_MAJOR}.''${PYTHON_VERSION_MINOR}/site-packages,g' CMakeLists.txt + sed -i 's, executable_name = .*, executable_name = "${curaengine}/bin/CuraEngine",' plugins/CuraEngineBackend/CuraEngineBackend.py ''; - meta = with stdenv.lib; { - description = "3D printing host software for the Lulzbot"; + preFixup = '' + substituteInPlace "$out/bin/cura-lulzbot" --replace 'import cura.CuraApplication' 'import Savitar; import cura.CuraApplication' + ln -sT "${curaBinaryData}/cura/resources/firmware" "$out/share/cura/resources/firmware" + ln -sT "${uranium}/share/uranium" "$out/share/uranium" + ${jq}/bin/jq --arg out "$out" '.build=$out' >"$out/version.json" <<'EOF' + ${builtins.toJSON { + cura = version; + cura_version = version; + binarydata = curaBinaryDataVersion; + engine = curaengine.version; + libarcus = libarcus.version; + libsavitar = libsavitar.version; + uranium = uranium.version; + }} + EOF + ''; - longDescription = '' - Cura LulzBot Edition is a fork of the 3D printing/slicing - software from Ultimaker, with changes to support 3D printers - from Aleph Objects. - ''; - - homepage = https://www.lulzbot.com/cura/; - license = licenses.agpl3; + meta = with lib; { + description = "3D printer / slicing GUI built on top of the Uranium framework"; + homepage = https://code.alephobjects.com/diffusion/CURA/; + license = licenses.agpl3; # a partial relicense to LGPL has happened, but not certain that all AGPL bits are expunged platforms = platforms.linux; - maintainers = with maintainers; [ pjones ]; + maintainers = with maintainers; [ chaduffy ]; }; } diff --git a/pkgs/applications/misc/curaengine/lulzbot.nix b/pkgs/applications/misc/curaengine/lulzbot.nix new file mode 100644 index 00000000000..0df3e19b318 --- /dev/null +++ b/pkgs/applications/misc/curaengine/lulzbot.nix @@ -0,0 +1,26 @@ +{ stdenv, fetchgit, fetchpatch, cmake, libarcusLulzbot, stb, protobuf }: + +stdenv.mkDerivation rec { + name = "curaengine-lulzBot-${version}"; + version = "3.6.18"; + + src = fetchgit { + url = https://code.alephobjects.com/source/curaengine-lulzbot.git; + rev = "ec6a1a0f0aa387ef97e5c106633cf8d7fb9cd00d"; + sha256 = "0wdkvg1hmqp1gaym804lw09x4ngf5ffasd861jhflpy7djbmkfn8"; + }; + + nativeBuildInputs = [ cmake ]; + buildInputs = [ libarcusLulzbot stb protobuf ]; + + cmakeFlags = [ "-DCURA_ENGINE_VERSION=${version}" ]; + + meta = with stdenv.lib; { + description = "A powerful, fast and robust engine for processing 3D models into 3D printing instruction"; + homepage = https://code.alephobjects.com/source/curaengine-lulzbot/; + license = licenses.agpl3; + platforms = platforms.linux; + maintainers = with maintainers; [ chaduffy ]; + }; +} + diff --git a/pkgs/development/python-modules/libarcus/lulzbot.nix b/pkgs/development/python-modules/libarcus/lulzbot.nix new file mode 100644 index 00000000000..589111df78b --- /dev/null +++ b/pkgs/development/python-modules/libarcus/lulzbot.nix @@ -0,0 +1,33 @@ +{ stdenv, buildPythonPackage, fetchgit, fetchurl, cmake, sip, protobuf, pythonOlder }: + +buildPythonPackage rec { + pname = "libarcus"; + version = "3.6.18"; + format = "other"; + + src = fetchgit { + url = https://code.alephobjects.com/source/arcus.git; + rev = "c795c0644591703ce04e1fd799fc97b1539031aa"; + sha256 = "1yap9wbqxbjx3kqyqcsldny4mlcm33ywiwpdjlfgs0wjahfg4ip0"; + }; + + disabled = pythonOlder "3.4.0"; + + propagatedBuildInputs = [ sip ]; + nativeBuildInputs = [ cmake ]; + buildInputs = [ protobuf ]; + + postPatch = '' + # To workaround buggy SIP detection which overrides PYTHONPATH + sed -i '/SET(ENV{PYTHONPATH}/d' cmake/FindSIP.cmake + ''; + + meta = with stdenv.lib; { + description = "Communication library between internal components for Ultimaker software"; + homepage = https://code.alephobjects.com/source/arcus/; + license = licenses.lgpl3Plus; + platforms = platforms.linux; + maintainers = with maintainers; [ chaduffy ]; + }; +} + diff --git a/pkgs/development/python-modules/libsavitar/lulzbot.nix b/pkgs/development/python-modules/libsavitar/lulzbot.nix new file mode 100644 index 00000000000..7a1781f62ce --- /dev/null +++ b/pkgs/development/python-modules/libsavitar/lulzbot.nix @@ -0,0 +1,33 @@ +{ stdenv, buildPythonPackage, pythonOlder, fetchgit, cmake, sip }: + +buildPythonPackage rec { + pname = "libsavitar-lulzbot"; + name = "libsavitar-lulzbot"; + version = "3.6.18"; + format = "other"; + + src = fetchgit { + url = https://code.alephobjects.com/source/savitar.git; + rev = "988a26d35b2a1d042f8c38938ccda77ab146af7d"; + sha256 = "146agw3a92azkgs5ahmn2rrck4an78m2r3pcss6ihmb60lx165k7"; + }; + + postPatch = '' + # To workaround buggy SIP detection which overrides PYTHONPATH + sed -i '/SET(ENV{PYTHONPATH}/d' cmake/FindSIP.cmake + ''; + + nativeBuildInputs = [ cmake ]; + + propagatedBuildInputs = [ sip ]; + + disabled = pythonOlder "3.4.0"; + + meta = with stdenv.lib; { + description = "C++ implementation of 3mf loading with SIP python bindings"; + homepage = https://github.com/Ultimaker/libSavitar; + license = licenses.lgpl3Plus; + platforms = platforms.unix; + maintainers = with maintainers; [ chaduffy ]; + }; +} diff --git a/pkgs/development/python-modules/uranium/lulzbot.nix b/pkgs/development/python-modules/uranium/lulzbot.nix new file mode 100644 index 00000000000..fd95110fd19 --- /dev/null +++ b/pkgs/development/python-modules/uranium/lulzbot.nix @@ -0,0 +1,41 @@ +{ stdenv, fetchurl, fetchgit, buildPythonPackage, fetchFromGitHub, python, cmake +, pyqt5, numpy, scipy, shapely, libarcusLulzbot, doxygen, gettext, pythonOlder }: + +buildPythonPackage rec { + version = "3.6.18"; + pname = "uranium"; + name = "uraniumLulzbot"; + format = "other"; + + src = fetchgit { + url = https://code.alephobjects.com/diffusion/U/uranium.git; + rev = "33df88a7414375ac924ac761113baa48d2ced2b4"; + sha256 = "109cbv7y105crbrzfp70lmcr9n20ap5c97i5qd46fmxbx86yj7f8"; + }; + + disabled = pythonOlder "3.5.0"; + + buildInputs = [ python gettext ]; + propagatedBuildInputs = [ pyqt5 numpy scipy shapely libarcusLulzbot ]; + nativeBuildInputs = [ cmake doxygen ]; + + # Qt 5.12+ support; see https://code.alephobjects.com/rU70b73ba0a270799b9eacf78e400aa8b8ab3fb2ee + patches = [ ./qt512-support.patch ]; + + postPatch = '' + sed -i 's,/python''${PYTHON_VERSION_MAJOR}/dist-packages,/python''${PYTHON_VERSION_MAJOR}.''${PYTHON_VERSION_MINOR}/site-packages,g' CMakeLists.txt + sed -i \ + -e "s,Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)).*,Resources.addSearchPath(\"$out/share/uranium/resources\")," \ + -e "s,self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)).*,self._plugin_registry.addPluginLocation(\"$out/lib/uranium/plugins\")," \ + UM/Application.py + ''; + + meta = with stdenv.lib; { + description = "A Python framework for building Desktop applications"; + homepage = https://code.alephobjects.com/diffusion/U/; + license = licenses.lgpl3Plus; + platforms = platforms.linux; + maintainers = with maintainers; [ chaduffy ]; + }; +} + diff --git a/pkgs/development/python-modules/uranium/qt512-support.patch b/pkgs/development/python-modules/uranium/qt512-support.patch new file mode 100644 index 00000000000..2c666a98c8f --- /dev/null +++ b/pkgs/development/python-modules/uranium/qt512-support.patch @@ -0,0 +1,16 @@ +diff --git a/UM/Qt/Bindings/i18nCatalogProxy.py b/UM/Qt/Bindings/i18nCatalogProxy.py +index 7e2bb16c..cec70dd6 100644 +--- a/UM/Qt/Bindings/i18nCatalogProxy.py ++++ b/UM/Qt/Bindings/i18nCatalogProxy.py +@@ -86,9 +86,9 @@ class i18nCatalogProxy(QObject): # [CodeStyle: Ultimaker code style requires cla + # \todo Move this to a more generic place so more things can use it. + def _wrapFunction(self, engine, this_object, function): + # JavaScript code that wraps the Python method call in a closure +- wrap_js = """function(this_object) {{ ++ wrap_js = """(function(this_object) {{ + return function({args}) {{ return this_object.{function}({args}) }} +- }}""" ++ }})""" + + # Get the function name and argument list. + function_name = function.__name__ diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d2c1c10f5cf..8e28a4dd65f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -20203,14 +20203,14 @@ in curaengine = curaengine_stable; }; - curaengine = callPackage ../applications/misc/curaengine { - inherit (python3.pkgs) libarcus; - }; + curaengine = callPackage ../applications/misc/curaengine { inherit (python3.pkgs) libarcus; }; + curaengineLulzbot = callPackage ../applications/misc/curaengine/lulzbot.nix { inherit (python3.pkgs) libarcusLulzbot; }; + cura = qt5.callPackage ../applications/misc/cura { }; curaPlugins = callPackage ../applications/misc/cura/plugins.nix { }; - curaLulzbot = callPackage ../applications/misc/cura/lulzbot.nix { }; + curaLulzbot = qt5.callPackage ../applications/misc/cura/lulzbot.nix { }; curaByDagoma = callPackage ../applications/misc/curabydagoma { }; diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index e957fe5746c..62586866c26 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -3238,6 +3238,7 @@ in { fs-s3fs = callPackage ../development/python-modules/fs-s3fs { }; libarcus = callPackage ../development/python-modules/libarcus { inherit (pkgs) protobuf; }; + libarcusLulzbot = callPackage ../development/python-modules/libarcus/lulzbot.nix { inherit (pkgs) protobuf; }; libcloud = callPackage ../development/python-modules/libcloud { }; @@ -3258,6 +3259,7 @@ in { }; libsavitar = callPackage ../development/python-modules/libsavitar { }; + libsavitarLulzbot = callPackage ../development/python-modules/libsavitar/lulzbot.nix { }; libplist = disabledIf isPy3k (toPythonModule (pkgs.libplist.override{python2Packages=self; })).py; @@ -5537,6 +5539,7 @@ in { twilio = callPackage ../development/python-modules/twilio { }; uranium = callPackage ../development/python-modules/uranium { }; + uraniumLulzbot = callPackage ../development/python-modules/uranium/lulzbot.nix { }; uuid = callPackage ../development/python-modules/uuid { };