Skip to content
This repository has been archived by the owner on Dec 9, 2022. It is now read-only.

Support Python 3.8 next to 3.7 and 3.5 #244

Open
wants to merge 1 commit into
base: WIP_py3.7
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -116,22 +116,28 @@ if(BUILD_PACKAGE)
add_custom_target(packaging ALL DEPENDS projects COMMENT "Packaging Projects...")

if(BUILD_OS_WINDOWS)
if(${Python3_VERSION} VERSION_LESS 3.7)
include(packaging/windows.cmake)
else()
if(${Python3_VERSION} VERSION_GREATER_EQUAL 3.8)
include(packaging/python3.8/windows.cmake)
elseif(${Python3_VERSION} VERSION_GREATER_EQUAL 3.7)
include(packaging/python3.7/windows.cmake)
else()
include(packaging/windows.cmake)
endif()
elseif(BUILD_OS_OSX)
if(${Python3_VERSION} VERSION_LESS 3.7)
include(packaging/osx.cmake)
else()
if(${Python3_VERSION} VERSION_GREATER_EQUAL 3.8)
include(packaging/python3.8/osx.cmake)
elseif(${Python3_VERSION} VERSION_GREATER_EQUAL 3.7)
include(packaging/python3.7/osx.cmake)
else()
include(packaging/osx.cmake)
endif()
elseif(BUILD_OS_LINUX)
if(${Python3_VERSION} VERSION_LESS 3.7)
include(packaging/linux.cmake)
else()
if(${Python3_VERSION} VERSION_GREATER_EQUAL 3.8)
include(packaging/python3.8/linux.cmake)
elseif(${Python3_VERSION} VERSION_GREATER_EQUAL 3.7)
include(packaging/python3.7/linux.cmake)
else()
include(packaging/linux.cmake)
endif()
else()
message(STATUS "Do not know how to build an executable for the current platform! You will have to create it manually.")
Expand Down
2 changes: 1 addition & 1 deletion packaging/osx.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
find_package(cx_freeze 5.0 REQUIRED)
find_package(cx_Freeze 5.0 REQUIRED)

configure_file(${CMAKE_CURRENT_LIST_DIR}/setup_osx.py.in setup.py @ONLY)
configure_file(${CMAKE_CURRENT_LIST_DIR}/Info.plist.in Info.plist @ONLY)
Expand Down
2 changes: 1 addition & 1 deletion packaging/python3.7/osx.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
find_package(cx_freeze 5.0 REQUIRED)
find_package(cx_Freeze 5.0 REQUIRED)

configure_file(${CMAKE_CURRENT_LIST_DIR}/setup_osx.py.in setup.py @ONLY)
configure_file(${CMAKE_CURRENT_LIST_DIR}/../Info.plist.in Info.plist @ONLY)
Expand Down
2 changes: 1 addition & 1 deletion packaging/python3.7/windows.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
find_package(cx_freeze 5.0 REQUIRED)
find_package(cx_Freeze 5.0 REQUIRED)

configure_file(${CMAKE_CURRENT_LIST_DIR}/setup_win32.py.in setup.py @ONLY)
add_custom_target(build_bundle)
Expand Down
14 changes: 14 additions & 0 deletions packaging/python3.8/cura.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

scriptdir="$(dirname $0)"

export PYTHONPATH=$scriptdir/../lib
#export QT_PLUGIN_PATH=$scriptdir/qt/plugins
export QML2_IMPORT_PATH=$scriptdir/../lib/UM/Qt/qml
#export QT_QPA_FONTDIR=/usr/share/fonts
#export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb

# Use the openssl.cnf packaged in the AppImage
#export OPENSSL_CONF=$scriptdir/openssl.cnf

"$scriptdir/../cura" "$@"
82 changes: 82 additions & 0 deletions packaging/python3.8/linux.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
find_package(cx_Freeze 5.0 REQUIRED)
find_package(AppImageKit REQUIRED)

configure_file(${CMAKE_CURRENT_LIST_DIR}/setup_linux.py.in setup.py @ONLY)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/package
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Cleaning old package directory..."
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND env "LD_LIBRARY_PATH=${CMAKE_PREFIX_PATH}/lib" ${Python3_EXECUTABLE} setup.py build
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running cx_Freeze to generate executable..."
)

set(PACKAGE_DIR ${CMAKE_BINARY_DIR}/package)

