jspijker 2 лет назад
Родитель
Сommit
065e785e90
2 измененных файлов с 244 добавлено и 253 удалено
  1. 194 211
      conandata.yml
  2. 50 42
      conanfile.py

+ 194 - 211
conandata.yml

@@ -1,214 +1,197 @@
----
-# Usage: defaults to the first entry in this conandata.yml file
-# If you're on a release branch create an entry for that **version**  e.q.: `5.1.0` update the requirements (use pinned versions, not latest)
-# also create a beta entry for that **version**  e.q.: `5.1.0-beta`, update the requirements (use the <dep_name>/(latest)@ultimaker/stable)
-#
-# If you're working on a feature/bugfix branch from a release branch, create an entry for that **channel**,  update the requirements (use
-# the <dep_name>/(latest)@ultimaker/stable)
-#
-# If you're working on a feature/bugfix branch from a main branch, it is optional to create an entry for that **channel**,  update the
-# requirements (use the <dep_name>/(latest)@ultimaker/testing)
-#
-# Subject to change in the future!
 runinfo:
-  entrypoint: "cura_app.py"
+    entrypoint: "cura_app.py"
 pyinstaller:
-  datas:
-    cura_plugins:
-      package: "cura"
-      src: "plugins"
-      dst: "share/cura/plugins"
-    cura_resources:
-      package: "cura"
-      src: "resources"
-      dst: "share/cura/resources"
-    cura_private_data:
-      package: "cura_private_data"
-      src: "resources"
-      dst: "share/cura/resources"
-      internal: true
-    cura_private_data_plugins:
-      package: "cura_private_data"
-      src: "plugins"
-      dst: "share/cura/plugins"
-      internal: true
-    uranium_plugins:
-      package: "uranium"
-      src: "plugins"
-      dst: "share/uranium/plugins"
-    uranium_resources:
-      package: "uranium"
-      src: "resources"
-      dst: "share/uranium/resources"
-    uranium_um_qt_qml_um:
-      package: "uranium"
-      src: "site-packages/UM/Qt/qml/UM"
-      dst: "PyQt6/Qt6/qml/UM"
-    cura_binary_data:
-      package: "cura_binary_data"
-      src: "resources/cura/resources"
-      dst: "share/cura/resources"
-    uranium_binary_data:
-      package: "cura_binary_data"
-      src: "resources/uranium/resources"
-      dst: "share/uranium/resources"
-    windows_binary_data:
-      package: "cura_binary_data"
-      src: "windows"
-      dst: "share/windows"
-    fdm_materials:
-      package: "fdm_materials"
-      src: "materials"
-      dst: "share/cura/resources/materials"
-    tcl:
-      package: "tcl"
-      src: "lib/tcl8.6"
-      dst: "tcl"
-    tk:
-      package: "tk"
-      src: "lib/tk8.6"
-      dst: "tk"
-  binaries:
-    curaengine:
-      package: "curaengine"
-      src: "bin"
-      dst: "."
-      binary: "CuraEngine"
-  hiddenimports:
-    - "pySavitar"
-    - "pyArcus"
-    - "pynest2d"
-    - "PyQt6"
-    - "PyQt6.QtNetwork"
-    - "PyQt6.sip"
-    - "logging.handlers"
-    - "zeroconf"
-    - "fcntl"
-    - "stl"
-    - "serial"
-  collect_all:
-    - "cura"
-    - "UM"
-    - "serial"
-    - "Charon"
-    - "sqlite3"
-    - "trimesh"
-    - "win32ctypes"
-    - "PyQt6"
-    - "PyQt6.QtNetwork"
-    - "PyQt6.sip"
-    - "stl"
-  icon:
-    Windows: "./icons/Cura.ico"
-    Macos: "./icons/cura.icns"
-    Linux: "./icons/cura-128.png"
+    datas:
+        cura_plugins:
+            package: "cura"
+            src: "plugins"
+            dst: "share/cura/plugins"
+        cura_resources:
+            package: "cura"
+            src: "resources"
+            dst: "share/cura/resources"
+        cura_private_data:
+            package: "cura_private_data"
+            src: "resources"
+            dst: "share/cura/resources"
+            internal: true
+        uranium_plugins:
+            package: "uranium"
+            src: "plugins"
+            dst: "share/uranium/plugins"
+        uranium_resources:
+            package: "uranium"
+            src: "resources"
+            dst: "share/uranium/resources"
+        uranium_um_qt_qml_um:
+            package: "uranium"
+            src: "site-packages/UM/Qt/qml/UM"
+            dst: "PyQt6/Qt6/qml/UM"
+        cura_binary_data:
+            package: "cura_binary_data"
+            src: "resources/cura/resources"
+            dst: "share/cura/resources"
+        uranium_binary_data:
+            package: "cura_binary_data"
+            src: "resources/uranium/resources"
+            dst: "share/uranium/resources"
+        windows_binary_data:
+            package: "cura_binary_data"
+            src: "windows"
+            dst: "share/windows"
+        fdm_materials:
+            package: "fdm_materials"
+            src: "materials"
+            dst: "share/cura/resources/materials"
+        tcl:
+            package: "tcl"
+            src: "lib/tcl8.6"
+            dst: "tcl"
+        tk:
+            package: "tk"
+            src: "lib/tk8.6"
+            dst: "tk"
+    binaries:
+        curaengine:
+            package: "curaengine"
+            src: "bin"
+            dst: "."
+            binary: "CuraEngine"
+    hiddenimports:
+        - "pySavitar"
+        - "pyArcus"
+        - "pynest2d"
+        - "PyQt6"
+        - "PyQt6.QtNetwork"
+        - "PyQt6.sip"
+        - "logging.handlers"
+        - "zeroconf"
+        - "fcntl"
+        - "stl"
+        - "serial"
+    collect_all:
+        - "cura"
+        - "UM"
+        - "serial"
+        - "Charon"
+        - "sqlite3"
+        - "trimesh"
+        - "win32ctypes"
+        - "PyQt6"
+        - "PyQt6.QtNetwork"
+        - "PyQt6.sip"
+        - "stl"
+    icon:
+        Windows: "./icons/Cura.ico"
+        Macos: "./icons/cura.icns"
+        Linux: "./icons/cura-128.png"
 pycharm_targets:
