-
Notifications
You must be signed in to change notification settings - Fork 270
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 | ||
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Huhu :] There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't this deleting not only $d? There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fair enough