configure_file(${CMAKE_CURRENT_LIST_DIR}/../cura.desktop.in ${CMAKE_CURRENT_LIST_DIR}/../cura.desktop @ONLY)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND mkdir -p ${PACKAGE_DIR}/usr/share/applications/
COMMAND ${CMAKE_COMMAND} -E copy ../cura.desktop ${PACKAGE_DIR}/usr/share/applications/cura.desktop
COMMAND ln -s -r ${PACKAGE_DIR}/usr/share/applications/cura.desktop ${PACKAGE_DIR}/cura.desktop
COMMENT "Copying desktop file ..."
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ../cura-icon_256x256.png ${PACKAGE_DIR}/cura-icon.png
COMMAND mkdir -p ${PACKAGE_DIR}/usr/share/icons/hicolor/64x64/apps/
COMMAND ${CMAKE_COMMAND} -E copy ../cura-icon_64x64.png ${PACKAGE_DIR}/usr/share/icons/hicolor/64x64/apps/cura-icon.png
COMMAND mkdir -p ${PACKAGE_DIR}/usr/share/icons/hicolor/128x128/apps/
COMMAND ${CMAKE_COMMAND} -E copy ../cura-icon_128x128.png ${PACKAGE_DIR}/usr/share/icons/hicolor/128x128/apps/cura-icon.png
COMMAND mkdir -p ${PACKAGE_DIR}/usr/share/icons/hicolor/256x256/apps/
COMMAND ${CMAKE_COMMAND} -E copy ../cura-icon_256x256.png ${PACKAGE_DIR}/usr/share/icons/hicolor/256x256/apps/cura-icon.png
COMMENT "Copying icon files ..."
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND mkdir -p ${PACKAGE_DIR}/usr/bin/
COMMAND ${CMAKE_COMMAND} -E copy cura.sh ${PACKAGE_DIR}/usr/bin/
COMMENT "Copying shell script..."
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND ${CMAKE_CURRENT_LIST_DIR}/../linux_mod_rpath.sh ${PACKAGE_DIR}/usr/bin
COMMENT "Modify RPATH for ELFs..."
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND mkdir -p ${PACKAGE_DIR}/usr/share/metainfo/
COMMAND ${CMAKE_COMMAND} -E copy ../cura.appdata.xml ${PACKAGE_DIR}/usr/share/metainfo/
COMMENT "Installing AppStream metadata..."
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

add_custom_command(
TARGET packaging PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${APPIMAGEKIT_APPRUN_EXECUTABLE} ${PACKAGE_DIR}
COMMENT "Copying AppRun executable..."
)

set(APPIMAGE_FILENAME "Cura-${CURA_VERSION}.AppImage")