-  - jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
-    module_name: Cura
-    name: cura
-    script_name: cura_app.py
-  - jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
-    module_name: Cura
-    name: cura_external_engine
-    parameters: --external-backend
-    script_name: cura_app.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in tests
-    script_name: tests/
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestBuildVolume.py
-    script_name: tests/TestBuildVolume.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestConvexHullDecorator.py
-    script_name: tests/TestConvexHullDecorator.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestCuraSceneNode.py
-    script_name: tests/TestCuraSceneNode.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestCuraSceneNode.py
-    script_name: tests/TestExtruderManager.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestGCodeListDecorator.py
-    script_name: tests/TestGCodeListDecorator.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestIntentManager.py
-    script_name: tests/TestIntentManager.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestLayer.py
-    script_name: tests/TestLayer.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestMachineAction.py
-    script_name: tests/TestMachineAction.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestMachineManager.py
-    script_name: tests/TestMachineManager.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestOAuth2.py
-    script_name: tests/TestOAuth2.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestObjectsModel.py
-    script_name: tests/TestObjectsModel.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestPrintInformation.py
-    script_name: tests/TestPrintInformation.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestProfileRequirements.py
-    script_name: tests/TestProfileRequirements.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestThemes.py
-    script_name: tests/TestThemes.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestContainerManager.py
-    script_name: tests/Settings/TestContainerManager.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestCuraContainerRegistry.py
-    script_name: tests/Settings/TestCuraContainerRegistry.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestCuraStackBuilder.py
-    script_name: tests/Settings/TestCuraStackBuilder.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestDefinitionContainer.py
-    script_name: tests/Settings/TestDefinitionContainer.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestExtruderStack.py
-    script_name: tests/Settings/TestExtruderStack.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestGlobalStack.py
-    script_name: tests/Settings/TestGlobalStack.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestProfiles.py
-    script_name: tests/Settings/TestProfiles.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestSettingInheritanceManager.py
-    script_name: tests/Settings/TestSettingInheritanceManager.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestSettingOverrideDecorator.py
-    script_name: tests/Settings/TestSettingOverrideDecorator.py
-  - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
-    module_name: Cura
-    name: pytest in TestSettingVisibilityPresets.py
-    script_name: tests/Settings/TestSettingVisibilityPresets.py
+    - jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
+      module_name: Cura
+      name: cura
+      script_name: cura_app.py
+    - jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
+      module_name: Cura
+      name: cura_external_engine
+      parameters: --external-backend
+      script_name: cura_app.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in tests
+      script_name: tests/
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestBuildVolume.py
+      script_name: tests/TestBuildVolume.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestConvexHullDecorator.py
+      script_name: tests/TestConvexHullDecorator.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestCuraSceneNode.py
+      script_name: tests/TestCuraSceneNode.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestCuraSceneNode.py
+      script_name: tests/TestExtruderManager.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestGCodeListDecorator.py
+      script_name: tests/TestGCodeListDecorator.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestIntentManager.py
+      script_name: tests/TestIntentManager.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestLayer.py
+      script_name: tests/TestLayer.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestMachineAction.py
+      script_name: tests/TestMachineAction.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestMachineManager.py
+      script_name: tests/TestMachineManager.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestOAuth2.py
+      script_name: tests/TestOAuth2.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestObjectsModel.py
+      script_name: tests/TestObjectsModel.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestPrintInformation.py
+      script_name: tests/TestPrintInformation.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestProfileRequirements.py
+      script_name: tests/TestProfileRequirements.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestThemes.py
+      script_name: tests/TestThemes.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestContainerManager.py
+      script_name: tests/Settings/TestContainerManager.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestCuraContainerRegistry.py
+      script_name: tests/Settings/TestCuraContainerRegistry.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestCuraStackBuilder.py
+      script_name: tests/Settings/TestCuraStackBuilder.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestDefinitionContainer.py
+      script_name: tests/Settings/TestDefinitionContainer.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestExtruderStack.py
+      script_name: tests/Settings/TestExtruderStack.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestGlobalStack.py
+      script_name: tests/Settings/TestGlobalStack.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestProfiles.py
+      script_name: tests/Settings/TestProfiles.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestSettingInheritanceManager.py
+      script_name: tests/Settings/TestSettingInheritanceManager.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestSettingOverrideDecorator.py
+      script_name: tests/Settings/TestSettingOverrideDecorator.py
+    - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
+      module_name: Cura
+      name: pytest in TestSettingVisibilityPresets.py
+      script_name: tests/Settings/TestSettingVisibilityPresets.py

