947 lines
27 KiB
Bash
947 lines
27 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
##############################################################
|
|
# Title : IMEI - ImageMagick Easy Install #
|
|
# Description : ImageMagick® for Debian/Ubuntu, #
|
|
# including advanced delegate support. #
|
|
# #
|
|
# Author : Sascha Greuel <hello@1-2.dev> #
|
|
# Date : 2022-01-26 14:25 #
|
|
# License : ISC #
|
|
# Version : 6.6.0 #
|
|
# #
|
|
# Usage : bash ./imei.sh #
|
|
##############################################################
|
|
|
|
######################
|
|
# Check requirements #
|
|
######################
|
|
|
|
# Check if user is root
|
|
[ "$(id -u)" != "0" ] && {
|
|
echo "Error: You must be root or use sudo to run this script"
|
|
exit 1
|
|
}
|
|
|
|
command_exists() {
|
|
command -v "$@" > /dev/null 2>&1
|
|
}
|
|
|
|
# Make sure, that we are on Debian or Ubuntu
|
|
if ! command_exists apt-get; then
|
|
echo "This script cannot run on any other system than Debian or Ubuntu"
|
|
exit 1
|
|
fi
|
|
|
|
# Checking if lsb_release is installed or install it
|
|
if ! command_exists lsb_release; then
|
|
apt-get update && apt-get install -qq lsb-release > /dev/null 2>&1
|
|
fi
|
|
|
|
####################
|
|
# Script arguments #
|
|
####################
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
--force)
|
|
FORCE="yes"
|
|
;;
|
|
--force-imagemagick|--force-im)
|
|
FORCE_IMAGEMAGICK=$2
|
|
;;
|
|
--imagemagick-version|--im-version)
|
|
IMAGEMAGICK_VER=$2
|
|
;;
|
|
--imagemagick-quantum-depth|--im-q)
|
|
QUANTUM_DEPTH=$2
|
|
;;
|
|
--skip-aom)
|
|
SKIP_AOM="yes"
|
|
;;
|
|
--aom-version)
|
|
AOM_VER=$2
|
|
;;
|
|
--skip-libheif|--skip-heif)
|
|
SKIP_LIBHEIF="yes"
|
|
;;
|
|
--libheif-version|--heif-version)
|
|
LIBHEIF_VER=$2
|
|
;;
|
|
--skip-jpeg-xl|--skip-jxl)
|
|
SKIP_JXL="yes"
|
|
;;
|
|
--jpeg-xl-version|--jxl-version)
|
|
JXL_VER=$2
|
|
;;
|
|
--skip-dependencies|--skip-deps)
|
|
SKIP_DEPS="yes"
|
|
;;
|
|
--log-file)
|
|
LOG_FILE=$2
|
|
;;
|
|
--work-dir)
|
|
WORK_DIR=$2
|
|
;;
|
|
--build-dir)
|
|
BUILD_DIR=$2
|
|
;;
|
|
--config-dir)
|
|
CONFIG_DIR=$2
|
|
;;
|
|
--ci)
|
|
CI_BUILD="yes"
|
|
;;
|
|
--no-sig-verify|--dev)
|
|
VERIFY_SIGNATURE="${CYELLOW}disabled${CEND}"
|
|
;;
|
|
--use-checkinstall|--checkinstall)
|
|
CHECKINSTALL="yes"
|
|
;;
|
|
--no-backports)
|
|
BACKPORTS="${CYELLOW}disabled${CEND}"
|
|
;;
|
|
*) ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
#############
|
|
# Variables #
|
|
#############
|
|
|
|
if [ -z "$WORK_DIR" ]; then
|
|
WORK_DIR=/usr/local/src/imei
|
|
elif [ -d "$WORK_DIR" ] && [ "$(ls -A $WORK_DIR)" ]; then
|
|
echo -e "${CRED}Work Dir $WORK_DIR is not empty!${CEND}" >&2
|
|
return 1
|
|
fi
|
|
|
|
if [ -z "$BUILD_DIR" ]; then
|
|
BUILD_DIR=/usr/local
|
|
fi
|
|
|
|
if [ -z "$CONFIG_DIR" ]; then
|
|
CONFIG_DIR="$BUILD_DIR/etc"
|
|
fi
|
|
|
|
if [ -z "$LOG_FILE" ]; then
|
|
LOG_FILE=/var/log/imei.log
|
|
fi
|
|
|
|
allowedQuantumDepth=(8 16 32)
|
|
if [[ -z "$QUANTUM_DEPTH" || ! " ${allowedQuantumDepth[*]} " =~ $QUANTUM_DEPTH ]]; then
|
|
QUANTUM_DEPTH=16
|
|
fi
|
|
|
|
START=$(date +%s)
|
|
OS_DISTRO="$(lsb_release -ds)"
|
|
OS_SHORT_CODENAME="$(lsb_release -sc)"
|
|
OS_ARCH="$(uname -m)"
|
|
GH_FILE_BASE="https://codeload.github.com"
|
|
SOURCE_LIST="/etc/apt/sources.list.d/imei.list"
|
|
LIB_DIR="/usr/local"
|
|
CMAKE_VERSION=""
|
|
|
|
# Colors
|
|
CSI='\033['
|
|
CRED="${CSI}1;31m"
|
|
CGREEN="${CSI}1;32m"
|
|
CYELLOW="${CSI}1;33m"
|
|
CBLUE="${CSI}1;36m"
|
|
CEND="${CSI}0m"
|
|
|
|
####################
|
|
# Helper functions #
|
|
####################
|
|
|
|
displaytime() {
|
|
local T=$1
|
|
local D=$((T / 60 / 60 / 24))
|
|
local H=$((T / 60 / 60 % 24))
|
|
local M=$((T / 60 % 60))
|
|
local S=$((T % 60))
|
|
|
|
((D > 0)) && printf '%d days ' $D
|
|
((H > 0)) && printf '%d hours ' $H
|
|
((M > 0)) && printf '%d minutes ' $M
|
|
((D > 0 || H > 0 || M > 0)) && printf 'and '
|
|
|
|
printf '%d seconds\n' $S
|
|
}
|
|
|
|
str_repeat() {
|
|
printf -v v "%-*s" "$1" ""
|
|
echo "${v// /$2}"
|
|
}
|
|
|
|
version() {
|
|
echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'
|
|
}
|
|
|
|
cleanup() {
|
|
if [ -d "$WORK_DIR" ]; then
|
|
rm -rf "$WORK_DIR"
|
|
fi
|
|
|
|
if [ -f "$SOURCE_LIST" ]; then
|
|
rm "$SOURCE_LIST"
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
getClient() {
|
|
if command -v curl &> /dev/null; then
|
|
CLIENT="curl"
|
|
elif command -v wget &> /dev/null; then
|
|
CLIENT="wget"
|
|
elif command -v http &> /dev/null; then
|
|
CLIENT="httpie"
|
|
else
|
|
echo -e "${CRED}This tool requires either curl, wget or httpie to be installed.${CEND}" >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
httpGet() {
|
|
if [[ -n "${GITHUB_TOKEN}" ]]; then
|
|
AUTHORIZATION='{"Authorization": "Bearer '"$GITHUB_TOKEN"'}"}'
|
|
fi
|
|
|
|
case "$CLIENT" in
|
|
curl) curl -A curl -s -H "$AUTHORIZATION" "$@" ;;
|
|
wget) wget -qO- --header="$AUTHORIZATION" "$@" ;;
|
|
httpie) http -b GET "$@" "$AUTHORIZATION" ;;
|
|
esac
|
|
}
|
|
|
|
getImeiInfo() {
|
|
local IMEI_INFO
|
|
|
|
if ! command_exists jq; then
|
|
apt-get update && apt-get install -qq jq > /dev/null 2>&1
|
|
fi
|
|
|
|
IMEI_INFO=$(httpGet "https://api.github.com/repos/SoftCreatR/imei/tags")
|
|
|
|
IMEI_LATEST_VERSION_COMMIT=$(echo "$IMEI_INFO" | jq -r '.[0].commit.sha')
|
|
IMEI_LATEST_VERSION_NAME=$(echo "$IMEI_INFO" | jq -r '.[0].name')
|
|
}
|
|
|
|
########
|
|
# Init #
|
|
########
|
|
|
|
# Display execution time and clean up on exit
|
|
trap cleanup 0 1 2 3 6 15
|
|
|
|
# Clean up on execution
|
|
cleanup
|
|
|
|
if [ -f "$LOG_FILE" ]; then
|
|
rm "$LOG_FILE"
|
|
fi
|
|
|
|
# Create working directory
|
|
[ ! -d "$WORK_DIR" ] && mkdir -p "$WORK_DIR"
|
|
|
|
# Check if working directory was created
|
|
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
|
|
echo -e "${CRED}Could not create temp directory $WORK_DIR${CEND}"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$CLIENT" ]; then
|
|
getClient || exit 1
|
|
fi
|
|
|
|
if [ -z "$IMEI_LATEST_VERSION_NAME" ]; then
|
|
getImeiInfo || exit 1
|
|
fi
|
|
|
|
###################
|
|
# Integrity check #
|
|
###################
|
|
|
|
if [ -z "$CI_BUILD" ] && [ -z "$VERIFY_SIGNATURE" ] && [ -f "$0" ]; then
|
|
SIGNATURE_FILE="/tmp/imei.sh.sig"
|
|
PUBLIC_KEY_FILE="/tmp/imei.sh.pem"
|
|
|
|
sigCleanup() {
|
|
if [ -f "$SIGNATURE_FILE" ]; then
|
|
rm "$SIGNATURE_FILE"
|
|
fi
|
|
|
|
if [ -f "$PUBLIC_KEY_FILE" ]; then
|
|
rm "$PUBLIC_KEY_FILE"
|
|
fi
|
|
}
|
|
|
|
# Install OpenSSL, if it's not already installed
|
|
if ! command_exists openssl; then
|
|
apt-get update && apt-get install -qq openssl > /dev/null 2>&1
|
|
fi
|
|
|
|
if {
|
|
httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/$IMEI_LATEST_VERSION_COMMIT/imei.sh.sig" > "$SIGNATURE_FILE"
|
|
|
|
if [ ! -f "$PUBLIC_KEY_FILE" ]; then
|
|
httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/$IMEI_LATEST_VERSION_COMMIT/imei.sh.pem" > "$PUBLIC_KEY_FILE"
|
|
fi
|
|
|
|
openssl dgst -sha512 -verify "$PUBLIC_KEY_FILE" -signature "$SIGNATURE_FILE" "$0"
|
|
} >> "$LOG_FILE" 2>&1; then
|
|
sigCleanup
|
|
|
|
echo -ne "\ec"
|
|
else
|
|
sigCleanup
|
|
|
|
echo -ne "\ec"
|
|
|
|
echo -e " ${CRED}Signature verification failed!${CEND}"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
##################
|
|
# Version checks #
|
|
##################
|
|
|
|
if [ -f "$0" ]; then
|
|
INSTALLER_VER=$(grep -oP 'Version\s+:\s+\K([\d\.]+)' "$0")
|
|
INSTALLER_LATEST_VER="$IMEI_LATEST_VERSION_NAME"
|
|
fi
|
|
|
|
if [ -z "$IMAGEMAGICK_VER" ]; then
|
|
IMAGEMAGICK_VER=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/imagemagick.version")
|
|
IMAGEMAGICK_HASH=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/imagemagick.hash")
|
|
fi
|
|
|
|
if [ -z "$AOM_VER" ]; then
|
|
AOM_VER=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/aom.version")
|
|
AOM_HASH=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/aom.hash")
|
|
fi
|
|
|
|
if [ -z "$LIBHEIF_VER" ]; then
|
|
LIBHEIF_VER=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/libheif.version")
|
|
LIBHEIF_HASH=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/libheif.hash")
|
|
fi
|
|
|
|
if [ -z "$JXL_VER" ]; then
|
|
JXL_VER=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/libjxl.version")
|
|
JXL_HASH=$(httpGet "https://raw.githubusercontent.com/SoftCreatR/imei/main/versions/libjxl.hash")
|
|
fi
|
|
|
|
# Make sure, that a version number for ImageMagick has been set
|
|
if [ -z "$IMAGEMAGICK_VER" ]; then
|
|
echo -e "${CRED}Unable to determine version number for ImageMagick${CEND}"
|
|
|
|
exit 1
|
|
fi
|
|
|
|
# Make sure, that a version number for aom has been set
|
|
if [ -z "$AOM_VER" ]; then
|
|
echo -e "${CRED}Unable to determine version number for aom${CEND}"
|
|
|
|
exit 1
|
|
fi
|
|
|
|
# Make sure, that a version number for libheif has been set
|
|
if [ -z "$LIBHEIF_VER" ]; then
|
|
echo -e "${CRED}Unable to determine version number for libheif${CEND}"
|
|
|
|
exit 1
|
|
fi
|
|
|
|
# Make sure, that a version number for JPEG XL has been set
|
|
if [ -z "$JXL_VER" ]; then
|
|
echo -e "${CRED}Unable to determine version number for JPEG XL${CEND}"
|
|
|
|
exit 1
|
|
fi
|
|
|
|
if command_exists magick; then
|
|
INSTALLED_IMAGEMAGICK_VER=$(magick -version | grep -oP 'Version: ImageMagick \K([\d\.\-]+)')
|
|
fi
|
|
|
|
if [ -L "$LIB_DIR/lib/libaom.so" ]; then
|
|
INSTALLED_AOM_VER=$(readlink -f "$LIB_DIR/lib/libaom.so" | xargs basename | grep -oP 'libaom.so.\K([\d\.]+)')
|
|
fi
|
|
|
|
if [ -L "$LIB_DIR/lib/libheif.so" ]; then
|
|
INSTALLED_LIBHEIF_VER=$(readlink -f "$LIB_DIR/lib/libheif.so" | xargs basename | grep -oP 'libheif.so.\K([\d\.]+)')
|
|
fi
|
|
|
|
if [ -L "$LIB_DIR/lib/libjxl.so" ]; then
|
|
INSTALLED_JXL_VER=$(readlink -f "$LIB_DIR/lib/libjxl.so" | xargs basename | grep -oP 'libjxl.so.\K([\d\.]+)')
|
|
fi
|
|
|
|
#######################
|
|
# Installer functions #
|
|
#######################
|
|
|
|
# Speed up the compilation process
|
|
NUM_CORES=$(nproc || echo 1)
|
|
export CC=gcc CXX=g++ MAKEFLAGS="-j$((NUM_CORES + 1)) -l${NUM_CORES}"
|
|
|
|
# Build dependencies
|
|
install_deps() {
|
|
echo -ne ' Installing dependencies [..]\r'
|
|
|
|
if [ -n "$SKIP_DEPS" ]; then
|
|
echo -ne " Installing dependencies [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
if {
|
|
if [ -f "$SOURCE_LIST" ]; then
|
|
rm "$SOURCE_LIST"
|
|
fi
|
|
|
|
# Allow installation of source files
|
|
{
|
|
if [[ "${OS_DISTRO,,}" == *"ubuntu"* ]]; then
|
|
echo 'deb http://archive.ubuntu.com/ubuntu '"$OS_SHORT_CODENAME"' main restricted'
|
|
echo 'deb-src http://archive.ubuntu.com/ubuntu '"$OS_SHORT_CODENAME"' main restricted universe multiverse'
|
|
|
|
if [ -z "$BACKPORTS" ]; then
|
|
echo 'deb http://archive.ubuntu.com/ubuntu '"$OS_SHORT_CODENAME"'-backports main restricted universe multiverse'
|
|
echo 'deb-src http://archive.ubuntu.com/ubuntu '"$OS_SHORT_CODENAME"'-backports main restricted universe multiverse'
|
|
fi
|
|
elif [[ "${OS_DISTRO,,}" == *"debian"* ]]; then
|
|
echo 'deb http://deb.debian.org/debian '"$OS_SHORT_CODENAME"' main contrib non-free'
|
|
echo 'deb-src http://deb.debian.org/debian '"$OS_SHORT_CODENAME"' main contrib non-free'
|
|
|
|
if [ -z "$BACKPORTS" ]; then
|
|
echo 'deb http://deb.debian.org/debian '"$OS_SHORT_CODENAME"'-backports main contrib non-free'
|
|
echo 'deb-src http://deb.debian.org/debian '"$OS_SHORT_CODENAME"'-backports main contrib non-free'
|
|
fi
|
|
elif [[ "${OS_DISTRO,,}" == *"raspbian"* ]]; then
|
|
echo 'deb http://archive.raspbian.org/raspbian '"$OS_SHORT_CODENAME"' main contrib non-free'
|
|
echo 'deb-src http://archive.raspbian.org/raspbian '"$OS_SHORT_CODENAME"' main contrib non-free'
|
|
|
|
if [ -z "$BACKPORTS" ]; then
|
|
echo 'deb http://archive.raspbian.org/raspbian '"$OS_SHORT_CODENAME"'-backports main contrib non-free'
|
|
echo 'deb-src http://archive.raspbian.org/raspbian '"$OS_SHORT_CODENAME"'-backports main contrib non-free'
|
|
fi
|
|
else
|
|
SKIP_BUILD_DEP="yes"
|
|
fi
|
|
} >> "$SOURCE_LIST"
|
|
|
|
# Update package list and satisfy build dependencies for imagemagick
|
|
if [ -n "$SKIP_BUILD_DEP" ]; then
|
|
apt-get update -qq &&
|
|
apt-get build-dep -qq imagemagick -y
|
|
elif [ -z "$CI_BUILD" ]; then
|
|
apt-get update -qq
|
|
fi
|
|
|
|
# Install other build dependencies
|
|
PKG_LIST=(git curl make cmake automake libtool yasm g++ pkg-config perl libde265-dev libx265-dev libltdl-dev libopenjp2-7-dev liblcms2-dev libbrotli-dev libzip-dev libbz2-dev liblqr-1-0-dev libzstd-dev libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev librsvg2-dev libwmf-dev libxml2-dev libtiff-dev libraw-dev ghostscript gsfonts ffmpeg libpango1.0-dev libdjvulibre-dev libfftw3-dev libgs-dev libgraphviz-dev)
|
|
|
|
if [[ "${OS_SHORT_CODENAME,,}" != *"stretch"* && "${OS_SHORT_CODENAME,,}" != *"xenial"* ]]; then
|
|
PKG_LIST+=(libraqm-dev libraqm0)
|
|
fi
|
|
|
|
if [ -n "$CHECKINSTALL" ]; then
|
|
PKG_LIST+=(checkinstall)
|
|
fi
|
|
|
|
apt-get install -y "${PKG_LIST[@]}"
|
|
|
|
CMAKE_VERSION=$(cmake --version | head -n1 | cut -d" " -f3)
|
|
} >> "$LOG_FILE" 2>&1; then
|
|
echo -ne " Installing dependencies [${CGREEN}OK${CEND}]\\r"
|
|
echo ""
|
|
else
|
|
echo -ne " Installing dependencies [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Build aom
|
|
install_aom() {
|
|
cd "$WORK_DIR" || exit 1
|
|
|
|
if {
|
|
echo -ne ' Building aom [..]\r'
|
|
|
|
if [ "$(version "$CMAKE_VERSION")" -lt "$(version 3.6)" ]; then
|
|
echo -ne " Building aom [${CYELLOW}SKIPPED (CMAKE version not sufficient)${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
if [ -z "$SKIP_AOM" ]; then
|
|
if [ -z "$FORCE" ] && [ -n "$INSTALLED_AOM_VER" ] && [ "$(version "$INSTALLED_AOM_VER")" -ge "$(version "$AOM_VER")" ]; then
|
|
echo -ne " Building aom [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
else
|
|
echo -ne " Building aom [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
{
|
|
if [ -n "$AOM_VER" ]; then
|
|
httpGet "$GH_FILE_BASE/jbeich/aom/tar.gz/v$AOM_VER" > "aom-$AOM_VER.tar.gz"
|
|
|
|
if [ -n "$AOM_HASH" ]; then
|
|
if [ "$(sha1sum "aom-$AOM_VER.tar.gz" | cut -b-40)" != "$AOM_HASH" ]; then
|
|
echo -ne " Building aom [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
# see https://github.com/SoftCreatR/imei/issues/9
|
|
CMAKE_FLAGS="-DBUILD_SHARED_LIBS=1 -DENABLE_DOCS=0 -DENABLE_TESTS=0 -DENABLE_CCACHE=1"
|
|
|
|
if [[ "${OS_DISTRO,,}" == *"raspbian"* ]]; then
|
|
CMAKE_FLAGS+=' -DCMAKE_C_FLAGS="-mfloat-abi=hard -march=armv7-a -marm -mfpu=neon"'
|
|
fi
|
|
|
|
tar -xf "aom-$AOM_VER.tar.gz" &&
|
|
mkdir "$WORK_DIR/build_aom" &&
|
|
cd "$WORK_DIR/build_aom" &&
|
|
cmake "../aom-$AOM_VER/" "$CMAKE_FLAGS" &&
|
|
make
|
|
|
|
if [ -n "$CHECKINSTALL" ]; then
|
|
echo "AV1 Video Codec Library (IMEI v$INSTALLER_VER)" >> description-pak &&
|
|
checkinstall \
|
|
--default \
|
|
--nodoc \
|
|
--pkgname="imei-libaom" \
|
|
--pkglicense="BSD-2-Clause" \
|
|
--pkgversion="$AOM_VER" \
|
|
--pkgrelease="imei$INSTALLER_VER" \
|
|
--pakdir="/usr/local/src" \
|
|
--requires="git,cmake \(\>= 3.6\),perl,yasm"
|
|
else
|
|
make install
|
|
fi
|
|
|
|
ldconfig
|
|
fi
|
|
} >> "$LOG_FILE" 2>&1
|
|
}; then
|
|
UPDATE_LIBHEIF="yes"
|
|
|
|
echo -ne " Building aom [${CGREEN}OK${CEND}]\\r"
|
|
echo ""
|
|
else
|
|
echo -ne " Building aom [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Build libheif
|
|
install_libheif() {
|
|
cd "$WORK_DIR" || exit 1
|
|
|
|
if {
|
|
echo -ne ' Building libheif [..]\r'
|
|
|
|
if [ -z "$SKIP_LIBHEIF" ]; then
|
|
if [ -z "$FORCE" ] && [ -z "$UPDATE_LIBHEIF" ] && [ -n "$INSTALLED_LIBHEIF_VER" ] && [ "$(version "$INSTALLED_LIBHEIF_VER")" -ge "$(version "$LIBHEIF_VER")" ]; then
|
|
echo -ne " Building libheif [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
else
|
|
echo -ne " Building libheif [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
if [ ! -L "$LIB_DIR/lib/libaom.so" ]; then
|
|
echo -ne " Building libheif [${CYELLOW}SKIPPED (aom is required but not installed)${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
{
|
|
if [ -n "$LIBHEIF_VER" ]; then
|
|
httpGet "$GH_FILE_BASE/strukturag/libheif/tar.gz/v$LIBHEIF_VER" > "libheif-$LIBHEIF_VER.tar.gz"
|
|
|
|
if [ -n "$LIBHEIF_HASH" ]; then
|
|
if [ "$(sha1sum "libheif-$LIBHEIF_VER.tar.gz" | cut -b-40)" != "$LIBHEIF_HASH" ]; then
|
|
echo -e " Building libheif [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
tar -xf "libheif-$LIBHEIF_VER.tar.gz" &&
|
|
cd "libheif-$LIBHEIF_VER" &&
|
|
./autogen.sh &&
|
|
./configure &&
|
|
make
|
|
|
|
if [ -n "$CHECKINSTALL" ]; then
|
|
echo "ISO/IEC 23008-12:2017 HEIF file format decoder (IMEI v$INSTALLER_VER)" >> description-pak &&
|
|
checkinstall \
|
|
--default \
|
|
--nodoc \
|
|
--pkgname="imei-libheif" \
|
|
--pkglicense="GPL-2.0-or-later" \
|
|
--pkgversion="$LIBHEIF_VER" \
|
|
--pkgrelease="imei$INSTALLER_VER" \
|
|
--pakdir="/usr/local/src" \
|
|
--requires="automake,make,pkg-config,libde265-dev,libx265-dev,libjpeg-dev,imei-libaom"
|
|
else
|
|
make install
|
|
fi
|
|
|
|
ldconfig
|
|
fi
|
|
} >> "$LOG_FILE" 2>&1
|
|
}; then
|
|
UPDATE_IMAGEMAGICK="yes"
|
|
|
|
echo -ne " Building libheif [${CGREEN}OK${CEND}]\\r"
|
|
echo ""
|
|
else
|
|
echo -e " Building libheif [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Build JPEG XL
|
|
install_jxl() {
|
|
cd "$WORK_DIR" || exit 1
|
|
|
|
if {
|
|
echo -ne ' Building jpegxl [..]\r'
|
|
|
|
if [ "$(version "$CMAKE_VERSION")" -lt "$(version 3.10)" ]; then
|
|
echo -ne " Building jpegxl [${CYELLOW}SKIPPED (CMAKE version not sufficient)${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
if [ -z "$SKIP_JXL" ]; then
|
|
if [ -z "$FORCE" ] && [ -z "$UPDATE_LIBHEIF" ] && [ -n "$INSTALLED_JXL_VER" ] && [ "$(version "$INSTALLED_JXL_VER")" -ge "$(version "$JXL_VER")" ]; then
|
|
echo -ne " Building jpegxl [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
else
|
|
echo -ne " Building jpegxl [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
{
|
|
if [ -n "$JXL_VER" ]; then
|
|
httpGet "$GH_FILE_BASE/libjxl/libjxl/tar.gz/v$JXL_VER" > "libjxl-$JXL_VER.tar.gz"
|
|
|
|
if [ -n "$JXL_HASH" ]; then
|
|
if [ "$(sha1sum "libjxl-$JXL_VER.tar.gz" | cut -b-40)" != "$JXL_HASH" ]; then
|
|
echo -e " Building jpegxl [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
tar -xf "libjxl-$JXL_VER.tar.gz" &&
|
|
cd "libjxl-$JXL_VER" &&
|
|
./deps.sh &&
|
|
mkdir "build" &&
|
|
cd "build" &&
|
|
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF ..
|
|
make
|
|
|
|
if [ -n "$CHECKINSTALL" ]; then
|
|
echo "JPEG XL image format reference implementation (IMEI v$INSTALLER_VER)" >> description-pak &&
|
|
checkinstall \
|
|
--default \
|
|
--nodoc \
|
|
--pkgname="imei-libjxl" \
|
|
--pkglicense="Apache-2.0" \
|
|
--pkgversion="$JXL_VER" \
|
|
--pkgrelease="imei$INSTALLER_VER" \
|
|
--pakdir="/usr/local/src" \
|
|
--requires="cmake \(\>= 3.10\),pkg-config,libbrotli-dev,libgif-dev,libjpeg-dev,libopenexr-dev,libpng-dev,libwebp-dev"
|
|
else
|
|
make install
|
|
fi
|
|
|
|
ldconfig
|
|
fi
|
|
} >> "$LOG_FILE" 2>&1
|
|
}; then
|
|
UPDATE_IMAGEMAGICK="yes"
|
|
|
|
echo -ne " Building jpegxl [${CGREEN}OK${CEND}]\\r"
|
|
echo ""
|
|
else
|
|
echo -e " Building jpegxl [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Build ImageMagick
|
|
install_imagemagick() {
|
|
cd "$WORK_DIR" || exit 1
|
|
|
|
if {
|
|
if [ "$QUANTUM_DEPTH" -eq 8 ]; then
|
|
echo -ne ' Building ImageMagick (Q'"$QUANTUM_DEPTH"') [..]\r'
|
|
else
|
|
echo -ne ' Building ImageMagick (Q'"$QUANTUM_DEPTH"') [..]\r'
|
|
fi
|
|
|
|
if [ -z "$FORCE" ] && [ -z "$FORCE_IMAGEMAGICK" ] && [ -z "$UPDATE_IMAGEMAGICK" ] && [ -n "$INSTALLED_IMAGEMAGICK_VER" ] && [ "$(version "${INSTALLED_IMAGEMAGICK_VER//-/}")" -ge "$(version "${IMAGEMAGICK_VER//-/}")" ]; then
|
|
if [ "$QUANTUM_DEPTH" -eq 8 ]; then
|
|
echo -ne " Building ImageMagick (Q$QUANTUM_DEPTH) [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
else
|
|
echo -ne " Building ImageMagick (Q$QUANTUM_DEPTH) [${CYELLOW}SKIPPED${CEND}]\\r"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
return
|
|
fi
|
|
|
|
{
|
|
if [ -n "$IMAGEMAGICK_VER" ]; then
|
|
DIR_SUFFIX=""
|
|
|
|
if [ "$(echo "$IMAGEMAGICK_VER" | cut -b-1)" -eq 6 ]; then
|
|
DIR_SUFFIX="6"
|
|
|
|
httpGet "$GH_FILE_BASE/ImageMagick/ImageMagick6/tar.gz/$IMAGEMAGICK_VER" > "ImageMagick-$IMAGEMAGICK_VER.tar.gz"
|
|
else
|
|
httpGet "$GH_FILE_BASE/ImageMagick/ImageMagick/tar.gz/$IMAGEMAGICK_VER" > "ImageMagick-$IMAGEMAGICK_VER.tar.gz"
|
|
fi
|
|
|
|
if [ -n "$IMAGEMAGICK_HASH" ]; then
|
|
if [ "$(sha1sum "ImageMagick-$IMAGEMAGICK_VER.tar.gz" | cut -b-40)" != "$IMAGEMAGICK_HASH" ]; then
|
|
if [ "$QUANTUM_DEPTH" -eq 8 ]; then
|
|
echo -e " Building ImageMagick (Q$QUANTUM_DEPTH) [${CRED}FAILURE${CEND}]\\r"
|
|
else
|
|
echo -e " Building ImageMagick (Q$QUANTUM_DEPTH) [${CRED}FAILURE${CEND}]\\r"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
tar -xf "ImageMagick-$IMAGEMAGICK_VER.tar.gz" &&
|
|
cd "ImageMagick$DIR_SUFFIX-$IMAGEMAGICK_VER" &&
|
|
./configure --prefix="$BUILD_DIR" --sysconfdir="$CONFIG_DIR" \
|
|
CFLAGS="-O3 -march=native" \
|
|
CXXFLAGS="-O3 -march=native" \
|
|
--disable-static \
|
|
--enable-shared \
|
|
--enable-openmp \
|
|
--enable-opencl \
|
|
--enable-cipher \
|
|
--enable-hdri \
|
|
--enable-docs \
|
|
--with-threads \
|
|
--with-modules \
|
|
--with-quantum-depth="$QUANTUM_DEPTH" \
|
|
--with-magick-plus-plus \
|
|
--with-perl \
|
|
--without-jemalloc \
|
|
--without-tcmalloc \
|
|
--without-umem \
|
|
--without-autotrace \
|
|
--with-bzlib \
|
|
--with-x \
|
|
--with-zlib \
|
|
--with-zstd \
|
|
--without-dps \
|
|
--with-fftw \
|
|
--without-flif \
|
|
--without-fpx \
|
|
--with-djvu \
|
|
--with-fontconfig \
|
|
--with-freetype \
|
|
--with-raqm \
|
|
--with-gslib \
|
|
--with-gvc \
|
|
--with-heic \
|
|
--with-jbig \
|
|
--with-jpeg \
|
|
--with-jxl=yes \
|
|
--with-lcms \
|
|
--with-openjp2 \
|
|
--with-lqr \
|
|
--with-lzma \
|
|
--with-openexr \
|
|
--with-pango \
|
|
--with-png \
|
|
--with-raw \
|
|
--with-rsvg \
|
|
--with-tiff \
|
|
--with-webp \
|
|
--with-wmf \
|
|
--with-xml \
|
|
--with-dejavu-font-dir='/usr/share/fonts/truetype/ttf-dejavu' \
|
|
--with-gs-font-dir='/usr/share/fonts/type1/gsfonts' \
|
|
--with-urw-base35-font-dir='/usr/share/fonts/type1/urw-base35' \
|
|
--with-fontpath='/usr/share/fonts/type1' \
|
|
PSDelegate='/usr/bin/gs' &&
|
|
make
|
|
|
|
if [ -n "$CHECKINSTALL" ]; then
|
|
echo "image manipulation programs (IMEI v$INSTALLER_VER)" >> description-pak &&
|
|
checkinstall \
|
|
--default \
|
|
--nodoc \
|
|
--pkgname=imei-imagemagick \
|
|
--pkglicense="Apache-2.0" \
|
|
--pkgversion="$IMAGEMAGICK_VER" \
|
|
--pkgrelease="imei$INSTALLER_VER" \
|
|
--pakdir="/usr/local/src" \
|
|
--conflicts="imagemagick" \
|
|
--requires="pkg-config"
|
|
else
|
|
make install
|
|
fi
|
|
|
|
ldconfig
|
|
fi
|
|
} >> "$LOG_FILE" 2>&1
|
|
}; then
|
|
if [ "$QUANTUM_DEPTH" -eq 8 ]; then
|
|
echo -ne " Building ImageMagick (Q$QUANTUM_DEPTH) [${CGREEN}OK${CEND}]\\r"
|
|
else
|
|
echo -ne " Building ImageMagick (Q$QUANTUM_DEPTH) [${CGREEN}OK${CEND}]\\r"
|
|
fi
|
|
|
|
echo ""
|
|
else
|
|
if [ "$QUANTUM_DEPTH" -eq 8 ]; then
|
|
echo -e " Building ImageMagick (Q$QUANTUM_DEPTH) [${CRED}FAILURE${CEND}]\\r"
|
|
else
|
|
echo -e " Building ImageMagick (Q$QUANTUM_DEPTH) [${CRED}FAILURE${CEND}]\\r"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
finish_installation() {
|
|
echo -ne ' Verifying installation [..]\r'
|
|
|
|
# Check if ImageMagick version matches
|
|
{
|
|
VERIFY_INSTALLATION=$("$BUILD_DIR/bin/identify" -version | grep -oP "$IMAGEMAGICK_VER")
|
|
} >> "$LOG_FILE" 2>&1
|
|
|
|
if [ -n "$VERIFY_INSTALLATION" ]; then
|
|
echo -ne " Verifying installation [${CGREEN}OK${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CGREEN}Process has been finished successfully after $(displaytime $(($(date +%s) - START)))!${CEND}"
|
|
echo ""
|
|
else
|
|
echo -ne " Verifying installation [${CRED}FAILURE${CEND}]\\r"
|
|
echo ""
|
|
echo -e " ${CBLUE}Please check $LOG_FILE for details.${CEND}"
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
######################
|
|
# Install everything #
|
|
######################
|
|
|
|
echo -ne "\ec"
|
|
|
|
WELCOME_TXT="Welcome to IMEI - ImageMagick Easy Install ${INSTALLER_VER}"
|
|
WELCOME_LEN=${#WELCOME_TXT}
|
|
|
|
echo ""
|
|
echo " $(str_repeat "$WELCOME_LEN" "#")"
|
|
echo " $WELCOME_TXT"
|
|
echo " $(str_repeat "$WELCOME_LEN" "#")"
|
|
echo ""
|
|
|
|
if [ -z "$CI_BUILD" ] && [ -n "$INSTALLER_VER" ] && [ "$(version "$INSTALLER_VER")" -lt "$(version "$INSTALLER_LATEST_VER")" ]; then
|
|
echo -e " ${CYELLOW}A newer installer version ($INSTALLER_LATEST_VER) is available!${CEND}"
|
|
echo ""
|
|
fi
|
|
|
|
echo " Detected OS : $OS_DISTRO"
|
|
echo " Detected Arch : $OS_ARCH"
|
|
echo " Detected Cores : $NUM_CORES"
|
|
echo ""
|
|
echo " Used web client : $CLIENT"
|
|
echo ""
|
|
echo " Work Dir : $WORK_DIR"
|
|
echo " Build Dir : $BUILD_DIR"
|
|
echo " Config Dir : $CONFIG_DIR"
|
|
echo " Log File : $LOG_FILE"
|
|
echo ""
|
|
echo " Force Build All : ${FORCE:-"no"}"
|
|
echo " Force Build IM : ${FORCE_IMAGEMAGICK:-"no"}"
|
|
echo " Checkinstall : ${CHECKINSTALL:-"no"}"
|
|
echo " CI Build : ${CI_BUILD:-"no"}"
|
|
echo " Signature Check : ${VERIFY_SIGNATURE:-"yes"}"
|
|
echo ""
|
|
|
|
echo " #####################"
|
|
echo " Installation Process"
|
|
echo " #####################"
|
|
echo ""
|
|
|
|
# Run installer functions
|
|
install_deps
|
|
install_aom
|
|
install_libheif
|
|
install_jxl
|
|
install_imagemagick
|
|
finish_installation
|
|
|
|
exit 0
|