add_custom_command(
TARGET packaging POST_BUILD
COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/${APPIMAGE_FILENAME}
COMMAND ${APPIMAGEKIT_APPIMAGETOOL_EXECUTABLE} --appimage-extract-and-run ${CMAKE_BINARY_DIR}/package ${APPIMAGE_FILENAME}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
11 changes: 11 additions & 0 deletions packaging/python3.8/osx.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
find_package(cx_Freeze 5.0 REQUIRED)

configure_file(${CMAKE_CURRENT_LIST_DIR}/setup_osx.py.in setup.py @ONLY)
configure_file(${CMAKE_CURRENT_LIST_DIR}/../Info.plist.in Info.plist @ONLY)

add_custom_command(
TARGET packaging POST_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/build
COMMAND ${Python3_EXECUTABLE} setup.py bdist_mac
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
158 changes: 158 additions & 0 deletions packaging/python3.8/setup_linux.py.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import sys
import os.path

from cx_Freeze import setup, Executable, hooks

def load_scipy(finder, module):
finder.IncludePackage("scipy._lib")
finder.IncludePackage("scipy.misc")
finder.IncludePackage("scipy.sparse.csgraph._validation")
finder.IncludePackage("scipy.sparse._csparsetools")

hooks.load_scipy = load_scipy

def load_pyqt5_qtgui(finder, module):
finder.IncludeModule("PyQt5.QtCore")

hooks.load_PyQt5_QtGui = load_pyqt5_qtgui

def load_pyqt5_qtquick(finder, module):
finder.IncludeModule("PyQt5.QtCore")
finder.IncludeModule("PyQt5.QtGui")
finder.IncludeModule("PyQt5.QtQml")
finder.IncludeModule("PyQt5.QtNetwork")
finder.IncludeModule("PyQt5.QtWebSockets")
finder.IncludeModule("PyQt5._QOpenGLFunctions_2_0")
finder.IncludeModule("PyQt5._QOpenGLFunctions_4_1_Core")

hooks.load_PyQt5_QtQuick = load_pyqt5_qtquick

search_path = sys.path.copy()
if os.path.exists("/etc/debian_version"):
python_externalproject_dir = "@EXTERNALPROJECT_INSTALL_PREFIX@/lib/python3/dist-packages/"
python_install_dir = "@CMAKE_INSTALL_PREFIX@/lib/python3/dist-packages/"
else:
python_externalproject_dir = "@EXTERNALPROJECT_INSTALL_PREFIX@/lib/python3.8/site-packages/"
python_install_dir = "@CMAKE_INSTALL_PREFIX@/lib/python3.8/site-packages/"
search_path.insert(1, python_externalproject_dir)
search_path.insert(2, python_install_dir)

# Dependencies are automatically detected, but it might need
# fine tuning.
build_options = {
"build_exe": "package/usr",
"path": search_path,
"packages": [
"appdirs",
"packaging",
"cryptography",
"xml.etree",
"uuid",
"UM",
"cura",
"zeroconf",
"pkg_resources",
"requests",
"idna",
"stl",
"serial",
"shapely",
"networkx",
"trimesh",
"Savitar",
"Charon",
"logging",
"logging.config",
"logging.handlers",
],
"include_files": [
("@EXTERNALPROJECT_INSTALL_PREFIX@/bin/CuraEngine", "bin/CuraEngine"),
("@EXTERNALPROJECT_INSTALL_PREFIX@/lib/cura/plugins", "share/cura/plugins"),
("@EXTERNALPROJECT_INSTALL_PREFIX@/lib/uranium/plugins", "share/uranium/plugins"),
(os.path.join(python_externalproject_dir, "UM/Qt/qml/UM"), "share/uranium/resources/qml/UM"),
("@EXTERNALPROJECT_INSTALL_PREFIX@/share/cura/resources", "share/cura/resources"),
("@EXTERNALPROJECT_INSTALL_PREFIX@/share/uranium/resources", "share/uranium/resources"),
("@CMAKE_PREFIX_PATH@/lib/libprotobuf.so.3.9.2.0", "lib/libprotobuf.so.3.9.2.0"),
("@CMAKE_PREFIX_PATH@/lib/libArcus.so.3", "lib/libArcus.so.3"),
("@CMAKE_PREFIX_PATH@/lib/libSavitar.so.0", "lib/libSavitar.so.0"),
],

# Known issue, see https://github.com/numpy/numpy/issues/13248
# If "optimize" is set to 2, the packaged Cura will raise the following exception when it runs:
# """ TypeError: add_docstring() argument 2 must be str, not None """
# Setting "optimize" to 0 is a workaround.
"optimize": 0,

"bin_path_includes": [
"@CMAKE_PREFIX_PATH@/lib",
"/lib",
"/usr/lib",
"/usr/lib/x86_64-linux-gnu",
"/usr/local/lib",
],
"bin_includes": [
"libopenctm.so.1.0.3",
],
"bin_excludes": [
"linux-vdso.so.1",
"libpthread.so.0",
"libdl.so.2",
"librt.so.1",
"libstdc++.so.6",
"libm.so.6",
"libgcc_s.so.1",
"libc.so.6",
"ld-linux-x86-64.so.2",
"libz.so.1",
"libgcc_s.so.1",
"libglib-2.0",
"librt.so.1",
"libcap.so.2",
"libGL.so.1",
"libGLX.so.0",
"libGLdispatch.so.0",
"libglapi.so.0",
"libXext.so.6",
"libXdamage.so.1",
"libXfixes.so.3",
"libX11-xcb.so.1",
"libX11.so.6",
"libxcb-glx.so.0",
"libxcb-dri2.so.0",
"libxcb.so.1",
"libXxf86vm.so.1",
"libdrm.so.2",
"libexpat.so.1",
"libXau.so.6",
"libglib-2.0.so.0",
"libgssapi_krb5.so.",
"libgthread-2.0.so.0",
"libk5crypto.so.3",
"libkeyutils.so.1",
"libkrb5.so.3",
"libkrb5support.so.0",
"libresolv.so.2",
"libutil.so.1",
"libXrender.so.1",
"libcom_err.so.2",
"libgssapi_krb5.so.2",
]
}

base = "Win32GUI" if sys.platform == "win32" else None

executables = [
Executable(os.path.join("@EXTERNALPROJECT_INSTALL_PREFIX@", "bin", "cura"), base = base)
]

setup(
name = "Ultimaker Cura",
version = "@CURA_MAJOR_VERSION@.@CURA_MINOR_VERSION@.@CURA_PATCH_VERSION@",
author = "Ultimaker B.V.",
url="http://software.ultimaker.com/",
description = "3D Slicer Software",
license="GNU LESSER GENERAL PUBLIC LICENSE (LGPL)",

options = { "build_exe": build_options },
executables = executables
)
Loading