summaryrefslogtreecommitdiffstats
path: root/packaging/macos/src/ink.sh
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/macos/src/ink.sh')
-rw-r--r--packaging/macos/src/ink.sh329
1 files changed, 329 insertions, 0 deletions
diff --git a/packaging/macos/src/ink.sh b/packaging/macos/src/ink.sh
new file mode 100644
index 0000000..fe4d19c
--- /dev/null
+++ b/packaging/macos/src/ink.sh
@@ -0,0 +1,329 @@
+# SPDX-FileCopyrightText: 2021 René de Hesselle <dehesselle@web.de>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+### description ################################################################
+
+# This file contains everything related to Inkscape.
+
+### shellcheck #################################################################
+
+# shellcheck shell=bash # no shebang as this file is intended to be sourced
+# shellcheck disable=SC2034 # multipe vars only used outside this script
+
+### dependencies ###############################################################
+
+# Nothing here.
+
+### variables ##################################################################
+
+#----------------------------------------------- source directory and git branch
+
+# There are 3 possible scenarios:
+#
+# 1. We're running inside Inkscape's CI:
+# The repository has already been cloned, set INK_DIR accordingly.
+#
+# 2. We're not running inside Inkscape's CI and INK_DIR has been set:
+# Use INK_DIR provided as-is, we expect the source to be there.
+#
+# 3. We're not running inside Inkscape's CI CI and INK_DIR has not been set:
+# Set INK_DIR to our default location, we'll clone the repo there.
+
+if [ "$CI_PROJECT_NAME" = "inkscape" ]; then # running in Inkscape's CI
+ INK_DIR=$CI_PROJECT_DIR
+else # not running in Inkscape's CI
+ # Use default directory if not provided.
+ if [ -z "$INK_DIR" ]; then
+ INK_DIR=$SRC_DIR/inkscape
+ fi
+
+ # Allow using a custom Inkscape repository and branch.
+ if [ -z "$INK_URL" ]; then
+ INK_URL=https://gitlab.com/inkscape/inkscape
+ fi
+
+ # Allow using a custom branch.
+ if [ -z "$INK_BRANCH" ]; then
+ INK_BRANCH=1.2.x
+ fi
+fi
+
+INK_BLD_DIR=$BLD_DIR/$(basename "$INK_DIR") # we build out-of-tree
+
+#------------------------------------------------------------------ build number
+
+INK_BUILD=${INK_BUILD:-0}
+
+#------------------------------------ Python runtime to be bundled with Inkscape
+
+# Inkscape will be bundled with its own (customized) Python 3 runtime to make
+# the core extensions work out-of-the-box.
+
+INK_PYTHON_VER_MAJOR=3
+INK_PYTHON_VER_MINOR=10
+INK_PYTHON_VER=$INK_PYTHON_VER_MAJOR.$INK_PYTHON_VER_MINOR
+INK_PYTHON_URL="https://gitlab.com/api/v4/projects/26780227/packages/generic/\
+python_macos/15/python_${INK_PYTHON_VER/./}_$(uname -m)_inkscape.tar.xz"
+INK_PYTHON_ICON_URL="https://gitlab.com/inkscape/vectors/content/-/raw/\
+5f4f4cdf/branding/projects/extensions_c1.svg"
+
+#----------------------------------- Python packages to be bundled with Inkscape
+
+# https://pypi.org/project/appdirs/
+INK_PYTHON_PKG_APPDIRS=appdirs==1.4.4
+
+# https://pypi.org/project/beautifulsoup4/
+# https://pypi.org/project/soupsieve/
+INK_PYTHON_PKG_BEAUTIFULSOUP4="\
+ beautifulsoup4==4.10.0\
+ soupsieve==2.3.1\
+"
+
+# https://pypi.org/project/CacheControl/
+# https://pypi.org/project/certifi/
+# https://pypi.org/project/charset-normalizer/
+# https://pypi.org/project/idna/
+# https://pypi.org/project/lockfile/
+# https://pypi.org/project/msgpack/
+# https://pypi.org/project/requests/
+# https://pypi.org/project/urllib3/
+INK_PYTHON_PKG_CACHECONTROL="\
+ CacheControl==0.12.10\
+ certifi==2021.10.8\
+ charset_normalizer==2.0.11\
+ idna==3.3\
+ lockfile==0.12.2\
+ msgpack==1.0.3\
+ requests==2.27.1\
+ urllib3==1.26.8\
+"
+
+# https://pypi.org/project/cssselect/
+INK_PYTHON_PKG_CSSSELECT=cssselect==1.1.0
+
+# https://pypi.org/project/lxml/
+INK_PYTHON_PKG_LXML=lxml==4.7.1
+
+# https://pypi.org/project/numpy/
+INK_PYTHON_PKG_NUMPY=https://files.pythonhosted.org/packages/\
+b4/85/8097082c4794d854e40f84639c83e33e516431faaeb9cecba39eba6921d5/\
+numpy-1.22.1-cp310-cp310-macosx_10_9_universal2.whl
+
+# https://pypi.org/project/Pillow/
+INK_PYTHON_PKG_PILLOW=Pillow==9.0.0
+
+# https://pypi.org/project/pycairo/
+# https://pypi.org/project/PyGObject/
+INK_PYTHON_PKG_PYGOBJECT="\
+ PyGObject==3.42.1\
+ pycairo==1.21.0\
+"
+
+# https://pypi.org/project/pyserial/
+INK_PYTHON_PKG_PYSERIAL=pyserial==3.5
+
+# https://pypi.org/project/scour/
+# https://pypi.org/project/six/
+INK_PYTHON_PKG_SCOUR="\
+ scour==0.38.2\
+ six==1.16.0\
+ packaging==21.3 \
+ pyparsing==3.0.7 \
+"
+
+#------------------------------------------- application bundle directory layout
+
+INK_APP_DIR=$ARTIFACT_DIR/Inkscape.app
+
+INK_APP_CON_DIR=$INK_APP_DIR/Contents
+INK_APP_RES_DIR=$INK_APP_CON_DIR/Resources
+INK_APP_FRA_DIR=$INK_APP_CON_DIR/Frameworks
+INK_APP_BIN_DIR=$INK_APP_RES_DIR/bin
+INK_APP_ETC_DIR=$INK_APP_RES_DIR/etc
+INK_APP_EXE_DIR=$INK_APP_CON_DIR/MacOS
+INK_APP_LIB_DIR=$INK_APP_RES_DIR/lib
+INK_APP_SPK_DIR=$INK_APP_LIB_DIR/python$INK_PYTHON_VER/site-packages
+
+INK_APP_PLIST=$INK_APP_CON_DIR/Info.plist
+
+### functions ##################################################################
+
+function ink_get_version
+{
+ local file=$INK_DIR/CMakeLists.txt
+ local ver_major
+ ver_major=$(grep INKSCAPE_VERSION_MAJOR "$file" | head -n 1 |
+ awk '{ print $2+0 }')
+ local ver_minor
+ ver_minor=$(grep INKSCAPE_VERSION_MINOR "$file" | head -n 1 |
+ awk '{ print $2+0 }')
+ local ver_patch
+ ver_patch=$(grep INKSCAPE_VERSION_PATCH "$file" | head -n 1 |
+ awk '{ print $2+0 }')
+ local ver_suffix
+ ver_suffix=$(grep INKSCAPE_VERSION_SUFFIX "$file" | head -n 1 |
+ awk '{ print $2 }')
+
+ ver_suffix=${ver_suffix%\"*} # remove "double quotes and all" from end
+ ver_suffix=${ver_suffix#\"} # remove "double quote" from beginning
+
+ echo "$ver_major.$ver_minor.$ver_patch$ver_suffix"
+}
+
+function ink_get_repo_shorthash
+{
+ # do it the same way as in CMakeScripts/inkscape-version.cmake
+ git -C "$INK_DIR" rev-parse --short HEAD
+}
+
+function ink_pipinstall
+{
+ local packages=$1 # name of variable that resolves to list of packages
+ local options=$2 # optional
+
+ # turn package names into filenames of our wheels
+ local wheels
+ for package in $(eval echo \$"$packages"); do
+ if [ "${package::8}" = "https://" ]; then
+ package=$(basename "$package")
+ else
+ package=$(eval echo "${package/==/-}"*.whl)
+ fi
+
+ # If present in TMP_DIR, use that. This is how the externally built
+ # packages can be fed into this.
+ if [ -f "$TMP_DIR/$package" ]; then
+ wheels="$wheels $TMP_DIR/$package"
+ else
+ wheels="$wheels $PKG_DIR/$package"
+ fi
+ done
+
+ local path_original=$PATH
+ export PATH=$INK_APP_FRA_DIR/Python.framework/Versions/Current/bin:$PATH
+
+ # shellcheck disable=SC2086 # we need word splitting here
+ pip$INK_PYTHON_VER_MAJOR install \
+ --prefix "$INK_APP_RES_DIR" \
+ --ignore-installed \
+ $options \
+ $wheels
+
+ export PATH=$path_original
+
+ local ink_pipinstall_func
+ ink_pipinstall_func=ink_pipinstall_$(echo "${packages##*_}" |
+ tr "[:upper:]" "[:lower:]")
+
+ if declare -F "$ink_pipinstall_func" > /dev/null; then
+ $ink_pipinstall_func
+ fi
+}
+
+function ink_pipinstall_lxml
+{
+ lib_change_paths \
+ @loader_path/../../.. \
+ "$INK_APP_LIB_DIR" \
+ "$INK_APP_SPK_DIR"/lxml/etree.cpython-"${INK_PYTHON_VER/./}"-darwin.so \
+ "$INK_APP_SPK_DIR"/lxml/objectify.cpython-"${INK_PYTHON_VER/./}"-darwin.so
+}
+
+function ink_pipinstall_numpy
+{
+ sed -i '' '1s|.*|#!/usr/bin/env python'"$INK_PYTHON_VER_MAJOR"'|' \
+ "$INK_APP_BIN_DIR"/f2py
+ sed -i '' '1s|.*|#!/usr/bin/env python'"$INK_PYTHON_VER_MAJOR"'|' \
+ "$INK_APP_BIN_DIR"/f2py$INK_PYTHON_VER_MAJOR
+ sed -i '' '1s|.*|#!/usr/bin/env python'"$INK_PYTHON_VER_MAJOR"'|' \
+ "$INK_APP_BIN_DIR"/f2py$INK_PYTHON_VER
+
+ find "$INK_APP_LIB_DIR/python$INK_PYTHON_VER/site-packages/numpy" \
+ '(' -name "*.so" -o -name "*.dylib" ')' \
+ -exec codesign --remove-signature {} \;
+
+ find "$INK_APP_LIB_DIR/python$INK_PYTHON_VER/site-packages/numpy" \
+ -name "*.a" -delete
+}
+
+function ink_pipinstall_pygobject
+{
+ lib_change_paths \
+ @loader_path/../../.. \
+ "$INK_APP_LIB_DIR" \
+ "$INK_APP_SPK_DIR"/gi/_gi.cpython-"${INK_PYTHON_VER/./}"-darwin.so \
+ "$INK_APP_SPK_DIR"/gi/_gi_cairo.cpython-"${INK_PYTHON_VER/./}"-darwin.so \
+ "$INK_APP_SPK_DIR"/cairo/_cairo.cpython-"${INK_PYTHON_VER/./}"-darwin.so
+}
+
+function ink_pipinstall_pyserial
+{
+ find "$INK_APP_SPK_DIR"/serial -type f -name "*.pyc" -exec rm {} \;
+ sed -i '' '1s|.*|#!/usr/bin/env python3|' \
+ "$INK_APP_BIN_DIR"/pyserial-miniterm
+ sed -i '' '1s|.*|#!/usr/bin/env python3|' "$INK_APP_BIN_DIR"/pyserial-ports
+}
+
+function ink_pipinstall_scour
+{
+ sed -i '' '1s|.*|#!/usr/bin/env python3|' "$INK_APP_BIN_DIR"/scour
+}
+
+function ink_download_python
+{
+ curl -o "$PKG_DIR"/"$(basename "${INK_PYTHON_URL%\?*}")" -L "$INK_PYTHON_URL"
+ curl -o "$PKG_DIR"/"$(basename "$INK_PYTHON_ICON_URL")" \
+ -L "$INK_PYTHON_ICON_URL"
+}
+
+function ink_install_python
+{
+ mkdir "$INK_APP_FRA_DIR"
+ tar -C "$INK_APP_FRA_DIR" -xf "$PKG_DIR"/"$(basename "${INK_PYTHON_URL%\?*}")"
+
+ # link it to INK_APP_BIN_DIR so it'll be in PATH for the app
+ mkdir -p "$INK_APP_BIN_DIR"
+ # shellcheck disable=SC2086 # it's an integer
+ ln -sf ../../Frameworks/Python.framework/Versions/Current/bin/\
+python$INK_PYTHON_VER_MAJOR "$INK_APP_BIN_DIR"
+
+ # create '.pth' file inside Framework to include our site-packages directory
+ # shellcheck disable=SC2086 # it's an integer
+ echo "../../../../../../../Resources/lib/python$INK_PYTHON_VER/site-packages"\
+ > "$INK_APP_FRA_DIR"/Python.framework/Versions/Current/lib/\
+python$INK_PYTHON_VER/site-packages/inkscape.pth
+
+ # use custom icon for Python.app
+ svg2icns \
+ "$PKG_DIR/$(basename "$INK_PYTHON_ICON_URL")" \
+ "$INK_APP_FRA_DIR/Python.framework/Resources/Python.app/Contents/\
+Resources/PythonInterpreter.icns" \
+ 8
+}
+
+function ink_build_wheels
+{
+ jhb run pip3 install wheel
+
+ for package_set in ${!INK_PYTHON_PKG_*}; do
+ local packages
+ for package in $(eval echo \$"$package_set"); do
+ if [ "${package::8}" = "https://" ]; then
+ curl -L -o "$PKG_DIR/$(basename "$package")" "$package"
+ else
+ packages="$packages $package"
+ fi
+ done
+
+ if [ -n "$packages" ]; then
+ # shellcheck disable=SC2086 # we need word splitting here
+ jhb run pip3 wheel --no-binary :all: $packages -w "$PKG_DIR"
+ packages=""
+ fi
+ done
+}
+
+### main #######################################################################
+
+# Nothing here.