2018-05-02 10:58:18 +02:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
# Copyright 2016 Christoph Reiter
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
|
|
|
|
set -e
|
|
|
|
DIR="$( cd "$( dirname "$0" )" && pwd )"
|
|
|
|
cd "${DIR}"
|
|
|
|
|
|
|
|
# CONFIG START
|
|
|
|
|
|
|
|
ARCH="i686"
|
|
|
|
BUILD_VERSION="0"
|
|
|
|
|
|
|
|
# CONFIG END
|
|
|
|
|
|
|
|
MISC="${DIR}"/misc
|
|
|
|
if [ "${ARCH}" = "x86_64" ]; then
|
|
|
|
MINGW="mingw64"
|
|
|
|
else
|
|
|
|
MINGW="mingw32"
|
|
|
|
fi
|
|
|
|
|
|
|
|
GPO_VERSION="0.0.0"
|
|
|
|
GPO_VERSION_DESC="UNKNOWN"
|
|
|
|
|
|
|
|
function set_build_root {
|
|
|
|
BUILD_ROOT="$1"
|
|
|
|
REPO_CLONE="${BUILD_ROOT}"/gpodder
|
|
|
|
MINGW_ROOT="${BUILD_ROOT}/${MINGW}"
|
|
|
|
}
|
|
|
|
|
|
|
|
if [ -d "/home/IEUser" ]; then
|
|
|
|
set_build_root "/home/IEUser/_gpodder_build_root"
|
|
|
|
else
|
|
|
|
set_build_root "${DIR}/_build_root"
|
|
|
|
fi
|
|
|
|
|
|
|
|
function build_pacman {
|
|
|
|
pacman --root "${BUILD_ROOT}" "$@"
|
|
|
|
}
|
|
|
|
|
|
|
|
function build_pip {
|
2018-05-10 17:58:10 +02:00
|
|
|
"${MINGW_ROOT}"/bin/python3.exe -m pip "$@"
|
2018-05-02 10:58:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function build_python {
|
2018-05-10 17:58:10 +02:00
|
|
|
"${MINGW_ROOT}"/bin/python3.exe "$@"
|
2018-05-02 10:58:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function build_compileall {
|
|
|
|
MSYSTEM= build_python -m compileall -b "$@"
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_pre_deps {
|
|
|
|
pacman -S --needed --noconfirm p7zip git dos2unix rsync \
|
|
|
|
mingw-w64-"${ARCH}"-nsis wget intltool mingw-w64-"${ARCH}"-toolchain
|
|
|
|
}
|
|
|
|
|
|
|
|
function create_root {
|
|
|
|
mkdir -p "${BUILD_ROOT}"
|
|
|
|
|
|
|
|
mkdir -p "${BUILD_ROOT}"/var/lib/pacman
|
|
|
|
mkdir -p "${BUILD_ROOT}"/var/log
|
|
|
|
mkdir -p "${BUILD_ROOT}"/tmp
|
|
|
|
|
|
|
|
build_pacman -Syu
|
|
|
|
build_pacman --noconfirm -S base
|
|
|
|
}
|
|
|
|
|
|
|
|
function extract_installer {
|
|
|
|
[ -z "$1" ] && (echo "Missing arg"; exit 1)
|
|
|
|
|
|
|
|
mkdir -p "$BUILD_ROOT"
|
|
|
|
7z x -o"$BUILD_ROOT"/"$MINGW" "$1"
|
|
|
|
rm -rf "$MINGW_ROOT"/'$PLUGINSDIR' "$MINGW_ROOT"/*.txt "$MINGW_ROOT"/*.nsi
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_deps {
|
|
|
|
|
|
|
|
# We don't use the fontconfig backend, and this skips the lengthy
|
|
|
|
# cache update step during package installation
|
|
|
|
export MSYS2_FC_CACHE_SKIP=1
|
|
|
|
|
|
|
|
build_pacman --noconfirm -S git mingw-w64-"${ARCH}"-gdk-pixbuf2 \
|
|
|
|
mingw-w64-"${ARCH}"-librsvg \
|
|
|
|
mingw-w64-"${ARCH}"-gtk3 mingw-w64-"${ARCH}"-python3 \
|
|
|
|
mingw-w64-"${ARCH}"-python3-gobject \
|
|
|
|
mingw-w64-"${ARCH}"-python3-cairo \
|
|
|
|
mingw-w64-"${ARCH}"-python3-pip \
|
|
|
|
mingw-w64-"${ARCH}"-make
|
|
|
|
|
|
|
|
PIP_REQUIREMENTS="\
|
|
|
|
podcastparser==0.6.3
|
|
|
|
mygpoclient==1.8
|
|
|
|
pywin32-ctypes==0.1.2
|
|
|
|
html5lib==1.0.1
|
|
|
|
webencodings==0.5.1
|
|
|
|
six==1.11.0
|
|
|
|
"
|
|
|
|
build_pacman -S --noconfirm mingw-w64-"${ARCH}"-python3-setuptools
|
|
|
|
|
|
|
|
build_pip install --no-deps --no-binary ":all:" --upgrade \
|
|
|
|
--force-reinstall $(echo "$PIP_REQUIREMENTS" | tr ["\\n"] [" "])
|
|
|
|
|
|
|
|
build_pacman --noconfirm -Rdds mingw-w64-"${ARCH}"-python3-pip || true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_gpodder {
|
|
|
|
[ -z "$1" ] && (echo "Missing arg"; exit 1)
|
|
|
|
|
|
|
|
rm -Rf "${REPO_CLONE}"
|
|
|
|
# FIXME: restore correct clone
|
|
|
|
# git clone "${DIR}"/../.. "${REPO_CLONE}"
|
|
|
|
rsync -rvt "${DIR}"/../.. "${REPO_CLONE}"
|
|
|
|
|
|
|
|
(cd "${REPO_CLONE}" && git checkout "$1") || exit 1
|
|
|
|
|
2018-05-10 17:58:10 +02:00
|
|
|
(cd "${REPO_CLONE}" && PYTHON="${MINGW_ROOT}"/bin/python3.exe mingw32-make install-win)
|
2018-05-02 10:58:18 +02:00
|
|
|
|
|
|
|
GPO_VERSION=$(MSYSTEM= build_python -c \
|
|
|
|
"import gpodder; import sys; sys.stdout.write(gpodder.__version__)")
|
|
|
|
GPO_VERSION_DESC="$GPO_VERSION"
|
|
|
|
if [ "$1" = "master" ]
|
|
|
|
then
|
|
|
|
local GIT_REV=$(git rev-list --count HEAD)
|
|
|
|
local GIT_HASH=$(git rev-parse --short HEAD)
|
|
|
|
GPO_VERSION_DESC="$GPO_VERSION-rev$GIT_REV-$GIT_HASH"
|
|
|
|
fi
|
2018-05-06 18:17:23 +02:00
|
|
|
|
|
|
|
# Create launchers
|
|
|
|
python3 "${MISC}"/create-launcher.py \
|
|
|
|
"${GPO_VERSION}" "${MINGW_ROOT}"/bin
|
|
|
|
|
2018-05-02 10:58:18 +02:00
|
|
|
# install fake dbus
|
2018-05-10 17:58:10 +02:00
|
|
|
rsync -arv --delete "${REPO_CLONE}"/tools/fake-dbus-module/dbus "${MINGW_ROOT}"/lib/python3.6/site-packages/
|
2018-05-02 10:58:18 +02:00
|
|
|
|
|
|
|
# install gtk3 settings for a proper font
|
2018-05-10 17:58:10 +02:00
|
|
|
mkdir -p "${MINGW_ROOT}"/etc/gtk-3.0
|
|
|
|
cp "${MISC}"/gtk3.0_settings.ini "${MINGW_ROOT}"/etc/gtk-3.0/settings.ini
|
2018-05-02 10:58:18 +02:00
|
|
|
|
2018-05-07 11:44:40 +02:00
|
|
|
# install bin/gpodder bin/gpo to a separate package, to be run before gpodder/__init__.py
|
2018-05-10 17:58:10 +02:00
|
|
|
gpodder_launch_dir="${MINGW_ROOT}"/lib/python3.6/site-packages/gpodder_launch
|
2018-05-07 11:44:40 +02:00
|
|
|
mkdir -p "${gpodder_launch_dir}"
|
|
|
|
touch "${gpodder_launch_dir}"/__init__.py
|
|
|
|
cp ${REPO_CLONE}/bin/gpo "${gpodder_launch_dir}"/gpo.py
|
|
|
|
cp ${REPO_CLONE}/bin/gpodder "${gpodder_launch_dir}"/gpodder.py
|
2018-05-02 10:58:18 +02:00
|
|
|
|
|
|
|
build_compileall -d "" -f -q "$(cygpath -w "${MINGW_ROOT}")"
|
|
|
|
}
|
|
|
|
|
|
|
|
function cleanup_before {
|
|
|
|
# these all have svg variants
|
|
|
|
find "${MINGW_ROOT}"/share/icons -name "*.symbolic.png" -exec rm -f {} \;
|
|
|
|
|
|
|
|
# remove some larger ones
|
|
|
|
rm -Rf "${MINGW_ROOT}/share/icons/Adwaita/512x512"
|
|
|
|
rm -Rf "${MINGW_ROOT}/share/icons/Adwaita/256x256"
|
|
|
|
rm -Rf "${MINGW_ROOT}/share/icons/Adwaita/96x96"
|
|
|
|
rm -Rf "${MINGW_ROOT}/share/icons/Adwaita/48x48"
|
|
|
|
"${MINGW_ROOT}"/bin/gtk-update-icon-cache-3.0.exe \
|
|
|
|
"${MINGW_ROOT}"/share/icons/Adwaita
|
|
|
|
|
|
|
|
# remove some gtk demo icons
|
|
|
|
find "${MINGW_ROOT}"/share/icons/hicolor -name "gtk3-*" -exec rm -f {} \;
|
|
|
|
"${MINGW_ROOT}"/bin/gtk-update-icon-cache-3.0.exe \
|
|
|
|
"${MINGW_ROOT}"/share/icons/hicolor
|
|
|
|
|
|
|
|
# python related, before installing gpodder
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/python3.*/test
|
|
|
|
rm -f "${MINGW_ROOT}"/lib/python3.*/lib-dynload/_tkinter*
|
|
|
|
find "${MINGW_ROOT}"/lib/python3.* -type d -name "test*" \
|
|
|
|
-prune -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}"/lib/python3.* -type d -name "*_test*" \
|
|
|
|
-prune -exec rm -rf {} \;
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}"/bin -name "*.pyo" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}"/bin -name "*.pyc" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -type d -name "__pycache__" -prune -exec rm -rf {} \;
|
|
|
|
|
|
|
|
build_compileall -d "" -f -q "$(cygpath -w "${MINGW_ROOT}")"
|
|
|
|
find "${MINGW_ROOT}" -name "*.py" -exec rm -f {} \;
|
|
|
|
}
|
|
|
|
|
|
|
|
function cleanup_after {
|
|
|
|
# delete translations we don't support
|
|
|
|
for d in "${MINGW_ROOT}"/share/locale/*/LC_MESSAGES; do
|
|
|
|
if [ ! -f "${d}"/gpodder.mo ]; then
|
|
|
|
rm -Rf "${d}"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}" -regextype "posix-extended" -name "*.exe" -a ! \
|
|
|
|
-iregex ".*/(gpodder|gpo|python)[^/]*\\.exe" \
|
|
|
|
-exec rm -f {} \;
|
|
|
|
|
|
|
|
rm -Rf "${MINGW_ROOT}"/libexec
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gtk-doc
|
|
|
|
rm -Rf "${MINGW_ROOT}"/include
|
|
|
|
rm -Rf "${MINGW_ROOT}"/var
|
|
|
|
rm -Rf "${MINGW_ROOT}"/etc/fonts
|
|
|
|
rm -Rf "${MINGW_ROOT}"/etc/pki
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/zsh
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/pixmaps
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gnome-shell
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/dbus-1
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gir-1.0
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/doc
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/man
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/info
|
2018-05-02 14:39:47 +02:00
|
|
|
# FIXME: don't we need it for icons?
|
2018-05-02 10:58:18 +02:00
|
|
|
rm -Rf "${MINGW_ROOT}"/share/mime
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gettext
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/libtool
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/licenses
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/appdata
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/aclocal
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/ffmpeg
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/vala
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/readline
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/xml
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/bash-completion
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/common-lisp
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/emacs
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gdb
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/libcaca
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gettext
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gst-plugins-base
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gst-plugins-bad
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/libgpg-error
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/p11-kit
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/pki
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/thumbnailers
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gtk-3.0
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/nghttp2
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/themes
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/fontconfig
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gettext-*
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/gstreamer-1.0
|
|
|
|
rm -Rf "${MINGW_ROOT}"/share/installed-tests
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}"/share/glib-2.0 -type f ! \
|
|
|
|
-name "*.compiled" -exec rm -f {} \;
|
|
|
|
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/cmake
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/gettext
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/gtk-3.0
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/mpg123
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/p11-kit
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/pkcs11
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/ruby
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/engines
|
|
|
|
|
|
|
|
rm -f "${MINGW_ROOT}"/bin/libharfbuzz-icu-0.dll
|
|
|
|
rm -Rf "${MINGW_ROOT}"/lib/python2.*
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}" -name "*.a" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.whl" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.h" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.la" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.sh" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.jar" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.def" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.cmd" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.cmake" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.pc" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.desktop" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.manifest" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "*.pyo" -exec rm -f {} \;
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}"/bin -name "*-config" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}"/bin -name "easy_install*" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -regex ".*/bin/[^.]+" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -regex ".*/bin/[^.]+\\.[0-9]+" -exec rm -f {} \;
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}" -name "gtk30-properties.mo" -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "gettext-tools.mo" -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "libexif-12.mo" -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "xz.mo" -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "libgpg-error.mo" -exec rm -rf {} \;
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}" -name "old_root.pem" -exec rm -rf {} \;
|
|
|
|
find "${MINGW_ROOT}" -name "weak.pem" -exec rm -rf {} \;
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}"/bin -name "*.pyo" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}"/bin -name "*.pyc" -exec rm -f {} \;
|
|
|
|
find "${MINGW_ROOT}" -type d -name "__pycache__" -prune -exec rm -rf {} \;
|
|
|
|
|
|
|
|
build_python "${MISC}/depcheck.py" --delete
|
|
|
|
|
|
|
|
find "${MINGW_ROOT}" -type d -empty -delete
|
|
|
|
}
|
|
|
|
|
|
|
|
function build_installer {
|
|
|
|
BUILDPY=$(echo "${MINGW_ROOT}"/lib/python3.*/site-packages/gpodder)/build_info.py
|
2018-05-02 14:39:47 +02:00
|
|
|
cp "${REPO_CLONE}"/src/gpodder/build_info.py "$BUILDPY"
|
|
|
|
echo 'BUILD_TYPE = u"windows"' >> "$BUILDPY"
|
|
|
|
echo "BUILD_VERSION = $BUILD_VERSION" >> "$BUILDPY"
|
|
|
|
(cd "$REPO_CLONE" && echo "BUILD_INFO = u\"$(git rev-parse --short HEAD)\"" >> "$BUILDPY")
|
2018-05-02 10:58:18 +02:00
|
|
|
(cd $(dirname "$BUILDPY") && build_compileall -d "" -q -f -l .)
|
|
|
|
rm -f "$BUILDPY"
|
|
|
|
|
|
|
|
cp "${MISC}"/gpodder.ico "${BUILD_ROOT}"
|
|
|
|
(cd "$BUILD_ROOT" && makensis -V3 -NOCD -DVERSION="$GPO_VERSION_DESC" "${MISC}"/win_installer.nsi)
|
|
|
|
|
|
|
|
mv "$BUILD_ROOT/gpodder-LATEST.exe" "$DIR/gpodder-$GPO_VERSION_DESC-installer.exe"
|
|
|
|
}
|
|
|
|
|
|
|
|
function build_portable_installer {
|
|
|
|
BUILDPY=$(echo "${MINGW_ROOT}"/lib/python3.*/site-packages/gpodder)/build_info.py
|
2018-05-02 14:39:47 +02:00
|
|
|
cp "${REPO_CLONE}"/src/gpodder/build_info.py "$BUILDPY"
|
2018-05-06 18:17:23 +02:00
|
|
|
echo 'BUILD_TYPE = u"windows-portable"' >> "$BUILDPY"
|
2018-05-02 14:39:47 +02:00
|
|
|
echo "BUILD_VERSION = $BUILD_VERSION" >> "$BUILDPY"
|
|
|
|
(cd "$REPO_CLONE" && echo "BUILD_INFO = u\"$(git rev-parse --short HEAD)\"" >> "$BUILDPY")
|
2018-05-02 10:58:18 +02:00
|
|
|
(cd $(dirname "$BUILDPY") && build_compileall -d "" -q -f -l .)
|
|
|
|
rm -f "$BUILDPY"
|
|
|
|
|
|
|
|
local PORTABLE="$DIR/gpodder-${GPO_VERSION_DESC}-portable"
|
|
|
|
|
|
|
|
rm -rf "$PORTABLE"
|
|
|
|
mkdir "$PORTABLE"
|
|
|
|
cp "$MISC"/gpodder.lnk "$PORTABLE"
|
|
|
|
cp "$MISC"/gpo.lnk "$PORTABLE"
|
|
|
|
cp "$MISC"/README-PORTABLE.txt "$PORTABLE"/README.txt
|
|
|
|
unix2dos "$PORTABLE"/README.txt
|
|
|
|
mkdir "$PORTABLE"/config
|
|
|
|
cp -RT "${MINGW_ROOT}" "$PORTABLE"/data
|
|
|
|
|
|
|
|
rm -Rf 7zout 7z1604.exe
|
|
|
|
7z a payload.7z "$PORTABLE"
|
|
|
|
wget -P "$DIR" -c http://www.7-zip.org/a/7z1604.exe
|
|
|
|
7z x -o7zout 7z1604.exe
|
|
|
|
cat 7zout/7z.sfx payload.7z > "$PORTABLE".exe
|
|
|
|
rm -Rf 7zout 7z1604.exe payload.7z "$PORTABLE"
|
|
|
|
}
|