+ 50 - 42
conanfile.py

@@ -19,7 +19,7 @@ class CuraConan(ConanFile):
     author = "UltiMaker"
     url = "https://github.com/Ultimaker/cura"
     description = "3D printer / slicing GUI built on top of the Uranium framework"
-    topics = ("conan", "python", "pyqt5", "qt", "qml", "3d-printing", "slicer")
+    topics = ("conan", "python", "pyqt6", "qt", "qml", "3d-printing", "slicer")
     build_policy = "missing"
     exports = "LICENSE*", "UltiMaker-Cura.spec.jinja", "CuraVersion.py.jinja"
     settings = "os", "compiler", "build_type", "arch"
@@ -48,12 +48,6 @@ class CuraConan(ConanFile):
         "cura_debug_mode": False,  # Not yet implemented
         "internal": False,
     }
-    scm = {
-        "type": "git",
-        "subfolder": ".",
-        "url": "auto",
-        "revision": "auto"
-    }
 
     @property
     def _pycharm_targets(self):
@@ -153,7 +147,7 @@ class CuraConan(ConanFile):
         return py_interp
 
     def _generate_cura_version(self, location):
-        with open(Path(__file__).parent.joinpath("CuraVersion.py.jinja"), "r") as f:
+        with open(os.path.join(self.recipe_folder, "CuraVersion.py.jinja"), "r") as f:
             cura_version_py = Template(f.read())
 
         # If you want a specific Cura version to show up on the splash screen add the user configuration `user.cura:version=VERSION`
