Skip to content

Instantly share code, notes, and snippets.

@nablaa
Created April 8, 2014 18:29
Show Gist options
  • Save nablaa/10167685 to your computer and use it in GitHub Desktop.
Save nablaa/10167685 to your computer and use it in GitHub Desktop.
Cross-compile Pidgin plugins for Windows using Linux
#!/bin/bash
# Script to cross-compile Pidgin plugins on Linux for Windows.
# Tested to work on Ubuntu 12.04
PLUGIN_SRC_FILE="$1"
PLUGIN_NAME=$(basename "${PLUGIN_SRC_FILE}")
PLUGIN_NAME="${PLUGIN_NAME%.*}"
PLUGIN_DLL="${PLUGIN_NAME}.dll"
set -e
set -u
if [ ! -f "${PLUGIN_SRC_FILE}" ]; then
echo "Plugin source file must be given"
echo "Usage: $0 plugin_source_file"
echo "Example: $0 my_plugin.c"
exit 1
fi
PIDGIN_VERSION="2.10.9"
PIDGIN_SRC="pidgin-${PIDGIN_VERSION}"
WIN32_SRC="win32-dev"
MINGW_SRC="${WIN32_SRC}/mingw"
echo "Installing required packages ..."
sudo apt-get install mingw32 mingw32-binutils mingw32-runtime
echo "Getting Pidgin source ..."
wget "http://sourceforge.net/projects/pidgin/files/Pidgin/${PIDGIN_VERSION}/${PIDGIN_SRC}.tar.bz2/download" -O "${PIDGIN_SRC}.tar.bz2"
tar xvjf ${PIDGIN_SRC}.tar.bz2
cat > "${PIDGIN_SRC}/local.mak" << EOF
SHELL := /bin/bash
CC := /usr/bin/i586-mingw32msvc-cc
GMSGFMT := msgfmt
MAKENSIS := /usr/bin/makensis
WINDRES := /usr/bin/i586-mingw32msvc-windres
STRIP := /usr/bin/i586-mingw32msvc-strip
INTLTOOL_MERGE := /usr/bin/intltool-merge
INCLUDE_PATHS := -I/usr/i586-mingw32msvc/include
LIB_PATHS := -L$(readlink -f "$WIN32_SRC")/mingw/lib/gcc/mingw32/4.7.2
EOF
mkdir -p "${MINGW_SRC}"
echo "Getting dependencies ..."
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/binutils/binutils-2.23.1/binutils-2.23.1-1-mingw32-bin.tar.lzma/download" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mingw-rt/mingwrt-3.20/mingwrt-3.20-2-mingw32-dev.tar.lzma/download" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mingw-rt/mingwrt-3.20/mingwrt-3.20-2-mingw32-dll.tar.lzma/download" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/w32api/w32api-3.17/w32api-3.17-2-mingw32-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mpc/mpc-0.8.1-1/mpc-0.8.1-1-mingw32-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mpc/mpc-0.8.1-1/libmpc-0.8.1-1-mingw32-dll-2.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mpfr/mpfr-2.4.1-1/mpfr-2.4.1-1-mingw32-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/mpfr/mpfr-2.4.1-1/libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gmp/gmp-5.0.1-1/gmp-5.0.1-1-mingw32-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gmp/gmp-5.0.1-1/libgmp-5.0.1-1-mingw32-dll-10.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/pthreads-w32-2.9.0-mingw32-pre-20110507-2-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/libpthreadgc-2.9.0-mingw32-pre-20110507-2-dll-2.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/libiconv/libiconv-1.14-2/libiconv-1.14-2-mingw32-dev.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/libiconv/libiconv-1.14-2/libiconv-1.14-2-mingw32-dll-2.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gettext/gettext-0.18.1.1-2/libintl-0.18.1.1-2-mingw32-dll-8.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/libgomp-4.7.2-1-mingw32-dll-1.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/libssp-4.7.2-1-mingw32-dll-0.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/libquadmath-4.7.2-1-mingw32-dll-0.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/gcc-core-4.7.2-1-mingw32-bin.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/libgcc-4.7.2-1-mingw32-dll-1.tar.lzma/" -O - | tar xv --lzma -C "${MINGW_SRC}"
wget "http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.14/gtk+-bundle_2.14.7-20090119_win32.zip"
unzip "gtk+-bundle_2.14.7-20090119_win32.zip" -d "${WIN32_SRC}/gtk_2_0-2.14"
wget "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-tools-0.17.zip"
unzip "gettext-tools-0.17.zip" -d "${WIN32_SRC}/gettext-0.17"
wget "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-0.17-1.zip"
unzip "gettext-runtime-0.17-1.zip" -d "${WIN32_SRC}/gettext-0.17"
wget "http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/libxml2-dev_2.9.0-1_win32.zip"
unzip "libxml2-dev_2.9.0-1_win32.zip" -d "${WIN32_SRC}/libxml2-2.9.0"
wget "http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/libxml2_2.9.0-1_win32.zip"
unzip "libxml2_2.9.0-1_win32.zip" -d "${WIN32_SRC}/libxml2-2.9.0"
wget "http://ftp.acc.umu.se/pub/GNOME/binaries/win32/intltool/0.40/intltool_0.40.4-1_win32.zip"
unzip "intltool_0.40.4-1_win32.zip" -d "${WIN32_SRC}/intltool_0.40.4-1_win32"
wget "https://developer.pidgin.im/static/win32/enchant_1.6.0_win32.zip"
unzip "enchant_1.6.0_win32.zip" -d "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/meanwhile-1.0.2_daa3-win32.zip"
unzip "meanwhile-1.0.2_daa3-win32.zip" -d "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/perl_5-10-0.tar.gz" -O - | tar xvz -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/tcl-8.4.5.tar.gz" -O - | tar xvz -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/gtkspell-2.0.16.tar.bz2" -O - | tar xvj -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/nss-3.16-nspr-4.10.4.tar.gz" -O - | tar xvz -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/silc-toolkit-1.1.10.tar.gz" -O - | tar xvz -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/cyrus-sasl-2.1.25.tar.gz" -O - | tar xvz -C "${WIN32_SRC}"
wget "https://developer.pidgin.im/static/win32/pidgin-inst-deps-20130214.tar.gz" -O - | tar xvz -C "${WIN32_SRC}/intltool_0.40.4-1_win32"
# We don't have Bonjour libraries installed so we exclude that protocol from the build
sed -i "s/bonjour//g" "${PIDGIN_SRC}/libpurple/protocols/Makefile.mingw"
# Disable SSL plugin as it requires Mozilla NSS library that cannot be compiled easily (see: https://developer.pidgin.im/wiki/BuildingWinNSS)
sed -i "s/.*SSL.*//g" pidgin-2.10.9/libpurple/plugins/Makefile.mingw
echo "Copying plugin source file to plugins directory to build it among other plugins ..."
cp "${PLUGIN_SRC_FILE}" "${PIDGIN_SRC}/pidgin/plugins"
sed -i "s/.*xmppconsole.dll$/xmppconsole.dll ${PLUGIN_DLL}/g" "${PIDGIN_SRC}/pidgin/plugins/Makefile.mingw"
cd "${PIDGIN_SRC}"
echo "Building ..."
make -f Makefile.mingw
cp "pidgin/plugins/${PLUGIN_DLL}" ../
echo "Done building $(readlink -f ${PLUGIN_DLL})"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment