Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add shell script to add plugin dependencies into GTK bundle on MSYS2 #375

Merged
merged 1 commit into from
Mar 12, 2016
Merged
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
289 changes: 289 additions & 0 deletions build/gtk-bundle-from-msys2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
#!/bin/sh
#
# Fetch and extract Geany-Plugins dependencies for Windows/MSYS2
# This script will download (or use Pacman's cache) to extract
# plugin dependencies as defined below. To be run within a MSYS2
# shell. The extracted files will be placed into the current
# directory.

ABI=i686
use_cache="no"
make_zip="no"
gtkv="3"

# ctags - binary for GeanyCTags plugin
# ctpl-git - for GeanyGenDoc plugin
# enchant, hunspell - for SpellCheck plugin
# curl, glib-networking, gnutls, icu, sqlite3, webkitgtk2/3 for WebHelper and Markdown plugins
# lua51 - for GeanyLua plugin
# gnupg, gpgme - for GeanyPG plugin
# libsoup - for UpdateChecker plugin
# libgit2 - for GitChangeBar plugin
# libxml2 - for PrettyPrinter plugin
# gtkspell - for GeanyVC plugin
# the rest is dependency-dependency
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't pacman be used to resolve dependencies of deps? would look more robust if it could

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes it can, see the approach in geany/geany#560.
I didn't consider this because at least in Geany's dependency tree it pulled in a lot of things we never need nor depend on. I don't want to imagine what this would pull in for dependency monsters like webkitgtk. The bundle is already quite big...

I don't mind changing this for post-1.27 but for now, we should get it running.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fair enough

packages="
ctags
ctpl-git
curl
dbus
dbus-glib
enchant
geoclue
giflib
glib-networking
gmp
gnupg
gnutls
gpgme
gstreamer
gst-plugins-base
gtkspell
http-parser
hunspell
icu
libassuan
libgcrypt
libgpg-error
libgit2
libidn
libjpeg-turbo
libogg
libsoup
libssh2
libsystre
libtasn1
libtheora
libtiff
libtre-git
libvorbis
libvorbisidec-svn
libwebp
libxml2
libxslt
lua51
nettle
openssl
orc
p11-kit
readline
rtmpdump-git
sqlite3
termcap
xz
"

gtk2_dependency_pkgs="
webkitgtk2
"
gtk3_dependency_pkgs="
webkitgtk3
"

package_urls=""


handle_command_line_options() {
for opt in "$@"; do
case "$opt" in
"-c"|"--cache")
use_cache="yes"
;;
"-z"|"--zip")
make_zip="yes"
;;
"-2")
gtkv="2"
;;
"-3")
gtkv="3"
;;
"-h"|"--help")
echo "gtk-bundle-from-msys2.sh [-c] [-h] [-z] [-2 | -3] [CACHEDIR]"
echo " -c Use pacman cache. Otherwise pacman will download"
echo " archive files"
echo " -h Show this help screen"
echo " -z Create a zip afterwards"
echo " -2 Prefer gtk2"
echo " -3 Prefer gtk3"
echo "CACHEDIR Directory where to look for cached packages (default: /var/cache/pacman/pkg)"
exit 1
;;
*)
cachedir="$opt"
;;
esac
done
}

initialize() {
if [ -z "$cachedir" ]; then
cachedir="/var/cache/pacman/pkg"
fi

if [ "$use_cache" = "yes" ] && ! [ -d "$cachedir" ]; then
echo "Cache dir \"$cachedir\" not a directory"
exit 1
fi

gtk="gtk$gtkv"
eval "gtk_dependency_pkgs=\${${gtk}_dependency_pkgs}"

pkgs="
${packages}
${gtk_dependency_pkgs}
"
}

_remember_package_source() {
if [ "$use_cache" = "yes" ]; then
package_url=`pacman -Sp mingw-w64-${ABI}-${2}`
else
package_url="${1}"
fi
package_urls="${package_urls}\n${package_url}"
}

_getpkg() {
if [ "$use_cache" = "yes" ]; then
package_info=`pacman -Qi mingw-w64-$ABI-$1`
package_version=`echo "$package_info" | grep "^Version " | cut -d':' -f 2 | tr -d '[[:space:]]'`
ls $cachedir/mingw-w64-${ABI}-${1}-${package_version}-* | sort -V | tail -n 1
else
pacman -Sp mingw-w64-${ABI}-${1}
fi
}

extract_packages() {
# hack for libxml2 postinstall script which expects "bin/mkdir"
mkdir -p bin
cp /bin/mkdir bin/
# extract packages
for i in $pkgs; do
pkg=$(_getpkg $i)
_remember_package_source $pkg $i
if [ "$use_cache" = "yes" ]; then
if [ -e "$pkg" ]; then
echo "Extracting $pkg from cache"
tar xaf $pkg
else
echo "ERROR: File $pkg not found"
exit 1
fi
else
echo "Download $pkg using curl"
curl -L "$pkg" | tar -x --xz
fi
if [ -f .INSTALL ]; then
echo "Running post_install script for \"$i\""
/bin/bash -c ". .INSTALL; post_install"
fi
rm -f .INSTALL .MTREE .PKGINFO .BUILDINFO
done
}

move_extracted_files() {
echo "Move extracted data to destination directory"
if [ -d mingw32 ]; then
for d in bin etc home include lib libexec locale sbin share ssl var; do
if [ -d "mingw32/$d" ]; then
rm -rf $d
# prevent sporadic 'permission denied' errors on my system, not sure why they happen
sleep 0.5
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huhu :]

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this deleting not only $d?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed on IRC, it does delete only $d which is intended here because mingw32/$d is moved to $d afterwards.

mv mingw32/$d .
fi
done
rmdir mingw32
fi
}

cleanup_unnecessary_files() {
echo "Cleanup unnecessary files"
# etc: cleanup unnecessary files
rm -rf etc/bash_completion.d
rm -rf etc/dbus-1
rm -rf etc/pkcs11
rm -rf etc/xml
# include: cleanup development files
rm -rf include
# lib: cleanup development and other unnecessary files
rm -rf lib/cmake
rm -rf lib/pkgconfig
rm -rf lib/girepository-1.0
rm -rf lib/icu
rm -rf lib/lua
rm -rf lib/p11-kit
rm -rf lib/python2.7
find lib -name '*.h' -delete
find lib -name '*.a' -delete
find lib -name '*.typelib' -delete
find lib -name '*.def' -delete
find lib -name '*.sh' -delete
find libexec -name '*.exe' -delete
# sbin: cleanup sbin files
rm -rf sbin
# share: cleanup other unnecessary files
rm -rf share/aclocal
rm -rf share/bash-completion
rm -rf share/common-lisp
rm -rf share/dbus-1
rm -rf share/doc
rm -rf share/emacs
rm -rf share/GConf
rm -rf share/geoclue-providers
rm -rf share/gir-1.0
rm -rf share/glib-2.0
rm -rf share/gnupg
rm -rf share/gst-plugins-base
rm -rf share/gtk-doc
rm -rf share/icu
rm -rf share/info
rm -rf share/lua
rm -rf share/man
rm -rf share/readline
rm -rf share/zsh
# ssl: cleanup ssl files
rm -rf ssl
# bin: cleanup binaries and libs (delete anything except *.dll and binaries we need)
find bin \
! -name '*.dll' \
! -name ctags.exe \
! -name gpg2.exe \
! -name gpgme-w32spawn.exe \
! -name gpgme-tool.exe \
! -name gpgconf.exe \
-type f \
-delete
# cleanup empty directories
find . -type d -empty -delete
}

create_bundle_dependency_info_file() {
filename="ReadMe.Dependencies.Geany-Plugins.txt"
cat << EOF > "${filename}"
This installation contains dependencies for Geany-Plugins which are
distributed as binaries (usually .dll files) as well as additional
files necessary for these dependencies.
Following is a list of all included binary packages with their
full download URL as used to create this installation.
EOF
echo -e "${package_urls}" >> "${filename}"
unix2dos "${filename}"
}

create_zip_archive() {
if [ "$make_zip" = "yes" ]; then
echo "Packing the bundle"
zip -r plugins-$gtk.zip bin etc include lib locale share var
fi
}


# main()
handle_command_line_options $@
initialize
extract_packages
move_extracted_files
cleanup_unnecessary_files
create_bundle_dependency_info_file
create_zip_archive