#!/bin/bash # # An easy way to set up a virtualenv. # # Source this file to work inside this venv: # # source ./venv [-f] # # Call `./venv -f` to force a new development installation. # SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # If on Macos with brew, make sure we can find the brewed libffi (which is not "linked"): printf "Are we on Macos with Homebrew installed? " uname -a | grep -q Darwin && brew --version >/dev/null 2>&1 && { echo "Yes" libffi_path="$(brew ls libffi | grep pkgconfig | xargs dirname)" echo "Adding libffi pkg-config path ${libffi_path} to \$PKG_CONFIG_PATH" export PKG_CONFIG_PATH="${libffi_path}:${PKG_CONFIG_PATH:-}" } || echo "No" printf "Are we on MSys (Windows)? " uname -a | grep -q MSYS_NT && { echo "Yes" export PKG_CONFIG_PATH="/mingw64/lib/pkgconfig:${PKG_CONFIG_PATH:-}" export PATH="/mingw64/bin:${PATH}" } || echo "No" # shellcheck disable=SC1091,SC1090 ( # Do the whole installation process in a sub-shell, so we can safely fail when # this file is sourced in the parent shell. set -euo pipefail check() { echo Checking: "$@" "$@" >/dev/null 2>&1 } NO_FORCE_INSTALL=true while getopts 'fSh' OPTION do case "$OPTION" in f) NO_FORCE_INSTALL=false ;; S) VENV_OPTS="--system-site-packages" ;; h) echo "Usage: $0 [-f] [-S] [-h] # -f = force install, -S = Use system site packages, -h = this message" exit 0 ;; *) echo "usage: $0 [-f] [-S] [-h]" >&2 exit 1 ;; esac done check python3 --version || { echo "==> Python 3.x not found" exit 1 } check pkg-config --print-errors --exists 'gobject-introspection-1.0 >= 1.46.0' || { echo "==> GObject-Introspection not found, Please check above errors and correct them" exit 1 } PYTHON_VER="$(python3 --version | sed 's/^Python \([0-9]\.[0-9]\).[0-9]$/\1/')" test -d "$SCRIPT_DIR"/.venv || { echo "Setting up a virtual env for Gaphor..." python3 -m venv --prompt Gaphor ${VENV_OPTS:-} "$SCRIPT_DIR"/.venv } # shellcheck source=.venv/bin/activate source "$SCRIPT_DIR"/.venv/bin/activate { ${NO_FORCE_INSTALL} && test -f "$SCRIPT_DIR"/.venv/lib/python"${PYTHON_VER}"/site-packages/gaphor.egg-link; } || { echo "Installing Gaphor in the virtualenv..." pip install --upgrade poetry==1.0.10 poetry install } test_module() { python3 -c "$1" 2>&- || { echo "$2" echo echo "The Command used to test this:" echo echo " >>> $1" echo echo "Please read the installation instructions on https://gaphor.readthedocs.io." exit 1 } } test_module \ "import gi" \ "PyGobject3 (gobject-introspection) can not be loaded." test_module \ "from gi.repository import Gtk" \ "Gtk3 is not installed in a way it can be loaded in Python." test_module \ "import gaphor.UML" \ "Gaphor was not installed properly. Please open an issue on GitHub." ) && source "$SCRIPT_DIR"/.venv/bin/activate