@@ -164,7 +158,7 @@ class CuraConan(ConanFile):
         internal_tag = f"+internal" if self.options.internal else ""
         cura_version = f"{cura_version.major}.{cura_version.minor}.{cura_version.patch}{pre_tag}{build_tag}{internal_tag}"
 
-        with open(Path(location, "CuraVersion.py"), "w") as f:
+        with open(os.path.join(location, "CuraVersion.py"), "w") as f:
             f.write(cura_version_py.render(
                 cura_app_name = self.name,
                 cura_app_display_name = self._app_name,
@@ -188,13 +182,13 @@ class CuraConan(ConanFile):
             if "package" in data:  # get the paths from conan package
                 if data["package"] == self.name:
                     if self.in_local_cache:
-                        src_path = Path(self.package_folder, data["src"])
+                        src_path = os.path.join(self.package_folder, data["src"])
                     else:
-                        src_path = Path(self.source_folder, data["src"])
+                        src_path = os.path.join(self.source_folder, data["src"])
                 else:
-                    src_path = Path(self.deps_cpp_info[data["package"]].rootpath, data["src"])
+                    src_path = os.path.join(self.deps_cpp_info[data["package"]].rootpath, data["src"])
             elif "root" in data:  # get the paths relative from the sourcefolder
-                src_path = Path(self.source_folder, data["root"], data["src"])
+                src_path = os.path.join(self.source_folder, data["root"], data["src"])
             else:
                 continue
             if src_path.exists():
@@ -203,9 +197,9 @@ class CuraConan(ConanFile):
         binaries = []
         for binary in pyinstaller_metadata["binaries"].values():
             if "package" in binary:  # get the paths from conan package
-                src_path = Path(self.deps_cpp_info[binary["package"]].rootpath, binary["src"])
+                src_path = os.path.join(self.deps_cpp_info[binary["package"]].rootpath, binary["src"])
             elif "root" in binary:  # get the paths relative from the sourcefolder
-                src_path = Path(self.source_folder, binary["root"], binary["src"])
+                src_path = os.path.join(self.source_folder, binary["root"], binary["src"])
             else:
                 continue
             if not src_path.exists():
@@ -232,13 +226,13 @@ class CuraConan(ConanFile):
         # Collect all dll's from PyQt6 and place them in the root
         binaries.extend([(f"{p}", ".") for p in Path(self._site_packages, "PyQt6", "Qt6").glob("**/*.dll")])
 
-        with open(Path(__file__).parent.joinpath("UltiMaker-Cura.spec.jinja"), "r") as f:
+        with open(os.path.join(self.recipe_folder, "UltiMaker-Cura.spec.jinja"), "r") as f:
             pyinstaller = Template(f.read())
 
         version = self.conf_info.get("user.cura:version", default = self.version, check_type = str)
         cura_version = Version(version)
 
-        with open(Path(location, "UltiMaker-Cura.spec"), "w") as f:
+        with open(os.path.join(location, "UltiMaker-Cura.spec"), "w") as f:
             f.write(pyinstaller.render(
                 name = str(self.options.display_name).replace(" ", "-"),
                 display_name = self._app_name,
@@ -259,6 +253,20 @@ class CuraConan(ConanFile):
                 short_version = f"'{cura_version.major}.{cura_version.minor}.{cura_version.patch}'",
             ))
 
+    def export_sources(self):
+        copy(self, "*", os.path.join(self.recipe_folder, "plugins"), os.path.join(self.export_sources_folder, "plugins"))
+        copy(self, "*", os.path.join(self.recipe_folder, "resources"), os.path.join(self.export_sources_folder, "resources"), excludes = "*.mo")
+        copy(self, "*", os.path.join(self.recipe_folder, "tests"), os.path.join(self.export_sources_folder, "tests"))
+        copy(self, "*", os.path.join(self.recipe_folder, "cura"), os.path.join(self.export_sources_folder, "cura"), excludes="CuraVersion.py")
+        copy(self, "*", os.path.join(self.recipe_folder, "packaging"), os.path.join(self.export_sources_folder, "packaging"))
+        copy(self, "*", os.path.join(self.recipe_folder, ".run_templates"), os.path.join(self.export_sources_folder, "run_templates"))
+        copy(self, "requirements.txt", self.recipe_folder, self.export_sources_folder)
+        copy(self, "requirements-dev.txt", self.recipe_folder, self.export_sources_folder)
+        copy(self, "requirements-ultimaker.txt", self.recipe_folder, self.export_sources_folder)
+        copy(self, "UltiMaker-Cura.spec.jinja", self.recipe_folder, self.export_sources_folder)
+        copy(self, "CuraVersion.py.jinja", self.recipe_folder, self.export_sources_folder)
+        copy(self, "cura_app.py", self.recipe_folder, self.export_sources_folder)
+
     def set_version(self):
         if self.version is None:
             self.version = self._umdefault_version()
@@ -276,12 +284,12 @@ class CuraConan(ConanFile):
 
     def requirements(self):
         self.requires("pyarcus/5.2.2")
-        self.requires("curaengine/5.3.0-beta@ultimaker/testing")
+        self.requires("curaengine/5.3.0-beta")
         self.requires("pysavitar/5.2.2")
         self.requires("pynest2d/5.2.2")
-        self.requires("uranium/5.3.0-beta.2@ultimaker/testing")
+        self.requires("uranium/5.3.0-beta.2")
         self.requires("fdm_materials/5.3.0-beta.1+29@ultimaker/stable")
-        self.requires("cura_binary_data/(latest)@ultimaker/testing")
+        self.requires("cura_binary_data/5.3.0-beta")
         self.requires("cpython/3.10.4")
         if self.options.internal:
             self.requires("cura_private_data/(latest)@ultimaker/testing")
@@ -295,7 +303,7 @@ class CuraConan(ConanFile):
     def layout(self):
         self.folders.source = "."
         self.folders.build = "venv"
-        self.folders.generators = Path(self.folders.build, "conan")
+        self.folders.generators = os.path.join(self.folders.build, "conan")
 
         self.cpp.package.libdirs = [os.path.join("site-packages", "cura")]
         self.cpp.package.bindirs = ["bin"]
@@ -314,25 +322,25 @@ class CuraConan(ConanFile):
     def generate(self):
         cura_run_envvars = self._cura_run_env.vars(self, scope = "run")
         ext = ".ps1" if self.settings.os == "Windows" else ".sh"
-        cura_run_envvars.save_script(self.folders.generators.joinpath(f"cura_run_environment{ext}"))
+        cura_run_envvars.save_script(os.path.join(self.folders.generators, f"cura_run_environment{ext}"))
 
         vr = VirtualRunEnv(self)
         vr.generate()
 
-        vb = VirtualBuildEnv(self)
-        vb.generate()
-
-        self._generate_cura_version(Path(self.source_folder, "cura"))
+        self._generate_cura_version(os.path.join(self.source_folder, "cura"))
 
         if self.options.devtools:
-            entitlements_file = "'{}'".format(Path(self.source_folder, "packaging", "MacOS", "cura.entitlements"))
+            entitlements_file = "'{}'".format(os.path.join(self.source_folder, "packaging", "MacOS", "cura.entitlements"))
             self._generate_pyinstaller_spec(location = self.generators_folder,
-                                            entrypoint_location = "'{}'".format(Path(self.source_folder, self.conan_data["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
-                                            icon_path = "'{}'".format(Path(self.source_folder, "packaging", self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
+                                            entrypoint_location = "'{}'".format(os.path.join(self.source_folder, self.conan_data["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
+                                            icon_path = "'{}'".format(os.path.join(self.source_folder, "packaging", self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
                                             entitlements_file = entitlements_file if self.settings.os == "Macos" else "None")
 
             # Update the po files
             if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str):
+                vb = VirtualBuildEnv(self)
+                vb.generate()
+
                 # FIXME: once m4, autoconf, automake are Conan V2 ready use self.win_bash and add gettext as base tool_requirement
                 cpp_info = self.dependencies["gettext"].cpp_info
                 for po_file in self.source_path.joinpath("resources", "i18n").glob("**/*.po"):
@@ -400,7 +408,7 @@ class CuraConan(ConanFile):
         self.copy_deps("*", root_package = "uranium", src = self.deps_cpp_info["uranium"].libdirs[0],
                        dst = self._site_packages.joinpath("UM"),
                        keep_path = True)
-        self.copy_deps("*", root_package = "uranium", src = str(Path(self.deps_cpp_info["uranium"].libdirs[0], "Qt", "qml", "UM")),
+        self.copy_deps("*", root_package = "uranium", src = str(os.path.join(self.deps_cpp_info["uranium"].libdirs[0], "Qt", "qml", "UM")),
                        dst = self._site_packages.joinpath("PyQt6", "Qt6", "qml", "UM"),
                        keep_path = True)
 
@@ -445,22 +453,22 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
         ext = ".sh" if self.settings.os != "Windows" else ".ps1"
         save(self, self._script_dir.joinpath(f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env)
 
-        self._generate_cura_version(Path(self._site_packages, "cura"))
+        self._generate_cura_version(os.path.join(self._site_packages, "cura"))
 
         entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements"))
         self._generate_pyinstaller_spec(location = self._base_dir,
-                                        entrypoint_location = "'{}'".format(Path(self.cpp_info.bin_paths[0], self.conan_data["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
-                                        icon_path = "'{}'".format(Path(self.cpp_info.res_paths[2], self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
+                                        entrypoint_location = "'{}'".format(os.path.join(self.build_folder, self.cpp_info.bindirs[0], self.conan_data["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
+                                        icon_path = "'{}'".format(os.path.join(self.build_folder, self.cpp_info.resdirs[2], self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
                                         entitlements_file = entitlements_file if self.settings.os == "Macos" else "None")
 
     def package(self):
-        copy(self, "cura_app.py", src = self.source_path, dst = self.package_path.joinpath(self.cpp.package.bindirs[0]))
-        copy(self, "*", src = self.source_path.joinpath("cura"), dst = self.package_path.joinpath(self.cpp.package.libdirs[0]))
-        copy(self, "*", src = self.source_path.joinpath("resources"), dst = self.package_path.joinpath(self.cpp.package.resdirs[0]), excludes="*.po")
-        copy(self, "*", src = self.build_path.joinpath("resources"), dst = self.package_path.joinpath(self.cpp.package.resdirs[0]))
-        copy(self, "*", src = self.source_path.joinpath("plugins"), dst = self.package_path.joinpath(self.cpp.package.resdirs[1]))
-        copy(self, "requirement*.txt", src = self.source_path, dst = self.package_path.joinpath(self.cpp.package.resdirs[-1]))
-        copy(self, "*", src = self.source_path.joinpath("packaging"), dst = self.package_path.joinpath(self.cpp.package.resdirs[2]))
+        copy(self, "cura_app.py", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.bindirs[0]))
+        copy(self, "*", src = os.path.join(self.source_folder, "cura"), dst = os.path.join(self.package_folder, self.cpp.package.libdirs[0]))
+        copy(self, "*", src = os.path.join(self.source_folder, "resources"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[0]), excludes="*.po")
+        copy(self, "*", src = os.path.join(self.source_folder, "resources"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[0]))
+        copy(self, "*", src = os.path.join(self.source_folder, "plugins"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[1]))
+        copy(self, "requirement*.txt", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.resdirs[-1]))
+        copy(self, "*", src = os.path.join(self.source_folder, "packaging"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[2]))
 
     def package_info(self):
         self.user_info.pip_requirements = "requirements.txt"
@@ -468,8 +476,8 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
         self.user_info.pip_requirements_build = "requirements-dev.txt"
 
         if self.in_local_cache:
-            self.runenv_info.append_path("PYTHONPATH", str(Path(self.cpp_info.lib_paths[0]).parent))
-            self.runenv_info.append_path("PYTHONPATH", self.cpp_info.res_paths[1])  # Add plugins to PYTHONPATH
+            self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "site-packages"))
+            self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "plugins"))
         else:
             self.runenv_info.append_path("PYTHONPATH", self.source_folder)
             self.runenv_info.append_path("PYTHONPATH", os.path.join(self.source_folder, "plugins"))