[gedit/wip/3.14-osx: 1/5] [osx] Improve automatic build system for OS X



commit f028405b1b13994bdfceebe22db71e0a6c4dc834
Author: Jesse van den Kieboom <jessevdk gmail com>
Date:   Thu Aug 21 20:36:46 2014 +0200

    [osx] Improve automatic build system for OS X

 osx/build/.gitignore                               |    5 +
 osx/build/build                                    |  151 +++++++
 osx/build/config/jhbuildrc-gedit                   |   33 ++
 osx/build/modulesets/bootstrap.modules             |  249 ++++++++++
 osx/build/modulesets/gedit.modules                 |  474 ++++++++++++++++++++
 .../patches/berkeleydb-nonsrctree/atomic.patch     |   20 +
 .../modulesets/patches/berkeleydb/atomic.patch     |   20 +
 .../modulesets/patches/enchant/enchant-gsize.patch |   97 ++++
 .../gettext-runtime/gettext-bug33999-stpncpy.patch |   63 +++
 .../gettext-tools/gettext-bug33999-stpncpy.patch   |   63 +++
 ...1-Bug-724590-GSlice-slab_stack-corruption.patch |   28 ++
 .../gobject-introspection/girscanner-objc.patch    |   20 +
 ...722-Drag-and-Drop-sometimes-stops-working.patch |  274 +++++++++++
 ...GtkDragSourceOwner-pasteboardChangedOwner.patch |   39 ++
 .../patches/gtk+/gtk+-2-m4-creation.patch          |    5 +
 ...ed-exception-from-attempting-to-access-me.patch |   39 ++
 .../itstool/itstool.use-correct-libxml.patch       |   28 ++
 .../libxml2-Bug-686118-pthreads_once_init.patch    |   33 ++
 ...t-Merge-multiple-platform-case-statements.patch |   79 ++++
 .../modulesets/patches/readline/readline62-001     |   46 ++
 .../modulesets/patches/readline/readline62-002     |   57 +++
 .../modulesets/patches/readline/readline62-003     |   76 ++++
 .../modulesets/patches/readline/readline62-004     |  108 +++++
 ...0001-Bug-70255-Build-fails-with-glib-2.38.patch |   42 ++
 .../patches/dbus-relocatable-services.patch        |    0
 .../patches/enchant-applespell.patch               |    0
 .../patches/gedit-plugins-disable-terminal.patch   |    0
 .../patches/mac-integration-open-files.patch       |    0
 ...t-Merge-multiple-platform-case-statements.patch |   79 ++++
 .../updater/gedit-bootstrap-overrides.modules      |  119 +++++
 osx/build/updater/gedit-overrides.modules          |  174 +++++++
 osx/build/updater/update_modulesets.py             |  317 +++++++++++++
 osx/jhbuild/gedit.modules                          |  351 ---------------
 osx/jhbuild/jhbuildrc-gedit                        |   41 --
 osx/jhbuild/patches/dconf-dylib.patch              |  126 ------
 osx/jhbuild/patches/dconf-echo-escape.patch        |   12 -
 osx/jhbuild/patches/ffi-darwin11.patch             |   11 -
 osx/jhbuild/patches/glib-iconv.patch               |   18 -
 .../patches/gobject-introspection-casecmp.patch    |   11 -
 osx/jhbuild/patches/gtk-dnd-offscreen.patch        |   11 -
 osx/jhbuild/patches/gtk-introspection.patch        |   14 -
 osx/jhbuild/patches/gtk-settings-ini-xdg.patch     |   39 --
 osx/jhbuild/patches/libpeas-disable-valademo.patch |   23 -
 osx/jhbuild/patches/libpeas-pygobject-api.patch    |   25 -
 osx/jhbuild/patches/pango-coretext-invisible.patch |   32 --
 45 files changed, 2738 insertions(+), 714 deletions(-)
---
diff --git a/osx/build/.gitignore b/osx/build/.gitignore
new file mode 100644
index 0000000..fdd88bc
--- /dev/null
+++ b/osx/build/.gitignore
@@ -0,0 +1,5 @@
+.build
+.home
+updater/.cache
+updater/.gtk-osx
+updater/modulesets
diff --git a/osx/build/build b/osx/build/build
new file mode 100755
index 0000000..26b4770
--- /dev/null
+++ b/osx/build/build
@@ -0,0 +1,151 @@
+#!/bin/bash
+
+pushd $(dirname $(dirname "$0")) > /dev/null
+D=$(pwd -P)
+popd > /dev/null
+
+BASED="$D/.build"
+HOMED="$D/.home"
+
+SOURCED="$HOMED/source"
+INSTALLD="$HOMED/.local"
+
+GTK_OSX_BASE_URL="https://git.gnome.org/browse/gtk-osx/plain/";
+JHBUILD_SOURCED="$SOURCED/jhbuild"
+
+if [ -z "$GEDIT_SDK" ]; then
+       export GEDIT_SDK=10.7
+fi
+
+export PATH="$INSTALLD/bin:$PATH"
+
+function do_exit() {
+       echo "$1"
+       exit 1
+}
+
+if [ ! which git &>/dev/null ]; then
+       do_exit "You need to have git installed to build gedit for OS X"
+fi
+
+if [ ! xcodebuild -version &>/dev/null ]; then
+       do_exit "You need to have Xcode installed to build gedit for OS X"
+fi
+
+function checkout_jhbuild() {
+       #JHBUILD_REVISION=$(curl -ks "$GTK_OSX_BASE_URL/jhbuild-revision")
+
+       #if test x"$JHBUILD_REVISION" = x; then
+       #       do_exit "Could not find jhbuild revision to use."
+       #fi
+
+       mkdir -p $(dirname "$JHBUILD_SOURCED")
+
+       git clone git://git.gnome.org/jhbuild "$JHBUILD_SOURCED" || do_exit "Failed to clone jhbuild."
+       #git --work-tree "$JHBUILD_SOURCED" checkout -b stable $JHBUILD_REVISION || do_exit "Failed to 
checkout stable jhbuild revision."
+}
+
+function build_jhbuild() {
+       echo "Building jhbuild..."
+       (cd "$JHBUILD_SOURCED" && ./autogen.sh --prefix="$INSTALLD" && make -f Makefile.plain 
DISABLE_GETTEXT=1 install) >/dev/null || do_exit "Jhbuild installation failed";
+
+       rm -f "$INSTALLD/bin/python2"
+
+       cat << PYTHON2 > "$INSTALLD/bin/python2"
+#!/bin/bash
+
+exec /usr/bin/python "\$@"
+PYTHON2
+       chmod +x "$INSTALLD/bin/python2"
+}
+
+function setup_jhbuildrc() {
+       echo "Installing jhbuild configuration..."
+
+       mkdir -p "$HOMED"
+    curl -ks "$GTK_OSX_BASE_URL/jhbuildrc-gtk-osx" | \
+       sed -e 's/^.*PYTHONPATH.*$//g' -e 's/^.*PYTHON_SITE_PACKAGES.*$//g' > "$HOMED/.jhbuildrc" || do_exit 
"Failed to get jhbuildrc."
+
+    rm -f "$HOMED/.jhbuildrc-gedit"
+    ln -s "$D/config/jhbuildrc-gedit" "$HOMED/.jhbuildrc-gedit" || exit 1
+}
+
+function cmd_init() {
+       mkdir -p "$SOURCED"
+
+       if [ ! -d "$JHBUILD_SOURCED" ]; then
+               checkout_jhbuild
+       fi
+
+       build_jhbuild
+       setup_jhbuildrc
+}
+
+function cmd_bootstrap() {
+       # Built python once
+       cmd_jh bootstrap -q python || exit 1
+
+       # Built python twice! There is a bug where python somehow manages to link
+       # its main binary to the system framework library, which then doesn't work...
+       # Building python again seems to resolve the issue...
+       cmd_jh bootstrap -q -f -t python python || exit 1
+
+       # Bootstrap all the rest
+       cmd_jh bootstrap -q || exit 1
+}
+
+function cmd_jh() {
+       # Setup our jhbuild environment
+       export GEDIT_OSX_SOURCE_BASE="$D"
+       export GEDIT_OSX_BUILD_BASE="$BASED"
+       export HOME="$HOMED"
+       export JHB=gedit
+
+       "$INSTALLD/bin/jhbuild" -f "$HOMED/.jhbuildrc" "$@"
+}
+
+function cmd_shell() {
+       cmd_jh shell
+}
+
+function cmd_all() {
+       if [ ! -d "$JHBUILD_SOURCED" ]; then
+               echo "init..."
+               cmd_init || exit 1
+       fi
+
+       if [ ! -f "$BASED/$GEDIT_SDK/inst/bin/python" ]; then
+               echo "bootstrap"
+               cmd_bootstrap || exit 1
+       fi
+
+       cmd_jh build -q
+}
+
+commands=()
+
+while read line
+do
+       cmd=${line#declare -f }
+
+       if [[ "$cmd" = cmd_* ]]; then
+               commands+=(${cmd#cmd_})
+       fi
+done < <(declare -F)
+
+cmds=$(printf ", %s" "${commands[ ]}")
+cmds=${cmds:2}
+
+if [ -z "$1" ]; then
+       cmd_all
+       exit 0
+fi
+
+cmd="cmd_$1"
+
+if [[ $(type -t "$cmd") != "function" ]]; then
+       do_exit "Invalid command $1, available commands are: $cmds"
+fi
+
+shift 1
+"$cmd" "$@"
diff --git a/osx/build/config/jhbuildrc-gedit b/osx/build/config/jhbuildrc-gedit
new file mode 100644
index 0000000..c0a0a2d
--- /dev/null
+++ b/osx/build/config/jhbuildrc-gedit
@@ -0,0 +1,33 @@
+# -*- mode: python -*-
+
+import sys, os
+
+_gsdk = os.environ.get('GEDIT_SDK', None)
+
+if not _gsdk:
+    sys.stderr.write("No GEDIT_SDK environment given. Please provide 10.x\n")
+    sys.exit(1)
+
+_basedir = os.environ['GEDIT_OSX_BUILD_BASE']
+
+if not _basedir:
+    sys.stderr.write("No GEDIT_OSX_BASE environment given. Please provide the base build directory\n")
+    sys.exit(1)
+
+_sourcedir = os.environ['GEDIT_OSX_SOURCE_BASE']
+
+if not _sourcedir:
+    sys.stderr.write("No GEDIT_OSX_SOURCE_BASE environment given. Please provide the base source 
directory\n")
+    sys.exit(1)
+
+checkoutroot = os.path.join(_basedir, _gsdk, "source")
+prefix = os.path.join(_basedir, _gsdk, "inst")
+tarballdir = os.path.join(_basedir, "pkgs")
+
+# Main setup
+setup_sdk(target=_gsdk, sdk_version=_gsdk, architectures=['x86_64'])
+
+# Main module set
+modulesets_dir = os.path.join(_sourcedir, "modulesets")
+moduleset = "gedit.modules"
+modules = ["gedit"]
diff --git a/osx/build/modulesets/bootstrap.modules b/osx/build/modulesets/bootstrap.modules
new file mode 100644
index 0000000..0c5eb9a
--- /dev/null
+++ b/osx/build/modulesets/bootstrap.modules
@@ -0,0 +1,249 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE moduleset SYSTEM "moduleset.dtd">
+<moduleset><repository type="tarball" name="xmlsoft.org" href="ftp://xmlsoft.org/libxml2/"/>
+  <repository type="tarball" name="intltool" href="http://launchpad.net/intltool/trunk/"/>
+
+  <repository type="tarball" name="cmake" href="http://www.cmake.org/files/"/>
+  <repository type="tarball" name="python" href="http://www.python.org/ftp/python/"/>
+  <repository type="tarball" name="apache.org" href="http://archive.apache.org/dist/"/>
+  <repository type="tarball" name="pkgconfig" href="http://pkgconfig.freedesktop.org/releases/"/>
+  <repository type="tarball" name="tukaani.org" href="http://tukaani.org/"/>
+  <repository type="tarball" name="itstool.org" href="http://files.itstool.org/itstool/"/>
+  <repository type="tarball" name="sourceforge" href="http://downloads.sourceforge.net/sourceforge/"/>
+  <repository type="tarball" name="cpan" href="http://search.cpan.org/CPAN/"/>
+  <repository type="tarball" name="ftp.gnome.org" default="yes" 
href="ftp://ftp.gnome.org/pub/gnome/sources/"/>
+  <repository type="tarball" name="oracle" href="http://download.oracle.com/"/>
+
+  <repository type="tarball" name="ftp.gnu.org" href="ftp://ftp.gnu.org/gnu/"/>
+  <autotools id="berkeleydb-nonsrctree" autogen-sh="configure" 
autogen-template="%(srcdir)s/dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s %(autogenargs)s">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb-nonsrctree/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="berkeleydb" autogen-sh="configure" supports-non-srcdir-builds="no" makeargs="-C build_unix" 
autogen-template="cd build_unix; ../dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s 
%(autogenargs)s" makeinstallargs="-C build_unix install">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="readline" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="readline/readline-6.2.tar.gz" version="6.2">
+      <patch file="readline/readline62-001" strip="0"/>
+      <patch file="readline/readline62-002" strip="0"/>
+      <patch file="readline/readline62-003" strip="0"/>
+      <patch file="readline/readline62-004" strip="0"/>
+    </branch>
+  </autotools>
+
+  <autotools id="gettext-runtime" autogen-sh="configure" autogenargs="--without-emacs --disable-java 
--disable-native-java --disable-libasprintf --disable-csharp">
+    <branch repo="ftp.gnu.org" source-subdir="gettext-runtime" module="gettext/gettext-0.18.1.1.tar.gz" 
version="0.18.1.1" size="15139737" md5sum="3dd55b952826d2b32f51308f2f91aa89">
+      <patch file="gettext-runtime/gettext-bug33999-stpncpy.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="python" autogenargs="--enable-shared" autogen-sh="configure">
+    <branch repo="python" module="2.7.6/Python-2.7.6.tar.xz" version="2.7.6">
+    </branch>
+    <dependencies>
+      <dep package="gettext-runtime"/>
+      <dep package="readline"/>
+    </dependencies>
+    <after>
+      <dep package="berkeleydb"/>
+      <dep package="berkeleydb-nonsrctree"/>
+    </after>
+  </autotools>
+
+  <autotools id="itstool" autogen-sh="autoreconf">
+    <branch repo="itstool.org" module="itstool-2.0.2.tar.bz2" version="2.0.2" 
hash="sha256:bf909fb59b11a646681a8534d5700fec99be83bb2c57badf8c1844512227033a" size="96748">
+      <patch file="itstool/itstool.use-correct-libxml.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="yelp-xsl" autogen-sh="configure">
+    <branch module="yelp-xsl/3.12/yelp-xsl-3.12.0.tar.xz" version="3.12.0" 
hash="sha256:dd0b8af338b1cdae50444273d7c761e3f511224421487311103edc95a4493656" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="libxml2"/>
+      <dep package="intltool"/>
+      <dep package="itstool"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="libxml2" autogen-sh="configure" autogenargs="--with-python">
+    <branch version="2.9.0" module="libxml2-2.9.0.tar.gz" repo="xmlsoft.org">
+      <patch file="libxml2/libxml2-Bug-686118-pthreads_once_init.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="python"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="apr">
+    <branch repo="apache.org" module="apr/apr-1.4.5.tar.bz2" version="1.4.5"/>
+  </autotools>
+
+  <autotools id="yelp-tools" autogen-sh="configure">
+    <branch module="yelp-tools/3.13/yelp-tools-3.13.3.tar.xz" version="3.13.3" 
hash="sha256:20067061736e3d4ec05fc364a71d8e5d06b230528b6b7a16cb41e03c9bf3b8c6" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="libxml2"/>
+      <dep package="intltool"/>
+      <dep package="yelp-xsl"/>
+      <dep package="itstool"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="libxslt" autogen-sh="configure">
+    <branch version="1.1.27" module="libxslt-1.1.27.tar.gz" repo="xmlsoft.org"/>
+    <dependencies>
+      <dep package="libxml2"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="apr-util" autogenargs="--with-apr=$PREFIX/bin/apr-1-config">
+    <branch repo="apache.org" module="apr/apr-util-1.3.12.tar.bz2" version="1.3.12"/>
+    <dependencies>
+      <dep package="apr"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="intltool" autogen-sh="configure">
+    <branch repo="intltool" module="0.50.2/+download/intltool-0.50.2.tar.gz" version="0.50.2" 
hash="md5:23fbd879118253cb99aeac067da5f591"/>
+    <dependencies>
+      <dep package="gnome-common"/>
+      <dep package="perl-xml-parser"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="gnome-common">
+     <branch module="gnome-common/3.12/gnome-common-3.12.0.tar.xz" version="3.12.0" 
hash="sha256:18712bc2df6b2dd88a11b9f7f874096d1c0c6e7ebc9cfc0686ef963bd590e1d8" repo="ftp.gnome.org"/>
+  </autotools>
+  <autotools id="gtk-doc" autogenargs="--disable-scrollkeeper 
--with-xml-catalog=$JHBUILD_PREFIX/etc/xml/catalog" makeargs="-k -i" makeinstallargs="-k -i install" 
autogen-sh="configure">
+    <branch version="1.21" module="gtk-doc/1.21/gtk-doc-1.21.tar.xz" 
hash="sha256:5d934d012ee08edd1585544792efa80da271652587ba5b843d2cea8e8b80ee3e" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="yelp-tools"/>
+    </dependencies>
+  </autotools>
+<autotools id="gtk-osx-docbook" autogen-sh="configure" supports-non-srcdir-builds="no">
+     <branch repo="sourceforge" module="gtk-osx/gtk-osx-docbook-1.1.tar.gz" version="1.1"/>
+  </autotools>
+
+  <perl id="perl-xml-simple">
+    <branch repo="cpan" module="authors/id/G/GR/GRANTM/XML-Simple-2.20.tar.gz" version="2.20" size="75993" 
md5sum="4d10964e123b76eca36678464daa63cd"/>
+    <dependencies>
+      <dep package="perl-xml-parser"/>
+    </dependencies>
+  </perl>
+
+  <perl id="perl-xml-parser" makeargs="EXPATLIBPATH=${prefix}/lib EXPATINCPATH=${prefix}/include">
+    <branch repo="cpan" module="authors/id/T/TO/TODDR/XML-Parser-2.41.tar.gz" version="2.41"/>
+    <dependencies>
+      <dep package="expat"/>
+    </dependencies>
+  </perl>
+
+  <autotools id="expat" autogen-sh="configure">
+    <branch module="expat/expat-2.1.0.tar.gz" version="2.1.0" repo="sourceforge"/>
+  </autotools>
+
+  <autotools id="flex" autogen-sh="configure">
+    <branch repo="sourceforge" module="flex/flex-2.5.37.tar.bz2" version="2.5.37"/>
+  </autotools>
+
+  <autotools id="bison" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="bison/bison-2.6.3.tar.bz2" version="2.6.3"/>
+  </autotools>
+
+  <autotools id="pkg-config" autogen-sh="configure">
+    <branch repo="pkgconfig" module="pkg-config-0.25.tar.gz" version="0.25"/>
+  </autotools>
+
+  <autotools id="automake-1.13" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="automake/automake-1.13.1.tar.xz" version="1.13.1"/>
+  </autotools>
+
+<autotools id="automake-1.12" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="automake/automake-1.12.6.tar.xz" version="1.12.6"/>
+  </autotools>
+
+  <autotools id="automake-1.11" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="automake/automake-1.11.6.tar.xz" version="1.11.6"/>
+  </autotools>
+
+  <autotools id="automake-1.10" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="automake/automake-1.10.3.tar.bz2" version="1.10.3" size="957505" 
md5sum="b8e67fb458da396bc35555af7ef2b49f"/>
+  </autotools>
+
+  <autotools id="libtool" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="libtool/libtool-2.4.2.tar.gz" version="2.4.2"/>
+  </autotools>
+
+  <autotools id="autoconf" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="autoconf/autoconf-2.69.tar.xz" version="2.69"/>
+    <dependencies>
+      <dep package="m4"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="m4" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="m4/m4-1.4.16.tar.bz2" version="1.4.16"/>
+  </autotools>
+
+  <autotools id="cmake" autogen-sh="bootstrap" autogen-template="%(srcdir)s/%(autogen-sh)s 
--prefix=%(prefix)s %(autogenargs)s">
+    <branch repo="cmake" module="v2.8/cmake-2.8.12.tar.gz" version="2.8.12"/>
+  </autotools>
+
+  <autotools id="gettext-tools" autogen-sh="configure" autogenargs="--without-emacs --disable-java 
--disable-native-java --disable-libasprintf --disable-csharp --with-included-glib">
+    <branch repo="ftp.gnu.org" source-subdir="gettext-tools" module="gettext/gettext-0.18.1.1.tar.gz" 
version="0.18.1.1" size="15139737" md5sum="3dd55b952826d2b32f51308f2f91aa89">
+      <patch file="gettext-tools/gettext-bug33999-stpncpy.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="subversion">
+    <branch repo="apache.org" module="subversion/subversion-1.5.9.tar.bz2" version="1.5.9"/>
+    <dependencies>
+      <dep package="apr-util"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="make">
+    <branch repo="ftp.gnu.org" module="make/make-3.82.tar.gz" version="3.82"/>
+  </autotools>
+
+  <autotools id="xz" autogen-sh="configure">
+    <branch repo="tukaani.org" module="xz/xz-5.0.4.tar.bz2" version="5.0.4"/>
+  </autotools>
+
+  <metamodule id="meta-bootstrap">
+    <dependencies>
+      <dep package="xz"/>
+      <dep package="make"/>     <!-- Needed for Tiger, skipped otherwise -->
+      <dep package="subversion"/>   <!-- Needed for Tiger, skipped otherwise -->
+      <dep package="gettext-tools"/> <!-- Needed for 64-bit -->
+      <dep package="cmake"/>
+      <dep package="m4"/>      <!-- Can be skipped for Leopard and later -->
+      <dep package="autoconf"/>
+      <dep package="libtool"/>
+      <dep package="automake-1.10"/>
+      <dep package="automake-1.11"/>
+      <dep package="automake-1.12"/>
+      <dep package="automake-1.13"/>
+      <dep package="pkg-config"/>
+      <dep package="bison"/>   <!-- included for Tiger, skipped otherwise -->
+      <dep package="flex"/>    <!-- included for Tiger, skipped otherwise -->
+      <dep package="expat"/>
+      <dep package="perl-xml-parser"/>
+      <dep package="perl-xml-simple"/>
+      <dep package="gtk-osx-docbook"/>
+      <dep package="gtk-doc"/>
+      <dep package="gnome-common"/>
+      <dep package="intltool"/>
+   </dependencies>
+  </metamodule>
+
+</moduleset>
diff --git a/osx/build/modulesets/gedit.modules b/osx/build/modulesets/gedit.modules
new file mode 100644
index 0000000..0156e22
--- /dev/null
+++ b/osx/build/modulesets/gedit.modules
@@ -0,0 +1,474 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE moduleset SYSTEM "moduleset.dtd">
+<moduleset><repository type="tarball" name="xmlsoft.org" href="ftp://xmlsoft.org/libxml2/"/>
+  <repository type="tarball" name="icon-theme" href="http://icon-theme.freedesktop.org/releases/"/>
+  <repository type="tarball" name="harfbuzz" href="http://www.freedesktop.org/software/harfbuzz/release/"/>
+  <repository type="tarball" name="cups" href="http://ftp.easysw.com/pub/"/>
+
+  <repository type="tarball" name="iso-codes" href="http://pkg-isocodes.alioth.debian.org/downloads/"/>
+  <repository type="tarball" name="python" href="https://www.python.org/ftp/python/"/>
+  <repository type="tarball" name="libtiff" href="http://download.osgeo.org/"/>
+  <repository type="tarball" name="cairographics.org" href="http://cairographics.org/releases/"/>
+  <repository type="tarball" name="cairographics" href="http://cairographics.org/releases/"/>
+
+  <repository type="tarball" name="fontconfig" 
href="http://www.freedesktop.org/software/fontconfig/release/"/>
+  <repository type="tarball" name="tango.freedesktop.org" href="http://tango.freedesktop.org/releases/"/>
+  <repository type="tarball" name="ftp.gnu.org" href="ftp://ftp.gnu.org/gnu/"/>
+  <repository type="git" name="git.gnome.org" href="git://git.gnome.org/"/>
+  <repository type="tarball" name="hadess" href="http://freedesktop.org/~hadess/"/>
+  <repository type="tarball" name="ftp.gnome.org" default="yes" 
href="ftp://ftp.gnome.org/pub/gnome/sources/"/>
+  <repository type="tarball" name="abisource/enchant" href="http://www.abisource.com/downloads/enchant/"/>
+  <repository type="tarball" name="oracle" href="http://download.oracle.com/"/>
+  <repository type="tarball" name="jpeg" href="http://www.ijg.org/files/"/>
+  <repository type="tarball" name="sourceforge" href="http://downloads.sourceforge.net/sourceforge/"/>
+  <repository type="tarball" name="sourceware.org" href="ftp://sourceware.org/pub/"/>
+
+  <autotools id="zlib" autogen-sh="configure" skip-autogen="never" supports-non-srcdir-builds="no">
+    <branch repo="sourceforge" version="1.2.7" module="libpng/zlib-1.2.7.tar.gz"/>
+  </autotools>
+
+  <autotools id="libcroco" autogenargs="--disable-Bsymbolic" autogen-sh="configure">
+    <branch module="libcroco/0.6/libcroco-0.6.8.tar.xz" version="0.6.8" 
hash="sha256:ea6e1b858c55219cefd7109756bff5bc1a774ba7a55f7d3ccd734d6b871b8570" repo="ftp.gnome.org"/>
+  </autotools>
+
+  <autotools id="harfbuzz" autogen-sh="configure" autogenargs="--with-coretext">
+    <branch repo="harfbuzz" module="harfbuzz-0.9.26.tar.bz2" version="0.9.26"/>
+    <dependencies>
+      <dep package="freetype"/>
+      <dep package="fontconfig"/>
+      <dep package="glib"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="freetype" autogen-sh="configure" skip-autogen="never" autogenargs="--without-bzip2">
+    <branch module="freetype/freetype-2.5.2.tar.gz" version="2.5.2" repo="sourceforge">
+    </branch>
+    <dependencies>
+      <dep package="zlib"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="fontconfig" autogen-sh="autoreconf" autogenargs="--disable-docs">
+    <branch repo="fontconfig" version="2.11.0" module="fontconfig-2.11.0.tar.gz"/>
+    <dependencies>
+      <dep package="freetype"/>
+    </dependencies>
+  </autotools>
+
+<autotools id="pixman" autogenargs="--disable-gtk" autogen-sh="configure">
+    <branch version="0.30.2" module="pixman-0.30.2.tar.gz" repo="cairographics" 
hash="sha1:59cc9cd91a2394b7c0aa90ffc7c141f06d75f066"/>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="gnome-icon-theme" autogen-sh="configure">
+    <branch module="gnome-icon-theme/3.12/gnome-icon-theme-3.12.0.tar.xz" version="3.12.0" 
hash="sha256:359e720b9202d3aba8d477752c4cd11eced368182281d51ffd64c8572b4e503a" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="hicolor-icon-theme"/>
+      <dep package="icon-naming-utils"/>
+    </dependencies>
+  </autotools>
+
+ <autotools id="librsvg" autogenargs="--disable-Bsymbolic">
+    <branch module="librsvg/2.40/librsvg-2.40.3.tar.xz" version="2.40.3" 
hash="sha256:eb2755fe8bf0aa5b439bcf94edc880f08396b4c79fd54c73147df0607c63c98f" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="libcroco"/>
+    </dependencies>
+  </autotools>
+
+  <metamodule id="meta-gtk-osx-freetype">
+    <dependencies>
+      <dep package="freetype"/>
+      <dep package="fontconfig"/>
+      <dep package="harfbuzz"/>
+    </dependencies>
+  </metamodule>
+
+<autotools id="libxml2" autogen-sh="configure" autogenargs="--with-python">
+    <branch version="2.9.0" module="libxml2-2.9.0.tar.gz" repo="xmlsoft.org">
+      <patch file="libxml2/libxml2-Bug-686118-pthreads_once_init.patch" strip="1"/>
+    </branch>
+    <after>
+      <dep package="python"/>
+      <dep package="python3"/>
+    </after>
+  </autotools>
+
+  <autotools id="libffi" autogenargs="--disable-builddir" autogen-sh="configure">
+    <branch module="libffi/libffi-3.0.13.tar.gz" repo="sourceware.org" version="3.0.13" 
checkoutdir="atgreen-libffi-873d687"/>
+  </autotools>
+
+<autotools id="python" autogenargs="--enable-shared" autogen-sh="configure">
+    <branch repo="python" module="2.7.6/Python-2.7.6.tar.xz" version="2.7.6">
+    </branch>
+    <dependencies>
+      <dep package="gettext-runtime"/>
+      <dep package="readline"/>
+    </dependencies>
+    <after>
+      <dep package="berkeleydb"/>
+      <dep package="berkeleydb-nonsrctree"/>
+    </after>
+  </autotools>
+
+  <autotools id="cairo" autogen-sh="configure" autogenargs="--enable-pdf --enable-quartz --enable-xlib=no 
--without-x">
+    <branch module="cairo-1.12.16.tar.xz" version="1.12.16" repo="cairographics" 
hash="sha1:4f6e337d5d3edd7ea79d1426f575331552b003ec">
+    </branch>
+    <dependencies>
+      <dep package="pixman"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="fontconfig"/>
+      <dep package="freetype"/>
+    </after>
+  </autotools>
+
+  <autotools id="berkeleydb-nonsrctree" autogen-sh="configure" 
autogen-template="%(srcdir)s/dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s %(autogenargs)s">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb-nonsrctree/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="berkeleydb" autogen-sh="configure" supports-non-srcdir-builds="no" makeargs="-C build_unix" 
autogen-template="cd build_unix; ../dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s 
%(autogenargs)s" makeinstallargs="-C build_unix install">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="adwaita-icon-theme" autogen-sh="configure">
+    <branch module="adwaita-icon-theme/3.13/adwaita-icon-theme-3.13.5.tar.xz" version="3.13.5" 
hash="sha256:e163f5f7e205b5f5345dd7f2c30d4104f19376217ca90def83b61a9459a62dbc" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="hicolor-icon-theme"/>
+      <dep package="icon-naming-utils"/>
+      <dep package="librsvg"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="gnome-themes-standard" autogen-sh="configure" autogenargs="--disable-gtk2-engine">
+    <branch module="gnome-themes-standard/3.13/gnome-themes-standard-3.13.4.tar.xz" version="3.13.4" 
hash="sha256:a1b55eb37c290f406b799572f0f3455fca7af1ec058b7ce36650a2e27af316b3" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="librsvg"/>
+      <dep package="gnome-icon-theme"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="icon-naming-utils" autogen-sh="configure">
+    <branch repo="tango.freedesktop.org" version="0.8.90" module="icon-naming-utils-0.8.90.tar.bz2" 
hash="md5:dd8108b56130b9eedc4042df634efa66"/>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="gtk+" autogen-sh="autoreconf" autogenargs="--with-gdktarget=quartz 
--enable-quartz-relocation --disable-introspection">
+    <branch module="gtk+/2.24/gtk+-2.24.21.tar.xz" version="2.24.21" 
hash="sha256:302e9216dd19ec4b5b9e2f77275e23758253f7e86b06287284d8e794ef38dce3" repo="ftp.gnome.org">
+      <!--patch 
file="http://git.gnome.org/browse/gtk-osx/plain/patches/0004-Bug-571582-GtkSelection-implementation-for-quartz.patch";
 strip="1"/-->
+      <patch file="gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch" strip="1"/>
+      <patch file="gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch" strip="1"/>
+<patch file="gtk+/gtk+-2-m4-creation.patch" strip="1"/>
+   </branch>
+    <dependencies>
+      <dep package="glib"/>
+      <dep package="pango"/>
+      <dep package="atk"/>
+      <dep package="gdk-pixbuf"/>
+      <dep package="gobject-introspection"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="gobject-introspection" autogen-sh="configure">
+    <branch module="gobject-introspection/1.41/gobject-introspection-1.41.4.tar.xz" version="1.41.4" 
hash="sha256:b26b41283073d8890afab6a64796d164d2a07bfa220daa554285ba0ad240acf9" repo="ftp.gnome.org">
+      <patch file="gobject-introspection/girscanner-objc.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+      <dep package="cairo"/>
+    </dependencies>
+    <after>
+      <dep package="python"/>
+    </after>
+  </autotools>
+
+ <autotools id="gdk-pixbuf" autogen-sh="configure">
+    <branch module="gdk-pixbuf/2.31/gdk-pixbuf-2.31.0.tar.xz" version="2.31.0" 
hash="sha256:4121f4258af1a3fde70029396314d31ae54cf8fa2b4ea0bff842acf8f195bd78" repo="ftp.gnome.org"/>
+    <after>
+      <dep package="pango"/>
+    </after>
+  </autotools>
+
+  <autotools id="atk" autogen-sh="configure">
+    <branch module="atk/2.13/atk-2.13.90.tar.xz" version="2.13.90" 
hash="sha256:66a1ddf2ee3e8251012d428740549d7ac176135451927bcc4c332e3ed12dfc47" repo="ftp.gnome.org"/>
+    <dependencies>
+    </dependencies>
+    <after>
+      <dep package="glib"/>
+      <dep package="glib"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="pango" autogen-sh="autoreconf">
+    <branch version="1.36.6" module="pango/1.36/pango-1.36.6.tar.xz" 
hash="sha256:4c53c752823723875078b91340f32136aadb99e91c0f6483f024f978a02c8624" repo="ftp.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="cairo"/>
+     </dependencies>
+    <after>
+      <dep package="gobject-introspection"/>
+      <dep package="meta-gtk-osx-freetype"/>
+      <dep package="glib"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="libxslt" autogen-sh="configure">
+    <branch version="1.1.27" module="libxslt-1.1.27.tar.gz" repo="xmlsoft.org"/>
+    <dependencies>
+      <dep package="libxml2"/>
+    </dependencies>
+  </autotools>
+
+<autotools id="glib" autogen-sh="autoreconf">
+    <branch module="glib/2.41/glib-2.41.3.tar.xz" version="2.41.3" 
hash="sha256:10ab9bdeb5c0bbe8ef0ce26ec79ce1887b6967b6ffcce86ee685e86c7c9c7b4f" repo="ftp.gnome.org">
+      <patch file="glib/0001-Bug-724590-GSlice-slab_stack-corruption.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="libffi"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="pygobject3" autogen-sh="configure --with-python=python3">
+    <branch version="3.13.90" module="pygobject/3.13/pygobject-3.13.90.tar.xz" 
hash="sha256:c4c8c62ba5e8c2444d39f501cf8c65ac7c866a73b69348384c9d5567c11d09e9" repo="ftp.gnome.org">
+      <patch file="pygobject3/pygobject-Merge-multiple-platform-case-statements.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </dependencies>
+    <after>
+      <dep package="python"/>
+      <dep package="python3"/>
+    </after>
+  </autotools>
+
+  <waf id="pycairo-python3" autogen-sh="configure" python-command="python3">
+    <branch module="pycairo-1.10.0.tar.bz2" repo="cairographics.org" version="1.10.0" 
hash="sha1:b4283aa1cc9aafd12fd72ad371303a486da1d014"/>
+    <dependencies>
+      <dep package="python3"/>
+      <dep package="cairo"/>
+    </dependencies>
+    <after>
+      <dep package="python3"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </after>
+  </waf>
+
+  <autotools id="python3" autogenargs="--enable-shared" autogen-sh="configure">
+    <branch repo="python" module="3.3.2/Python-3.3.2.tar.xz" version="3.3.2"/>
+    <dependencies>
+      <dep package="gettext-runtime"/>
+      <dep package="readline"/>
+    </dependencies>
+    <after>
+      <dep package="berkeleydb"/>
+      <dep package="berkeleydb-nonsrctree"/>
+    </after>
+  </autotools>
+
+  <metamodule id="meta-gtk-osx-gtk3-core-themes">
+    <dependencies>
+      <dep package="icon-naming-utils"/>
+      <dep package="gnome-themes-standard"/>
+      <dep package="adwaita-icon-theme"/>
+    </dependencies>
+  </metamodule>
+
+  <autotools id="gtk-mac-integration" autogen-sh="configure" autogenargs="--disable-python">
+    <branch module="gtk-mac-integration/2.0/gtk-mac-integration-2.0.5.tar.xz" version="2.0.5" 
hash="sha256:6c4ff7501d7ff35e49068052d80fcf76ce494e5953c5f3967e4958b1b0c67b9f" repo="ftp.gnome.org">
+      <patch file="gtk-mac-integration/0001-Fix-unhandled-exception-from-attempting-to-access-me.patch" 
strip="1"/>
+    </branch>
+    <dependencies>
+    </dependencies>
+    <after>
+      <dep package="gtk+"/>
+      <dep package="gtk+-3.0"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+<autotools id="gtk+-3.0" autogen-sh="autogen.sh" autogenargs="--enable-quartz-backend 
--enable-quartz-relocation">
+    <branch module="gtk+/3.13/gtk+-3.13.7.tar.xz" version="3.13.7" 
hash="sha256:23db0fb9b8b8213dbfd5a5f4077904b778145ca37f622bd73961529e69878bb4" repo="ftp.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+      <dep package="pango"/>
+      <dep package="atk"/>
+      <dep package="gdk-pixbuf"/>
+      <dep package="gobject-introspection"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="hicolor-icon-theme" autogen-sh="configure" supports-non-srcdir-builds="no">
+    <branch module="hicolor-icon-theme-0.11.tar.gz" repo="icon-theme" version="0.11"/>
+
+  </autotools>
+
+  <autotools id="gnome-doc-utils" autogenargs="--disable-scrollkeeper" autogen-sh="configure" 
supports-non-srcdir-builds="no">
+    <branch module="gnome-doc-utils/0.20/gnome-doc-utils-0.20.10.tar.xz" version="0.20.10" 
hash="sha256:cb0639ffa9550b6ddf3b62f3b1add92fb92ab4690d351f2353cffe668be8c4a6" repo="ftp.gnome.org"/>
+    <dependencies>
+      <dep package="libxslt"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="gettext-runtime" autogen-sh="configure" autogenargs="--without-emacs --disable-java 
--disable-native-java --disable-libasprintf --disable-csharp">
+    <branch repo="ftp.gnu.org" source-subdir="gettext-runtime" module="gettext/gettext-0.18.1.1.tar.gz" 
version="0.18.1.1" size="15139737" md5sum="3dd55b952826d2b32f51308f2f91aa89">
+      <patch file="gettext-runtime/gettext-bug33999-stpncpy.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="libtiff" autogen-sh="configure" autogenargs="--without-x --without-apple-opengl-framework">
+    <branch version="3.9.5" module="libtiff/tiff-3.9.5.tar.gz" repo="libtiff"/>
+    <dependencies>
+      <dep package="libjpeg"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="libjpeg" autogen-sh="configure">
+    <branch module="jpegsrc.v8d.tar.gz" version="8c" repo="jpeg" checkoutdir="jpeg-8d">
+    </branch>
+  </autotools>
+
+  <autotools id="libpng" autogenargs="--enable-shared" autogen-sh="configure">
+    <branch version="1.5.13" module="libpng/libpng-1.5.13.tar.bz2" repo="sourceforge"/>
+  </autotools>
+
+  <autotools id="cups" autogen-sh="configure" skip-autogen="never" 
autogenargs="DSOFLAGS=&quot;$LDFLAGS&quot;">
+    <branch module="cups/1.2.12/cups-1.2.12-source.tar.bz2" version="1.2.12" repo="cups" 
checkoutdir="cups-1.2.12"/>
+    <dependencies>
+      <dep package="libtiff"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="readline" autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="readline/readline-6.2.tar.gz" version="6.2">
+      <patch file="readline/readline62-001" strip="0"/>
+      <patch file="readline/readline62-002" strip="0"/>
+      <patch file="readline/readline62-003" strip="0"/>
+      <patch file="readline/readline62-004" strip="0"/>
+    </branch>
+  </autotools>
+
+  <autotools id="shared-mime-info" autogen-sh="configure" supports-non-srcdir-builds="no">
+    <branch module="shared-mime-info-1.2.tar.xz" version="1.2" repo="hadess">
+      <patch file="shared-mime-info/0001-Bug-70255-Build-fails-with-glib-2.38.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="iso-codes" autogen-sh="configure">
+    <branch module="iso-codes-3.51.tar.xz" version="3.51" repo="iso-codes"/>
+  </autotools>
+
+  <autotools id="gsettings-desktop-schemas">
+    <branch module="gsettings-desktop-schemas/3.13/gsettings-desktop-schemas-3.13.91.tar.xz" 
version="3.13.91" hash="sha256:dee7c4977cc19a1324451cfa0696da8a2ff7a591c6d5e4afb910c540de8a2562" 
repo="ftp.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="glib"/>
+    </dependencies>
+  </autotools>
+
+   <autotools id="enchant" autogen-sh="configure" autogenargs="--with-myspell-dir=/Library/Dictionaries">
+    <branch module="1.6.0/enchant-1.6.0.tar.gz" version="1.6.0" repo="abisource/enchant">
+ <patch file="enchant/enchant-gsize.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+    </dependencies>
+  </autotools>
+
+   <autotools id="gtksourceview3">
+    <branch module="gtksourceview" tag="4bf401661a4ca1b204a62bddfc99aacb56f429ce" repo="git.gnome.org">
+    </branch>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </after>
+  </autotools>
+
+<autotools id="libpeas" autogenargs="PYTHON=python3 --disable-python2 --enable-python3">
+    <branch module="libpeas" tag="3403cbe36922517be8e19fdf506274d54d29fd92" repo="git.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="python3"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+      <dep package="pycairo-python3"/>
+      <dep package="pygobject3"/>
+    </dependencies>
+  </autotools>
+
+  <metamodule id="meta-gtk-osx-gtk3">
+    <dependencies>
+      <dep package="gtk+-3.0"/>
+      <dep package="gtk-mac-integration"/>
+      <dep package="meta-gtk-osx-gtk3-core-themes"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </metamodule>
+
+  <metamodule id="meta-gtk-osx-bootstrap">
+    <dependencies>
+      <dep package="readline"/>
+      <dep package="cups"/>
+      <dep package="libpng"/>
+      <dep package="libjpeg"/>
+      <dep package="libtiff"/>
+      <dep package="gettext-runtime"/>
+      <dep package="gnome-doc-utils"/>
+      <dep package="hicolor-icon-theme"/>
+    </dependencies>
+  </metamodule>
+
+  <metamodule id="gedit-deps">
+    <dependencies>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+      <dep package="libpeas"/>
+      <dep package="gtksourceview3"/>
+      <dep package="enchant"/>
+      <dep package="gsettings-desktop-schemas"/>
+      <dep package="iso-codes"/>
+      <dep package="shared-mime-info"/>
+    </dependencies>
+  </metamodule>
+
+  <metamodule id="gedit-meta">
+    <dependencies>
+      <dep package="gedit-deps"/>
+      <!--<dep package="gedit-plugins"/>-->
+    </dependencies>
+  </metamodule>
+
+  <autotools id="gedit" autogenargs="PYTHON=python3">
+    <branch repo="git.gnome.org" module="gedit" revision="wip/3.14-osx"/>
+    <dependencies>
+      <dep package="gedit-meta"/>
+    </dependencies>
+  </autotools>
+</moduleset>
diff --git a/osx/build/modulesets/patches/berkeleydb-nonsrctree/atomic.patch 
b/osx/build/modulesets/patches/berkeleydb-nonsrctree/atomic.patch
new file mode 100644
index 0000000..398aa1d
--- /dev/null
+++ b/osx/build/modulesets/patches/berkeleydb-nonsrctree/atomic.patch
@@ -0,0 +1,20 @@
+--- src/dbinc/atomic.h 2013-03-12 14:07:22.000000000 -0400
++++ src/dbinc/atomic.h.change  2013-03-12 14:06:35.000000000 -0400
+@@ -144,7 +144,7 @@
+ #define       atomic_inc(env, p)      __atomic_inc(p)
+ #define       atomic_dec(env, p)      __atomic_dec(p)
+ #define       atomic_compare_exchange(env, p, o, n)   \
+-      __atomic_compare_exchange((p), (o), (n))
++      __atomic_compare_exchange_db((p), (o), (n))
+ static inline int __atomic_inc(db_atomic_t *p)
+ {
+       int     temp;
+@@ -176,7 +176,7 @@
+  * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
+  * which configure could be changed to use.
+  */
+-static inline int __atomic_compare_exchange(
++static inline int __atomic_compare_exchange_db(
+       db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval)
+ {
+       atomic_value_t was;
diff --git a/osx/build/modulesets/patches/berkeleydb/atomic.patch 
b/osx/build/modulesets/patches/berkeleydb/atomic.patch
new file mode 100644
index 0000000..398aa1d
--- /dev/null
+++ b/osx/build/modulesets/patches/berkeleydb/atomic.patch
@@ -0,0 +1,20 @@
+--- src/dbinc/atomic.h 2013-03-12 14:07:22.000000000 -0400
++++ src/dbinc/atomic.h.change  2013-03-12 14:06:35.000000000 -0400
+@@ -144,7 +144,7 @@
+ #define       atomic_inc(env, p)      __atomic_inc(p)
+ #define       atomic_dec(env, p)      __atomic_dec(p)
+ #define       atomic_compare_exchange(env, p, o, n)   \
+-      __atomic_compare_exchange((p), (o), (n))
++      __atomic_compare_exchange_db((p), (o), (n))
+ static inline int __atomic_inc(db_atomic_t *p)
+ {
+       int     temp;
+@@ -176,7 +176,7 @@
+  * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
+  * which configure could be changed to use.
+  */
+-static inline int __atomic_compare_exchange(
++static inline int __atomic_compare_exchange_db(
+       db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval)
+ {
+       atomic_value_t was;
diff --git a/osx/build/modulesets/patches/enchant/enchant-gsize.patch 
b/osx/build/modulesets/patches/enchant/enchant-gsize.patch
new file mode 100644
index 0000000..5bfba14
--- /dev/null
+++ b/osx/build/modulesets/patches/enchant/enchant-gsize.patch
@@ -0,0 +1,97 @@
+--- a/src/ispell/ispell_checker.cpp    Thu Apr  1 13:53:37 2010
++++ b/src/ispell/ispell_checker.cpp    Mon Feb 24 15:35:49 2014
+@@ -162,7 +162,7 @@
+       else
+               {
+                       /* convert to 8bit string and null terminate */
+-                      size_t len_in, len_out, result;
++                      gsize len_in, len_out, result;
+                       // the 8bit encodings use precomposed forms
+                       char *normalizedWord = g_utf8_normalize (utf8Word, length, G_NORMALIZE_NFC);
+                       char *In = normalizedWord;
+@@ -172,7 +172,7 @@
+                       len_out = sizeof( szWord ) - 1;
+                       result = g_iconv(m_translate_in, &In, &len_in, &Out, &len_out);
+                       g_free(normalizedWord);
+-                      if ((size_t)-1 == result)
++                      if ((gsize)-1 == result)
+                               return false;
+                       *Out = '\0';
+               }
+@@ -210,7 +210,7 @@
+               {
+                       /* convert to 8bit string and null terminate */
+                       
+-                      size_t len_in, len_out, result;
++                      gsize len_in, len_out, result;
+                       // the 8bit encodings use precomposed forms
+                       char *normalizedWord = g_utf8_normalize (utf8Word, length, G_NORMALIZE_NFC);
+                       char *In = normalizedWord;
+@@ -219,7 +219,7 @@
+                       len_out = sizeof( word8 ) - 1;
+                       result = g_iconv(m_translate_in, &In, &len_in, &Out, &len_out);
+                       g_free(normalizedWord);
+-                      if ((size_t)-1 == result)
++                      if ((gsize)-1 == result)
+                               return NULL;
+                       *Out = '\0';
+               }
+@@ -252,13 +252,13 @@
+                                       {
+                                               /* convert to 32bit string and null terminate */
+                                               
+-                                              size_t len_in, len_out;
++                                              gsize len_in, len_out;
+                                               char *In = m_possibilities[c];
+                                               char *Out = reinterpret_cast<char *>(utf8Sugg);
+                                               
+                                               len_in = l;
+                                               len_out = INPUTWORDLEN + MAXAFFIXLEN;
+-                                              if ((size_t)-1 == g_iconv(m_translate_out, &In, &len_in, 
&Out, &len_out)) {
++                                              if ((gsize)-1 == g_iconv(m_translate_out, &In, &len_in, &Out, 
&len_out)) {
+                                                       *out_n_suggestions = c;
+                                                       return sugg_arr;
+                                               }
+--- a/src/myspell/myspell_checker.cpp  Thu Apr  1 13:53:37 2010
++++ b/src/myspell/myspell_checker.cpp  Mon Feb 24 15:37:56 2014
+@@ -159,11 +159,11 @@
+       char *in = normalizedWord;
+       char word8[MAXWORDLEN + 1];
+       char *out = word8;
+-      size_t len_in = strlen(in);
+-      size_t len_out = sizeof( word8 ) - 1;
+-      size_t result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out);
++      gsize len_in = strlen(in);
++      gsize len_out = sizeof( word8 ) - 1;
++      gsize result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out);
+       g_free(normalizedWord);
+-      if ((size_t)-1 == result)
++      if ((gsize)-1 == result)
+               return false;
+       *out = '\0';
+       if (myspell->spell(word8))
+@@ -185,11 +185,11 @@
+       char *in = normalizedWord;
+       char word8[MAXWORDLEN + 1];
+       char *out = word8;
+-      size_t len_in = strlen(in);
+-      size_t len_out = sizeof(word8) - 1;
+-      size_t result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out);
++      gsize len_in = strlen(in);
++      gsize len_out = sizeof(word8) - 1;
++      gsize result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out);
+       g_free(normalizedWord);
+-      if ((size_t)-1 == result)
++      if ((gsize)-1 == result)
+               return NULL;
+ 
+       *out = '\0';
+@@ -203,7 +203,7 @@
+                       len_out = MAXWORDLEN;
+                       char *word = g_new0(char, len_out + 1);
+                       out = reinterpret_cast<char *>(word);
+-                      if ((size_t)-1 == g_iconv(m_translate_out, &in, &len_in, &out, &len_out)) {
++                      if ((gsize)-1 == g_iconv(m_translate_out, &in, &len_in, &out, &len_out)) {
+                               for (size_t j = i; j < *nsug; j++)
+                                       free(sugMS[j]);
+                               free(sugMS);
diff --git a/osx/build/modulesets/patches/gettext-runtime/gettext-bug33999-stpncpy.patch 
b/osx/build/modulesets/patches/gettext-runtime/gettext-bug33999-stpncpy.patch
new file mode 100644
index 0000000..eda2932
--- /dev/null
+++ b/osx/build/modulesets/patches/gettext-runtime/gettext-bug33999-stpncpy.patch
@@ -0,0 +1,63 @@
+
+--- a/gettext-tools/libgettextpo/string.in.h   Sun Apr 25 02:22:40 2010
++++ b/gettext-tools/libgettextpo/string.in.h   Tue Oct  4 14:36:31 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+ 
+       Rename module 'memxfrm' to 'amemxfrm'.
+--- a/gettext-tools/gnulib-lib/string.in.h     Mon May 24 02:42:47 2010
++++ b/gettext-tools/gnulib-lib/string.in.h     Tue Oct  4 14:35:46 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+
+--- a/gettext-runtime/gnulib-lib/string.in.h   Sun Apr 25 02:20:42 2010
++++ b/gettext-runtime/gnulib-lib/string.in.h   Tue Oct  4 14:34:57 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+--- a/gettext-tools/configure  Sun Jun  6 13:12:20 2010
++++ b/gettext-tools/configure  Tue Oct  4 16:29:27 2011
+@@ -40562,6 +40562,16 @@
+ 
+ 
+ 
++      ac_fn_c_check_decl "$LINENO" "stpncpy" "ac_cv_have_decl_stpncpy" "$ac_includes_default"
++if test "x$ac_cv_have_decl_stpncpy" = x""yes; then :
++  ac_have_decl=1
++else
++  ac_have_decl=0
++fi
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE_DECL_STPNCPY $ac_have_decl
++_ACEOF
+ 
+ 
+ 
+@@ -40606,7 +40616,9 @@
+ #include <stdlib.h>
+ #include <string.h> /* for strcpy */
+ /* The stpncpy prototype is missing in <string.h> on AIX 4.  */
++#if !HAVE_DECL_STPNCPY
+ extern char *stpncpy (char *dest, const char *src, size_t n);
++#endif
+ int main () {
+   const char *src = "Hello";
+   char dest[10];
diff --git a/osx/build/modulesets/patches/gettext-tools/gettext-bug33999-stpncpy.patch 
b/osx/build/modulesets/patches/gettext-tools/gettext-bug33999-stpncpy.patch
new file mode 100644
index 0000000..eda2932
--- /dev/null
+++ b/osx/build/modulesets/patches/gettext-tools/gettext-bug33999-stpncpy.patch
@@ -0,0 +1,63 @@
+
+--- a/gettext-tools/libgettextpo/string.in.h   Sun Apr 25 02:22:40 2010
++++ b/gettext-tools/libgettextpo/string.in.h   Tue Oct  4 14:36:31 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+ 
+       Rename module 'memxfrm' to 'amemxfrm'.
+--- a/gettext-tools/gnulib-lib/string.in.h     Mon May 24 02:42:47 2010
++++ b/gettext-tools/gnulib-lib/string.in.h     Tue Oct  4 14:35:46 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+
+--- a/gettext-runtime/gnulib-lib/string.in.h   Sun Apr 25 02:20:42 2010
++++ b/gettext-runtime/gnulib-lib/string.in.h   Tue Oct  4 14:34:57 2011
+@@ -229,6 +229,7 @@
+ #if @GNULIB_STPNCPY@
+ # if @REPLACE_STPNCPY@
+ #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
++#   undef stpncpy
+ #   define stpncpy rpl_stpncpy
+ #  endif
+ _GL_FUNCDECL_RPL (stpncpy, char *,
+--- a/gettext-tools/configure  Sun Jun  6 13:12:20 2010
++++ b/gettext-tools/configure  Tue Oct  4 16:29:27 2011
+@@ -40562,6 +40562,16 @@
+ 
+ 
+ 
++      ac_fn_c_check_decl "$LINENO" "stpncpy" "ac_cv_have_decl_stpncpy" "$ac_includes_default"
++if test "x$ac_cv_have_decl_stpncpy" = x""yes; then :
++  ac_have_decl=1
++else
++  ac_have_decl=0
++fi
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE_DECL_STPNCPY $ac_have_decl
++_ACEOF
+ 
+ 
+ 
+@@ -40606,7 +40616,9 @@
+ #include <stdlib.h>
+ #include <string.h> /* for strcpy */
+ /* The stpncpy prototype is missing in <string.h> on AIX 4.  */
++#if !HAVE_DECL_STPNCPY
+ extern char *stpncpy (char *dest, const char *src, size_t n);
++#endif
+ int main () {
+   const char *src = "Hello";
+   char dest[10];
diff --git a/osx/build/modulesets/patches/glib/0001-Bug-724590-GSlice-slab_stack-corruption.patch 
b/osx/build/modulesets/patches/glib/0001-Bug-724590-GSlice-slab_stack-corruption.patch
new file mode 100644
index 0000000..0e62201
--- /dev/null
+++ b/osx/build/modulesets/patches/glib/0001-Bug-724590-GSlice-slab_stack-corruption.patch
@@ -0,0 +1,28 @@
+From 1b21a85f1914eecc107319cb94e8c8517291599b Mon Sep 17 00:00:00 2001
+From: John Ralls <jralls ceridwen us>
+Date: Mon, 17 Feb 2014 15:51:38 -0800
+Subject: [PATCH] Bug 724590 - GSlice slab_stack corruption
+
+Dereference allocation->contention_counters before trying to take the
+address of an element.
+---
+ glib/gslice.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/glib/gslice.c b/glib/gslice.c
+index 0563d80..2c5f4fb 100644
+--- a/glib/gslice.c
++++ b/glib/gslice.c
+@@ -715,7 +715,8 @@ static ChunkLink*
+ magazine_cache_pop_magazine (guint  ix,
+                              gsize *countp)
+ {
+-  g_mutex_lock_a (&allocator->magazine_mutex, &allocator->contention_counters[ix]);
++  guint *counters = allocator->contention_counters;
++  g_mutex_lock_a (&allocator->magazine_mutex, &counters[ix]);
+   if (!allocator->magazines[ix])
+     {
+       guint magazine_threshold = allocator_get_magazine_threshold (allocator, ix);
+-- 
+1.8.3.rc0
+
diff --git a/osx/build/modulesets/patches/gobject-introspection/girscanner-objc.patch 
b/osx/build/modulesets/patches/gobject-introspection/girscanner-objc.patch
new file mode 100644
index 0000000..76d2bee
--- /dev/null
+++ b/osx/build/modulesets/patches/gobject-introspection/girscanner-objc.patch
@@ -0,0 +1,20 @@
+diff --git a/giscanner/scannerlexer.l b/giscanner/scannerlexer.l
+index 6a40398..40f1fc0 100644
+--- a/giscanner/scannerlexer.l
++++ b/giscanner/scannerlexer.l
+@@ -108,6 +108,7 @@ stringtext                         ([^\\\"])|(\\.)
+ "|"                                   { return '|'; }
+ "~"                                   { return '~'; }
+ "!"                                   { return '!'; }
++"@"                                   { return '@'; }
+ "="                                   { return '='; }
+ "<"                                   { return '<'; }
+ ">"                                   { return '>'; }
+@@ -199,6 +200,7 @@ stringtext                         ([^\\\"])|(\\.)
+ 
+ "\""{stringtext}*"\""                 { return STRING; }
+ "L\""{stringtext}*"\""                        { return STRING; }
++"@\""{stringtext}*"\""                        { return STRING; }
+ 
+ .                                     { if (yytext[0]) fprintf(stderr, "%s:%d: unexpected character 
`%c'\n", scanner->current_filename, lineno, yytext[0]); }
+ 
diff --git a/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch 
b/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch
new file mode 100644
index 0000000..b0a1ef5
--- /dev/null
+++ b/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch
@@ -0,0 +1,274 @@
+From dcd9ab00c64a1df63fd5fa58c2ca25efd9b3e09e Mon Sep 17 00:00:00 2001
+From: John Ralls <jralls ceridwen us>
+Date: Sat, 24 Sep 2011 18:14:09 -0700
+Subject: [PATCH 06/15] Bug 658722 - Drag and Drop sometimes stops working
+
+First, rather than assuming that there's already an event queued up if
+_gdk_quartz_drag_source_context isn't NULL, assume that it just didn't get
+cleaned up the last time it ran and abort it.
+
+This naturally requires implementing gdk_quartz_drag_abort(), so remove the
+code from [GdkQuartzNSWindow draggedImage:endedAt:operation:] and move it to
+gdkdnd_quartz.c as static void gdk_quartz_drag_end(). Implement both
+gdk_quartz_drag_drop() and gdk_quartz_drag_abort() by calling
+gdk_quartz_drag_end().
+
+Next, try to get rid of the memory cycle between gtk_drag_source_info.context
+and _gdk_quartz_drag_source_context (which carries the GtkQuartzDragSourceInfo
+struct as qdata). Replace gtk_drag_source_clear_info() by using a
+g_object_set_qdata_full() for context in gtk_drag_get_source_context, calling
+gtk_drag_source_info_destroy() as the destructor. This eliminates the need to
+queue a cleanup idle event. I use g_object_run_dispose() on
+_gtk_quartz_drag_source_context to force the deletion of the info stored as
+qdata, which in turn unrefs the info->context pointer. Ordinarily this gets
+fired off from draggedImage:endedAt:operation:, meaning that the special
+dragging CFRunLoop is complete and NSEvents are again flowing, so queuing a
+cleanup event isn't necessary. The advantage is that it can also be run from
+gdk_drag_abort, so if Gdk thinks there's a drag but CF doesn't all of the
+memory still gets cleaned up.
+---
+ gdk/quartz/GdkQuartzWindow.c |   16 +-------
+ gdk/quartz/gdkdnd-quartz.c   |   35 +++++++++++++--
+ gtk/gtkdnd-quartz.c          |   96 ++++++++++++++++-------------------------
+ 3 files changed, 69 insertions(+), 78 deletions(-)
+
+diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c
+index dcd7250..20ed80e 100644
+--- a/gdk/quartz/GdkQuartzWindow.c
++++ b/gdk/quartz/GdkQuartzWindow.c
+@@ -560,21 +560,7 @@ update_context_from_dragging_info (id <NSDraggingInfo> sender)
+ 
+ - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
+ {
+-  GdkEvent event;
+-
+-  g_assert (_gdk_quartz_drag_source_context != NULL);
+-
+-  event.dnd.type = GDK_DROP_FINISHED;
+-  event.dnd.window = g_object_ref ([[self contentView] gdkWindow]);
+-  event.dnd.send_event = FALSE;
+-  event.dnd.context = _gdk_quartz_drag_source_context;
+-
+-  (*_gdk_event_func) (&event, _gdk_event_data);
+-
+-  g_object_unref (event.dnd.window);
+-
+-  g_object_unref (_gdk_quartz_drag_source_context);
+-  _gdk_quartz_drag_source_context = NULL;
++  gdk_drag_drop (_gdk_quartz_drag_source_context, (guint32)g_get_real_time());
+ }
+ 
+ @end
+diff --git a/gdk/quartz/gdkdnd-quartz.c b/gdk/quartz/gdkdnd-quartz.c
+index bb70b71..143a8ed 100644
+--- a/gdk/quartz/gdkdnd-quartz.c
++++ b/gdk/quartz/gdkdnd-quartz.c
+@@ -111,11 +111,20 @@ GdkDragContext *
+ gdk_drag_begin (GdkWindow     *window,
+               GList         *targets)
+ {
+-  g_assert (_gdk_quartz_drag_source_context == NULL);
++  if (_gdk_quartz_drag_source_context != NULL)
++    {
++      /* Something is amiss with the existing drag, so log a message
++       and abort it */
++      g_warning ("Drag begun with existing context; aborting the preexisting drag");
++      gdk_drag_abort (_gdk_quartz_drag_source_context,
++                    (guint32)g_get_real_time ());
++    }
++
+   
+   /* Create fake context */
+   _gdk_quartz_drag_source_context = gdk_drag_context_new ();
+   _gdk_quartz_drag_source_context->is_source = TRUE;
++  _gdk_quartz_drag_source_context->source_window = window;
+   
+   return _gdk_quartz_drag_source_context;
+ }
+@@ -155,20 +164,36 @@ gdk_drag_find_window_for_screen (GdkDragContext  *context,
+   /* FIXME: Implement */
+ }
+ 
++static void
++gdk_quartz_drag_end (GdkDragContext *context)
++{
++  GdkEvent event;
++
++  g_assert (context != NULL);
++  event.dnd.type = GDK_DROP_FINISHED;
++  event.dnd.window = g_object_ref (context->source_window);
++  event.dnd.send_event = FALSE;
++  event.dnd.context = context;
++
++  (*_gdk_event_func) (&event, _gdk_event_data);
++
++  g_object_run_dispose (_gdk_quartz_drag_source_context);
++  _gdk_quartz_drag_source_context = NULL;
++}
++
+ void
+ gdk_drag_drop (GdkDragContext *context,
+              guint32         time)
+ {
+-  /* FIXME: Implement */
++  gdk_quartz_drag_end (context);
+ }
+ 
+ void
+ gdk_drag_abort (GdkDragContext *context,
+               guint32         time)
+ {
+-  g_return_if_fail (context != NULL);
+-  
+-  /* FIXME: Implement */
++  g_warning ("Gdk-quartz-drag-drop, aborting\n");
++  gdk_quartz_drag_end (context);
+ }
+ 
+ void             
+diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
+index 5688568..be92a22 100644
+--- a/gtk/gtkdnd-quartz.c
++++ b/gtk/gtkdnd-quartz.c
+@@ -269,6 +269,39 @@ gtk_drag_dest_info_destroy (gpointer data)
+   g_free (info);
+ }
+ 
++static void
++gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
++{
++  NSPasteboard *pasteboard;
++  NSAutoreleasePool *pool;
++
++  if (info->icon_pixbuf)
++    g_object_unref (info->icon_pixbuf);
++
++  g_signal_emit_by_name (info->widget, "drag-end", 
++                       info->context);
++
++  if (info->source_widget)
++    g_object_unref (info->source_widget);
++
++  if (info->widget)
++    g_object_unref (info->widget);
++
++  gtk_target_list_unref (info->target_list);
++
++  pool = [[NSAutoreleasePool alloc] init];
++
++  /* Empty the pasteboard, so that it will not accidentally access
++   * info->context after it has been destroyed.
++   */
++  pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard];
++  [pasteboard declareTypes: nil owner: nil];
++
++  [pool release];
++
++  g_free (info);
++}
++
+ static GtkDragDestInfo *
+ gtk_drag_get_dest_info (GdkDragContext *context,
+                       gboolean        create)
+@@ -308,18 +341,14 @@ gtk_drag_get_source_info (GdkDragContext *context,
+     {
+       info = g_new0 (GtkDragSourceInfo, 1);
+       info->context = context;
+-      g_object_set_qdata (G_OBJECT (context), dest_info_quark, info);
++      g_object_ref (info->context);
++      g_object_set_qdata_full (G_OBJECT (context), dest_info_quark,
++                             info, gtk_drag_source_info_destroy);
+     }
+ 
+   return info;
+ }
+ 
+-static void
+-gtk_drag_clear_source_info (GdkDragContext *context)
+-{
+-  g_object_set_qdata (G_OBJECT (context), dest_info_quark, NULL);
+-}
+-
+ GtkWidget *
+ gtk_drag_get_source_widget (GdkDragContext *context)
+ {
+@@ -1089,7 +1118,8 @@ gtk_drag_begin_idle (gpointer arg)
+   [owner release];
+   [types release];
+ 
+-  if ((nswindow = get_toplevel_nswindow (info->source_widget)) == NULL)
++  if (info->source_widget == NULL
++      || (nswindow = get_toplevel_nswindow (info->source_widget)) == NULL)
+      return FALSE;
+   
+   /* Ref the context. It's unreffed when the drag has been aborted */
+@@ -1108,7 +1138,6 @@ gtk_drag_begin_idle (gpointer arg)
+                source:nswindow
+             slideBack:YES];
+ 
+-  [info->nsevent release];
+   [drag_image release];
+ 
+   [pool release];
+@@ -1833,61 +1862,12 @@ gtk_drag_set_default_icon (GdkColormap   *colormap,
+ }
+ 
+ static void
+-gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
+-{
+-  NSPasteboard *pasteboard;
+-  NSAutoreleasePool *pool;
+-
+-  if (info->icon_pixbuf)
+-    g_object_unref (info->icon_pixbuf);
+-
+-  g_signal_emit_by_name (info->widget, "drag-end", 
+-                       info->context);
+-
+-  if (info->source_widget)
+-    g_object_unref (info->source_widget);
+-
+-  if (info->widget)
+-    g_object_unref (info->widget);
+-
+-  gtk_target_list_unref (info->target_list);
+-
+-  pool = [[NSAutoreleasePool alloc] init];
+-
+-  /* Empty the pasteboard, so that it will not accidentally access
+-   * info->context after it has been destroyed.
+-   */
+-  pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard];
+-  [pasteboard declareTypes: nil owner: nil];
+-
+-  [pool release];
+-
+-  gtk_drag_clear_source_info (info->context);
+-  g_object_unref (info->context);
+-
+-  g_free (info);
+-  info = NULL;
+-}
+-
+-static gboolean
+-drag_drop_finished_idle_cb (gpointer data)
+-{
+-  gtk_drag_source_info_destroy (data);
+-  return FALSE;
+-}
+-
+-static void
+ gtk_drag_drop_finished (GtkDragSourceInfo *info)
+ {
+   if (info->success && info->delete)
+     g_signal_emit_by_name (info->source_widget, "drag-data-delete",
+                            info->context);
+ 
+-  /* Workaround for the fact that the NS API blocks until the drag is
+-   * over. This way the context is still valid when returning from
+-   * drag_begin, even if it will still be quite useless. See bug #501588.
+-  */
+-  g_idle_add (drag_drop_finished_idle_cb, info);
+ }
+ 
+ /*************************************************************
diff --git a/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch 
b/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch
new file mode 100644
index 0000000..5b9153c
--- /dev/null
+++ b/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch
@@ -0,0 +1,39 @@
+From 259563958047ccbf6f61578f2d724fc731218304 Mon Sep 17 00:00:00 2001
+From: John Ralls <jralls ceridwen us>
+Date: Sun, 25 Sep 2011 12:03:54 -0700
+Subject: [PATCH 08/15] Implement GtkDragSourceOwner pasteboardChangedOwner:
+
+---
+ gtk/gtkdnd-quartz.c |   11 +++++++++++
+ 1 files changed, 11 insertions(+), 0 deletions(-)
+
+diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
+index 084aada..21ce11a 100644
+--- a/gtk/gtkdnd-quartz.c
++++ b/gtk/gtkdnd-quartz.c
+@@ -149,6 +149,8 @@ struct _GtkDragFindData
+   guint target_info;
+   GtkSelectionData selection_data;
+ 
++  g_return_if_fail(info->source_widget != NULL);
++  g_return_if_fail(info->target_list != NULL);
+   selection_data.selection = GDK_NONE;
+   selection_data.data = NULL;
+   selection_data.length = -1;
+@@ -171,6 +173,15 @@ struct _GtkDragFindData
+     }
+ }
+ 
++- (void)pasteboardChangedOwner: (NSPasteboard*)sender
++{
++  if (!info) return;
++
++  info->target_list = NULL;
++  info->widget = NULL;
++  info->source_widget = NULL;
++}
++
+ - (id)initWithInfo:(GtkDragSourceInfo *)anInfo
+ {
+   self = [super init];
+
diff --git a/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch 
b/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch
new file mode 100644
index 0000000..26321b7
--- /dev/null
+++ b/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch
@@ -0,0 +1,5 @@
+diff -uN gtk+-2.24.21/m4/.bogus gtk+-2.24.21.save/m4/.bogus
+--- gtk+-2.24.21/m4/.bogus     2013-10-02 08:01:33.000000000 -0700
++++ gtk+-2.24.21.save/m4/.bogus        2013-10-02 08:03:40.000000000 -0700
+@@ -0,0 +1 @@
++A phony file to enable making a patch to create this directory.
diff --git 
a/osx/build/modulesets/patches/gtk-mac-integration/0001-Fix-unhandled-exception-from-attempting-to-access-me.patch
 
b/osx/build/modulesets/patches/gtk-mac-integration/0001-Fix-unhandled-exception-from-attempting-to-access-me.patch
new file mode 100644
index 0000000..87151bb
--- /dev/null
+++ 
b/osx/build/modulesets/patches/gtk-mac-integration/0001-Fix-unhandled-exception-from-attempting-to-access-me.patch
@@ -0,0 +1,39 @@
+From cd3a21ff115cd6c6c11ce39aa62eaf912c78b060 Mon Sep 17 00:00:00 2001
+From: John Ralls <jralls ceridwen us>
+Date: Mon, 30 Dec 2013 12:20:26 -0800
+Subject: [PATCH] Fix unhandled exception from attempting to access menu
+ itemAtIndex:-1
+
+---
+ src/cocoa_menu_item.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/cocoa_menu_item.c b/src/cocoa_menu_item.c
+index 793c254..dd46586 100644
+--- a/src/cocoa_menu_item.c
++++ b/src/cocoa_menu_item.c
+@@ -550,12 +550,16 @@ cocoa_menu_item_add_item (NSMenu* cocoa_menu, GtkWidget* menu_item, int index)
+       /* Clean up adjacent separators: */
+       if ([cocoa_menu numberOfItems] > 0)
+       {
+-        if (([cocoa_menu numberOfItems] == index ||
+-             [[cocoa_menu itemAtIndex: index] isSeparatorItem]) &&
+-            [[cocoa_menu itemAtIndex: index - 1] isSeparatorItem])
++        if (index == 0)
++          {
++            if ([[cocoa_menu itemAtIndex: index] isSeparatorItem])
++              [cocoa_menu removeItemAtIndex: index];
++          }
++        else if (([cocoa_menu numberOfItems] == index ||
++                  [[cocoa_menu itemAtIndex: index] isSeparatorItem]) &&
++                 [[cocoa_menu itemAtIndex: index - 1] isSeparatorItem])
+           [cocoa_menu removeItemAtIndex: index - 1];
+-        if (index == 0 && [[cocoa_menu itemAtIndex: index] isSeparatorItem])
+-          [cocoa_menu removeItemAtIndex: index];
++
+       }
+     }
+ 
+-- 
+1.8.3.rc0
+
diff --git a/osx/build/modulesets/patches/itstool/itstool.use-correct-libxml.patch 
b/osx/build/modulesets/patches/itstool/itstool.use-correct-libxml.patch
new file mode 100644
index 0000000..51a25c0
--- /dev/null
+++ b/osx/build/modulesets/patches/itstool/itstool.use-correct-libxml.patch
@@ -0,0 +1,28 @@
+From d6ef86e2fb7bf9ddf888521e2c7dc5b5b7e4b6d8 Mon Sep 17 00:00:00 2001
+From: Michael Catanzaro <mcatanzaro gnome org>
+Date: Fri, 10 Jan 2014 23:50:52 -0600
+Subject: [PATCH] build: use $PYTHON when testing for libxml2
+
+/usr/bin/python is a symlink to /usr/bin/python3 on some systems.
+In this case, configure unconditionally checks for the Python 3 version
+of libxml2. Instead, use the version of Python found by AM_PATH_PYTHON.
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index c29efad..dbd0c7f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -14,7 +14,7 @@ AM_PATH_PYTHON([2.6])
+ 
+ py_module=libxml2
+ AC_MSG_CHECKING(for python module $py_module)
+-echo "import $py_module" | python - &>/dev/null
++echo "import $py_module" | $PYTHON - &>/dev/null
+ if test $? -ne 0; then
+       AC_MSG_RESULT(not found)
+       AC_MSG_ERROR(Python module $py_module is needed to run this package)
+-- 
+1.8.5.2
+
diff --git a/osx/build/modulesets/patches/libxml2/libxml2-Bug-686118-pthreads_once_init.patch 
b/osx/build/modulesets/patches/libxml2/libxml2-Bug-686118-pthreads_once_init.patch
new file mode 100644
index 0000000..8f42220
--- /dev/null
+++ b/osx/build/modulesets/patches/libxml2/libxml2-Bug-686118-pthreads_once_init.patch
@@ -0,0 +1,33 @@
+From 3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e Mon Sep 17 00:00:00 2001
+From: Friedrich Haubensak <hsk fli-leibniz de>
+Date: Wed, 12 Sep 2012 15:34:53 +0000
+Subject: Fix a thread portability problem
+
+cannot compile libxml2-2.9.0 using studio 12.1 compiler on solaris 10
+
+I.M.O. structure initializer (as PTHREAD_ONCE_INIT) cannot be used in
+a structure assignment anyway
+---
+diff --git a/threads.c b/threads.c
+index f206149..7e85a26 100644
+--- a/threads.c
++++ b/threads.c
+@@ -146,6 +146,7 @@ struct _xmlRMutex {
+ static pthread_key_t globalkey;
+ static pthread_t mainthread;
+ static pthread_once_t once_control = PTHREAD_ONCE_INIT;
++static pthread_once_t once_control_init = PTHREAD_ONCE_INIT;
+ static pthread_mutex_t global_init_lock = PTHREAD_MUTEX_INITIALIZER;
+ #elif defined HAVE_WIN32_THREADS
+ #if defined(HAVE_COMPILER_TLS)
+@@ -915,7 +916,7 @@ xmlCleanupThreads(void)
+ #ifdef HAVE_PTHREAD_H
+     if ((libxml_is_threaded)  && (pthread_key_delete != NULL))
+         pthread_key_delete(globalkey);
+-    once_control = PTHREAD_ONCE_INIT;
++    once_control = once_control_init;
+ #elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || 
defined(LIBXML_STATIC_FOR_DLL))
+     if (globalkey != TLS_OUT_OF_INDEXES) {
+         xmlGlobalStateCleanupHelperParams *p;
+--
+cgit v0.9.0.2
diff --git a/osx/build/modulesets/patches/pygobject3/pygobject-Merge-multiple-platform-case-statements.patch 
b/osx/build/modulesets/patches/pygobject3/pygobject-Merge-multiple-platform-case-statements.patch
new file mode 100644
index 0000000..5fde3d2
--- /dev/null
+++ b/osx/build/modulesets/patches/pygobject3/pygobject-Merge-multiple-platform-case-statements.patch
@@ -0,0 +1,79 @@
+From 728824c69252e2531419d7c75b8351243d488610 Mon Sep 17 00:00:00 2001
+From: Simon Feltman <sfeltman src gnome org>
+Date: Tue, 19 Aug 2014 14:57:31 -0700
+Subject: [PATCH] configure.ac: Merge multiple platform case statements
+
+Merge platform_win32 and os_win32 variables and define "link_python_libs"
+for win32 as well as darwin.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=735068
+---
+ configure.ac | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index ece639c..60de010 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -51,38 +51,30 @@ ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+ 
+ AC_CANONICAL_BUILD
+ AC_CANONICAL_HOST
+-AC_MSG_CHECKING([for some Win32 platform])
++AC_MSG_CHECKING([for Darwin and Win32 platforms])
+ case "$host" in
+   *-*-mingw*|*-*-cygwin*)
+-    platform_win32=yes
++    os_win32=yes
++    link_python_libs=yes
+     OS_EXT=dll
+     ;;
+   *-*-darwin*)
++    os_win32=no
++    link_python_libs=yes
+     OS_EXT=dylib
+     ;;
+   *)
+-    platform_win32=no
++    os_win32=no
++    link_python_libs=yes
+     OS_EXT=so
+     ;;
+ esac
+-AC_MSG_RESULT([$platform_win32])
+-AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
++AC_MSG_RESULT([$os_win32])
++AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+ 
+ AC_SUBST(OS_EXT)
+ AC_DEFINE_UNQUOTED(OS_EXT, "$OS_EXT", [Define shared library extension])
+ 
+-AC_MSG_CHECKING([for native Win32])
+-case "$host" in
+-  *-*-mingw*)
+-    os_win32=yes
+-    ;;
+-  *)
+-    os_win32=no
+-    ;;
+-esac
+-AC_MSG_RESULT([$os_win32])
+-AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+-
+ LT_PREREQ([2.2.6])
+ LT_INIT([dlopen win32-dll disable-static])
+ 
+@@ -126,8 +118,8 @@ PYTHON_SO=`$PYTHON -c "import distutils.sysconfig, sys; get = distutils.sysconfi
+ AC_SUBST(PYTHON_SO)
+ 
+ AM_CHECK_PYTHON_HEADERS(, AC_MSG_ERROR([Python headers not found]))
+-if test "x$os_win32" = "xyes"; then
+-  AM_CHECK_PYTHON_LIBS(, AC_MSG_ERROR([Python libs not found. Windows requires Python modules to be 
explicitly linked to libpython.]))
++if test "x$link_python_libs" = "xyes"; then
++  AM_CHECK_PYTHON_LIBS(, AC_MSG_ERROR([Python libs not found. Windows and Darwin require Python modules to 
be explicitly linked to libpython.]))
+ fi
+ 
+ AC_MSG_CHECKING([for PySignal_SetWakeupFd in Python.h])
+-- 
+1.8.5.2 (Apple Git-48)
+
diff --git a/osx/build/modulesets/patches/readline/readline62-001 
b/osx/build/modulesets/patches/readline/readline62-001
new file mode 100644
index 0000000..d4563c3
--- /dev/null
+++ b/osx/build/modulesets/patches/readline/readline62-001
@@ -0,0 +1,46 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.2
+Patch-ID: readline62-001
+
+Bug-Reported-by:       Clark J. Wang <dearvoid gmail com>
+Bug-Reference-ID:      <AANLkTimGbW7aC4E5infXP6ku5WPci4t=xVc+L1SyHqrD mail gmail com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00157.html
+
+Bug-Description:
+
+The readline vi-mode `cc', `dd', and `yy' commands failed to modify the
+entire line.
+
+[This patch intentionally does not modify patchlevel]
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.2-patched/vi_mode.c  2010-11-20 19:51:39.000000000 -0500
+--- vi_mode.c  2011-02-17 20:24:25.000000000 -0500
+***************
+*** 1115,1119 ****
+        _rl_vi_last_motion = c;
+        RL_UNSETSTATE (RL_STATE_VIMOTION);
+!       return (0);
+      }
+  #if defined (READLINE_CALLBACKS)
+--- 1115,1119 ----
+        _rl_vi_last_motion = c;
+        RL_UNSETSTATE (RL_STATE_VIMOTION);
+!       return (vidomove_dispatch (m));
+      }
+  #if defined (READLINE_CALLBACKS)
+*** ../readline-6.2-patched/callback.c 2010-06-06 12:18:58.000000000 -0400
+--- callback.c 2011-02-17 20:43:28.000000000 -0500
+***************
+*** 149,152 ****
+--- 149,155 ----
+         /* Should handle everything, including cleanup, numeric arguments,
+            and turning off RL_STATE_VIMOTION */
++        if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
++          _rl_internal_char_cleanup ();
++ 
+         return;
+       }
diff --git a/osx/build/modulesets/patches/readline/readline62-002 
b/osx/build/modulesets/patches/readline/readline62-002
new file mode 100644
index 0000000..3dc2604
--- /dev/null
+++ b/osx/build/modulesets/patches/readline/readline62-002
@@ -0,0 +1,57 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.2
+Patch-ID: readline62-002
+
+Bug-Reported-by:       Vincent Sheffer <vince sheffer apisphere com>
+Bug-Reference-ID:      <F13C1C4F-C44C-4071-BFED-4BB6D13CF92F apisphere com>
+Bug-Reference-URL:     https://lists.gnu.org/archive/html/bug-readline/2011-08/msg00000.html
+
+Bug-Description:
+
+The readline shared library helper script needs to be updated for Mac OS X
+10.7 (Lion, darwin11).
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.2-patched/support/shobj-conf 2009-10-28 09:20:21.000000000 -0400
+--- support/shobj-conf 2011-08-27 13:25:23.000000000 -0400
+***************
+*** 158,162 ****
+  
+  # Darwin/MacOS X
+! darwin[89]*|darwin10*)
+       SHOBJ_STATUS=supported
+       SHLIB_STATUS=supported
+--- 172,176 ----
+  
+  # Darwin/MacOS X
+! darwin[89]*|darwin1[012]*)
+       SHOBJ_STATUS=supported
+       SHLIB_STATUS=supported
+***************
+*** 187,191 ****
+  
+       case "${host_os}" in
+!      darwin[789]*|darwin10*) SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ 
-current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+--- 201,205 ----
+  
+       case "${host_os}" in
+!      darwin[789]*|darwin1[012]*)     SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ 
-current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+
+*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
+--- patchlevel 2011-11-17 11:09:35.000000000 -0500
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 1
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 2
diff --git a/osx/build/modulesets/patches/readline/readline62-003 
b/osx/build/modulesets/patches/readline/readline62-003
new file mode 100644
index 0000000..0462242
--- /dev/null
+++ b/osx/build/modulesets/patches/readline/readline62-003
@@ -0,0 +1,76 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.2
+Patch-ID: readline62-003
+
+Bug-Reported-by:       Max Horn <max quendi de>
+Bug-Reference-ID:      <20CC5C60-07C3-4E41-9817-741E48D407C5 quendi de>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2012-06/msg00005.html
+
+Bug-Description:
+
+A change between readline-6.1 and readline-6.2 to prevent the readline input
+hook from being called too frequently had the side effect of causing delays
+when reading pasted input on systems such as Mac OS X.  This patch fixes
+those delays while retaining the readline-6.2 behavior.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.2-patched/input.c    2010-05-30 18:33:01.000000000 -0400
+--- input.c    2012-06-25 21:08:42.000000000 -0400
+***************
+*** 410,414 ****
+  rl_read_key ()
+  {
+!   int c;
+  
+    rl_key_sequence_length++;
+--- 412,416 ----
+  rl_read_key ()
+  {
+!   int c, r;
+  
+    rl_key_sequence_length++;
+***************
+*** 430,441 ****
+         while (rl_event_hook)
+           {
+!            if (rl_gather_tyi () < 0) /* XXX - EIO */
+               {
+                 rl_done = 1;
+                 return ('\n');
+               }
+             RL_CHECK_SIGNALS ();
+-            if (rl_get_char (&c) != 0)
+-              break;
+             if (rl_done)              /* XXX - experimental */
+               return ('\n');
+--- 432,447 ----
+         while (rl_event_hook)
+           {
+!            if (rl_get_char (&c) != 0)
+!              break;
+!              
+!            if ((r = rl_gather_tyi ()) < 0)   /* XXX - EIO */
+               {
+                 rl_done = 1;
+                 return ('\n');
+               }
++            else if (r == 1)                  /* read something */
++              continue;
++ 
+             RL_CHECK_SIGNALS ();
+             if (rl_done)              /* XXX - experimental */
+               return ('\n');
+*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
+--- patchlevel 2011-11-17 11:09:35.000000000 -0500
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 2
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 3
diff --git a/osx/build/modulesets/patches/readline/readline62-004 
b/osx/build/modulesets/patches/readline/readline62-004
new file mode 100644
index 0000000..5f3ba9b
--- /dev/null
+++ b/osx/build/modulesets/patches/readline/readline62-004
@@ -0,0 +1,108 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.2
+Patch-ID: readline62-004
+
+Bug-Reported-by:       Jakub Filak
+Bug-Reference-ID:
+Bug-Reference-URL:     https://bugzilla.redhat.com/show_bug.cgi?id=813289
+
+Bug-Description:
+
+Attempting to redo (using `.') the vi editing mode `cc', `dd', or `yy'
+commands leads to an infinite loop.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.2-patched/vi_mode.c  2011-02-25 11:17:02.000000000 -0500
+--- vi_mode.c  2012-06-02 12:24:47.000000000 -0400
+***************
+*** 1235,1243 ****
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+!   else if (vi_redoing)
+      {
+        _rl_vimvcxt->motion = _rl_vi_last_motion;
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+  #if defined (READLINE_CALLBACKS)
+    else if (RL_ISSTATE (RL_STATE_CALLBACK))
+--- 1297,1313 ----
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+!   else if (vi_redoing && _rl_vi_last_motion != 'd')  /* `dd' is special */
+      {
+        _rl_vimvcxt->motion = _rl_vi_last_motion;
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
++   else if (vi_redoing)               /* handle redoing `dd' here */
++     {
++       _rl_vimvcxt->motion = _rl_vi_last_motion;
++       rl_mark = rl_end;
++       rl_beg_of_line (1, key);
++       RL_UNSETSTATE (RL_STATE_VIMOTION);
++       r = vidomove_dispatch (_rl_vimvcxt);
++     }
+  #if defined (READLINE_CALLBACKS)
+    else if (RL_ISSTATE (RL_STATE_CALLBACK))
+***************
+*** 1317,1325 ****
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+!   else if (vi_redoing)
+      {
+        _rl_vimvcxt->motion = _rl_vi_last_motion;
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+  #if defined (READLINE_CALLBACKS)
+    else if (RL_ISSTATE (RL_STATE_CALLBACK))
+--- 1387,1403 ----
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
+!   else if (vi_redoing && _rl_vi_last_motion != 'c')  /* `cc' is special */
+      {
+        _rl_vimvcxt->motion = _rl_vi_last_motion;
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
++   else if (vi_redoing)               /* handle redoing `cc' here */
++     {
++       _rl_vimvcxt->motion = _rl_vi_last_motion;
++       rl_mark = rl_end;
++       rl_beg_of_line (1, key);
++       RL_UNSETSTATE (RL_STATE_VIMOTION);
++       r = vidomove_dispatch (_rl_vimvcxt);
++     }
+  #if defined (READLINE_CALLBACKS)
+    else if (RL_ISSTATE (RL_STATE_CALLBACK))
+***************
+*** 1378,1381 ****
+--- 1456,1472 ----
+        r = rl_domove_motion_callback (_rl_vimvcxt);
+      }
++   else if (vi_redoing && _rl_vi_last_motion != 'y')  /* `yy' is special */
++     {
++       _rl_vimvcxt->motion = _rl_vi_last_motion;
++       r = rl_domove_motion_callback (_rl_vimvcxt);
++     }
++   else if (vi_redoing)                       /* handle redoing `yy' here */
++     {
++       _rl_vimvcxt->motion = _rl_vi_last_motion;
++       rl_mark = rl_end;
++       rl_beg_of_line (1, key);
++       RL_UNSETSTATE (RL_STATE_VIMOTION);
++       r = vidomove_dispatch (_rl_vimvcxt);
++     }
+  #if defined (READLINE_CALLBACKS)
+    else if (RL_ISSTATE (RL_STATE_CALLBACK))
+*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
+--- patchlevel 2011-11-17 11:09:35.000000000 -0500
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 3
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 4
diff --git a/osx/build/modulesets/patches/shared-mime-info/0001-Bug-70255-Build-fails-with-glib-2.38.patch 
b/osx/build/modulesets/patches/shared-mime-info/0001-Bug-70255-Build-fails-with-glib-2.38.patch
new file mode 100644
index 0000000..f2007d2
--- /dev/null
+++ b/osx/build/modulesets/patches/shared-mime-info/0001-Bug-70255-Build-fails-with-glib-2.38.patch
@@ -0,0 +1,42 @@
+From bfb2d780ff11cb547cc20d31c473be35cacb4509 Mon Sep 17 00:00:00 2001
+From: John Ralls <jralls ceridwen us>
+Date: Tue, 8 Oct 2013 11:33:11 -0700
+Subject: [PATCH] Bug 70255 - Build fails with glib-2.38
+
+---
+ configure.ac      | 3 +++
+ test-tree-magic.c | 3 ++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 68007c9..60a4c4d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -29,6 +29,9 @@ dnl Check whether libxml and glib are present is installed
+ PKG_CHECK_MODULES(ALL, \
+                 libxml-2.0 >= 2.4 \
+                   glib-2.0 >= 2.6.0)
++PKG_CHECK_MODULES(GLIB_2_36, glib-2.0 >= 2.36.0,
++ [AC_DEFINE([HAVE_GLIB_2_36], [1], [Configure g_type_init deprecation])],
++ [PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.6.0)])
+ AC_SUBST(ALL_CFLAGS)
+ AC_SUBST(ALL_LIBS)
+ 
+diff --git a/test-tree-magic.c b/test-tree-magic.c
+index 9b4dfaf..ec44a29 100644
+--- a/test-tree-magic.c
++++ b/test-tree-magic.c
+@@ -637,8 +637,9 @@ int main (int argc, char **argv)
+       char *content, **lines;
+       guint i;
+ 
++#ifndef HAVE_GLIB_2_36
+       g_type_init ();
+-
++#endif
+       if (argc != 2) {
+               g_print ("Usage: %s [file]\n", argv[0]);
+               g_print ("Where file contains, on each line, a directory path,\n"
+-- 
+1.8.3.rc0
+
diff --git a/osx/jhbuild/patches/dbus-relocatable-services.patch 
b/osx/build/patches/dbus-relocatable-services.patch
similarity index 100%
rename from osx/jhbuild/patches/dbus-relocatable-services.patch
rename to osx/build/patches/dbus-relocatable-services.patch
diff --git a/osx/jhbuild/patches/enchant-applespell.patch b/osx/build/patches/enchant-applespell.patch
similarity index 100%
rename from osx/jhbuild/patches/enchant-applespell.patch
rename to osx/build/patches/enchant-applespell.patch
diff --git a/osx/jhbuild/patches/gedit-plugins-disable-terminal.patch 
b/osx/build/patches/gedit-plugins-disable-terminal.patch
similarity index 100%
rename from osx/jhbuild/patches/gedit-plugins-disable-terminal.patch
rename to osx/build/patches/gedit-plugins-disable-terminal.patch
diff --git a/osx/jhbuild/patches/mac-integration-open-files.patch 
b/osx/build/patches/mac-integration-open-files.patch
similarity index 100%
rename from osx/jhbuild/patches/mac-integration-open-files.patch
rename to osx/build/patches/mac-integration-open-files.patch
diff --git a/osx/build/patches/pygobject-Merge-multiple-platform-case-statements.patch 
b/osx/build/patches/pygobject-Merge-multiple-platform-case-statements.patch
new file mode 100644
index 0000000..5fde3d2
--- /dev/null
+++ b/osx/build/patches/pygobject-Merge-multiple-platform-case-statements.patch
@@ -0,0 +1,79 @@
+From 728824c69252e2531419d7c75b8351243d488610 Mon Sep 17 00:00:00 2001
+From: Simon Feltman <sfeltman src gnome org>
+Date: Tue, 19 Aug 2014 14:57:31 -0700
+Subject: [PATCH] configure.ac: Merge multiple platform case statements
+
+Merge platform_win32 and os_win32 variables and define "link_python_libs"
+for win32 as well as darwin.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=735068
+---
+ configure.ac | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index ece639c..60de010 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -51,38 +51,30 @@ ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+ 
+ AC_CANONICAL_BUILD
+ AC_CANONICAL_HOST
+-AC_MSG_CHECKING([for some Win32 platform])
++AC_MSG_CHECKING([for Darwin and Win32 platforms])
+ case "$host" in
+   *-*-mingw*|*-*-cygwin*)
+-    platform_win32=yes
++    os_win32=yes
++    link_python_libs=yes
+     OS_EXT=dll
+     ;;
+   *-*-darwin*)
++    os_win32=no
++    link_python_libs=yes
+     OS_EXT=dylib
+     ;;
+   *)
+-    platform_win32=no
++    os_win32=no
++    link_python_libs=yes
+     OS_EXT=so
+     ;;
+ esac
+-AC_MSG_RESULT([$platform_win32])
+-AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
++AC_MSG_RESULT([$os_win32])
++AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+ 
+ AC_SUBST(OS_EXT)
+ AC_DEFINE_UNQUOTED(OS_EXT, "$OS_EXT", [Define shared library extension])
+ 
+-AC_MSG_CHECKING([for native Win32])
+-case "$host" in
+-  *-*-mingw*)
+-    os_win32=yes
+-    ;;
+-  *)
+-    os_win32=no
+-    ;;
+-esac
+-AC_MSG_RESULT([$os_win32])
+-AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+-
+ LT_PREREQ([2.2.6])
+ LT_INIT([dlopen win32-dll disable-static])
+ 
+@@ -126,8 +118,8 @@ PYTHON_SO=`$PYTHON -c "import distutils.sysconfig, sys; get = distutils.sysconfi
+ AC_SUBST(PYTHON_SO)
+ 
+ AM_CHECK_PYTHON_HEADERS(, AC_MSG_ERROR([Python headers not found]))
+-if test "x$os_win32" = "xyes"; then
+-  AM_CHECK_PYTHON_LIBS(, AC_MSG_ERROR([Python libs not found. Windows requires Python modules to be 
explicitly linked to libpython.]))
++if test "x$link_python_libs" = "xyes"; then
++  AM_CHECK_PYTHON_LIBS(, AC_MSG_ERROR([Python libs not found. Windows and Darwin require Python modules to 
be explicitly linked to libpython.]))
+ fi
+ 
+ AC_MSG_CHECKING([for PySignal_SetWakeupFd in Python.h])
+-- 
+1.8.5.2 (Apple Git-48)
+
diff --git a/osx/build/updater/gedit-bootstrap-overrides.modules 
b/osx/build/updater/gedit-bootstrap-overrides.modules
new file mode 100644
index 0000000..37c2726
--- /dev/null
+++ b/osx/build/updater/gedit-bootstrap-overrides.modules
@@ -0,0 +1,119 @@
+<?xml version="1.0"?>
+<!DOCTYPE moduleset SYSTEM "moduleset.dtd">
+<?xml-stylesheet type="text/xsl" href="moduleset.xsl"?>
+<moduleset>
+  <repository type="tarball" name="ftp.gnome.org" default="yes" 
href="ftp://ftp.gnome.org/pub/gnome/sources/"/>
+  <repository type="tarball" name="xmlsoft.org" href="ftp://xmlsoft.org/libxml2/"/>
+  <repository type="tarball" name="itstool.org" href="http://files.itstool.org/itstool/"/>
+  <repository type="tarball" name="python" href="https://www.python.org/ftp/python/"/>
+  <repository type="tarball" name="oracle" href="http://download.oracle.com/"/>
+
+  <autotools id="berkeleydb-nonsrctree" autogen-sh="configure" 
autogen-template="%(srcdir)s/dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s %(autogenargs)s">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb-nonsrctree/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="berkeleydb" autogen-sh="configure" supports-non-srcdir-builds="no" makeargs="-C build_unix" 
autogen-template="cd build_unix; ../dist/%(autogen-sh)s --prefix %(prefix)s --libdir %(libdir)s 
%(autogenargs)s" makeinstallargs="-C build_unix install">
+
+    <branch module="berkeley-db/db-4.8.30.NC.tar.gz" version="4.8.30" repo="oracle">
+      <patch file="berkeleydb/atomic.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id='readline' autogen-sh="configure">
+    <branch repo="ftp.gnu.org" module="readline/readline-6.2.tar.gz"
+      version="6.2">
+      <patch file="http://ftp.gnu.org/gnu/readline/readline-6.2-patches/readline62-001"; strip="0"/>
+      <patch file="http://ftp.gnu.org/gnu/readline/readline-6.2-patches/readline62-002"; strip="0"/>
+      <patch file="http://ftp.gnu.org/gnu/readline/readline-6.2-patches/readline62-003"; strip="0"/>
+      <patch file="http://ftp.gnu.org/gnu/readline/readline-6.2-patches/readline62-004"; strip="0"/>
+    </branch>
+  </autotools>
+
+  <autotools id="gettext-runtime" autogen-sh="configure"
+       autogenargs="--without-emacs --disable-java --disable-native-java --disable-libasprintf 
--disable-csharp">
+    <branch repo="ftp.gnu.org" source-subdir="gettext-runtime"
+      module="gettext/gettext-0.18.1.1.tar.gz" version="0.18.1.1"
+            size="15139737" md5sum="3dd55b952826d2b32f51308f2f91aa89">
+      <patch file="http://git.gnome.org/browse/gtk-osx/plain/patches/gettext-bug33999-stpncpy.patch"; 
strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="python" autogenargs="--enable-shared"
+       autogen-sh="configure">
+    <branch repo="python"
+      module="2.7.6/Python-2.7.6.tar.xz" version="2.7.6">
+    </branch>
+    <dependencies>
+      <dep package="gettext-runtime"/>
+      <dep package='readline'/>
+    </dependencies>
+    <after>
+      <dep package="berkeleydb"/>
+      <dep package="berkeleydb-nonsrctree"/>
+    </after>
+  </autotools>
+
+  <!-- Remove annoying autogen-sh="autoreconf" when itstool.use-correct-libxml.patch is removed -->
+  <autotools id="itstool" autogen-sh="autoreconf">
+    <branch repo="itstool.org"
+            module="itstool-2.0.2.tar.bz2"
+            version="2.0.2"
+            hash="sha256:bf909fb59b11a646681a8534d5700fec99be83bb2c57badf8c1844512227033a"
+            size="96748">
+      <patch file="https://git.gnome.org/browse/jhbuild/plain/patches/itstool.use-correct-libxml.patch"; 
strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="libxml2" autogen-sh="configure" autogenargs="--with-python">
+    <branch version="2.9.0" module="libxml2-2.9.0.tar.gz"
+      repo="xmlsoft.org">
+      <patch 
file="http://git.gnome.org/browse/gtk-osx/plain/patches/libxml2-Bug-686118-pthreads_once_init.patch"; 
strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="python"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="libxslt" autogen-sh="configure">
+    <branch version="1.1.27" module="libxslt-1.1.27.tar.gz" repo="xmlsoft.org"/>
+    <dependencies>
+      <dep package="libxml2"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="yelp-xsl" autogen-sh="configure">
+    <branch module="yelp-xsl/3.10/yelp-xsl-3.10.1.tar.xz"
+            version="3.10.1"
+            hash="sha256:59c6dee3999121f6ffd33a9c5228316b75bc22e3bd68fff310beb4eeff245887" />
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="libxml2"/>
+      <dep package="intltool"/>
+      <dep package="itstool"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="yelp-tools" autogen-sh="configure">
+    <branch module="yelp-tools/3.10/yelp-tools-3.10.0.tar.xz"
+            version="3.10.0"
+            hash="sha256:ff5e1102631049b08e3ef0ade2cd10e63a62a812690e3d8558ed1413baef2611" />
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="libxml2"/>
+      <dep package="intltool"/>
+      <dep package="yelp-xsl"/>
+      <dep package="itstool"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="gtk-doc" autogenargs="--disable-scrollkeeper 
--with-xml-catalog=$JHBUILD_PREFIX/etc/xml/catalog" makeargs="-k -i" makeinstallargs="-k -i install" 
autogen-sh="configure">
+    <branch version="1.21" module="gtk-doc/1.21/gtk-doc-1.21.tar.xz" 
hash="sha256:5d934d012ee08edd1585544792efa80da271652587ba5b843d2cea8e8b80ee3e"/>
+    <dependencies>
+      <dep package="libxslt"/>
+      <dep package="yelp-tools"/>
+    </dependencies>
+  </autotools>
+</moduleset>
diff --git a/osx/build/updater/gedit-overrides.modules b/osx/build/updater/gedit-overrides.modules
new file mode 100644
index 0000000..31835da
--- /dev/null
+++ b/osx/build/updater/gedit-overrides.modules
@@ -0,0 +1,174 @@
+<?xml version="1.0"?>
+<!DOCTYPE moduleset SYSTEM "moduleset.dtd">
+<?xml-stylesheet type="text/xsl" href="moduleset.xsl"?>
+<moduleset>
+  <repository type="git" name="git.gnome.org"
+              href="git://git.gnome.org/"/>
+  <repository type="tarball" name="ftp.gnome.org" default="yes"
+              href="http://ftp.gnome.org/pub/GNOME/sources/"/>
+  <repository type="tarball" name="cairographics.org"
+              href="http://cairographics.org/releases/"/>
+  <repository type="tarball" name="iso-codes"
+              href="http://pkg-isocodes.alioth.debian.org/downloads/"/>
+  <repository type="tarball" name="abisource/enchant"
+              href="http://www.abisource.com/downloads/enchant/"; />
+
+  <autotools id="gtk+-3.0"
+       autogenargs="--enable-quartz-backend --enable-quartz-relocation --disable-colord 
--without-atk-bridge">
+    <branch module="gtk+" checkoutdir="gtk+-3.0" repo="git.gnome.org"/>
+    <dependencies>
+      <dep package="gobject-introspection"/>
+      <dep package="pango"/>
+      <dep package="gdk-pixbuf"/>
+      <dep package="atk"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="pygobject3" autogen-sh="configure --with-python=python3">
+    <branch version="3.13.4" module="pygobject/3.13/pygobject-3.13.4.tar.xz" 
hash="sha256:7efcbe8248da067a8ffd99ca2f09d6301b99a4aef2f92c1425c768c32142ed75" repo="ftp.gnome.org">
+      <patch file="patches/pygobject-Merge-multiple-platform-case-statements.patch" strip="1"/>
+    </branch>
+    <dependencies>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </dependencies>
+    <after>
+      <dep package="python"/>
+      <dep package="python3"/>
+    </after>
+  </autotools>
+
+  <waf id="pycairo-python3" autogen-sh="configure" python-command="python3">
+    <branch module="pycairo-1.10.0.tar.bz2" repo="cairographics.org" version="1.10.0" 
hash="sha1:b4283aa1cc9aafd12fd72ad371303a486da1d014"/>
+    <dependencies>
+      <dep package="python3"/>
+      <dep package="cairo"/>
+    </dependencies>
+    <after>
+      <dep package="python3"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </after>
+  </waf>
+
+  <autotools id="gtk+-3.0" autogen-sh="autogen.sh" autogenargs="--enable-quartz-backend 
--enable-quartz-relocation">
+    <branch module="gtk+/3.13/gtk+-3.13.7.tar.xz" version="3.13.7" 
hash="sha256:23db0fb9b8b8213dbfd5a5f4077904b778145ca37f622bd73961529e69878bb4" repo="ftp.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+      <dep package="pango"/>
+      <dep package="atk"/>
+      <dep package="gdk-pixbuf"/>
+      <dep package="gobject-introspection"/>
+    </dependencies>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="pango" autogen-sh="autoreconf">
+    <branch version="1.36.6" module="pango/1.36/pango-1.36.6.tar.xz" 
hash="sha256:4c53c752823723875078b91340f32136aadb99e91c0f6483f024f978a02c8624" repo="ftp.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="cairo"/>
+     </dependencies>
+    <after>
+      <dep package="gobject-introspection"/>
+      <dep package="meta-gtk-osx-freetype"/>
+      <dep package="glib"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+    </after>
+  </autotools>
+
+  <autotools id="libpeas" autogenargs="PYTHON=python3 --disable-python2 --enable-python3">
+    <branch module="libpeas" revision="3403cbe36922517be8e19fdf506274d54d29fd92" repo="git.gnome.org">
+    </branch>
+    <dependencies>
+      <dep package="python3"/>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+      <dep package="pycairo-python3"/>
+      <dep package="pygobject3"/>
+    </dependencies>
+  </autotools>
+
+  <autotools id="gsettings-desktop-schemas">
+    <branch module="gsettings-desktop-schemas/3.10/gsettings-desktop-schemas-3.10.1.tar.xz"
+            version="3.10.1"
+            hash="sha256:452378c4960a145747ec69f8c6a874e5b7715454df3e2452d1ff1a0a82e76811">
+    </branch>
+    <dependencies>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="glib"/>
+    </dependencies>
+  </autotools>
+
+   <autotools id="gtksourceview3">
+    <branch module="gtksourceview" revision="4bf401661a4ca1b204a62bddfc99aacb56f429ce" repo="git.gnome.org">
+    </branch>
+    <after>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+    </after>
+  </autotools>
+
+<!--  <autotools id="gedit-plugins" autogenargs="DATADIRNAME=share" autogen="autogen.sh">-->
+<!--    <branch module="gedit-plugins/3.2/gedit-plugins-3.2.1.tar.bz2"-->
+<!--            version="3.2.1"-->
+<!--            hash="sha256:8f6b5bc88ca61d8f0bc4dd54b2dc82473acfefd90453e4d4ffc3ca88d4182f4d">-->
+<!--      <patch 
file="http://git.gnome.org/browse/gedit/plain/osx/jhbuild/patches/gedit-plugins-disable-terminal.patch"; 
strip="1"/>-->
+<!--    </branch>-->
+<!--    <dependencies>-->
+<!--      <dep package="meta-gtk-osx-bootstrap"/>-->
+<!--      <dep package="gedit"/>-->
+<!--    </dependencies>-->
+<!--  </autotools>-->
+
+  <autotools id="adwaita-icon-theme" autogen-sh="configure">
+    <branch module="adwaita-icon-theme/3.13/adwaita-icon-theme-3.13.5.tar.xz"
+            version="3.13.5" hash="sha256:e163f5f7e205b5f5345dd7f2c30d4104f19376217ca90def83b61a9459a62dbc"/>
+    <dependencies>
+      <dep package="hicolor-icon-theme"/>
+      <dep package="icon-naming-utils"/>
+      <dep package="librsvg"/>
+    </dependencies>
+  </autotools>
+
+  <metamodule id="meta-gtk-osx-gtk3-core-themes">
+    <dependencies>
+      <dep package="icon-naming-utils"/>
+      <dep package="gnome-themes-standard"/>
+      <dep package="adwaita-icon-theme"/>
+    </dependencies>
+  </metamodule>
+
+  <metamodule id="gedit-deps">
+    <dependencies>
+      <dep package="meta-gtk-osx-bootstrap"/>
+      <dep package="meta-gtk-osx-gtk3"/>
+      <dep package="libpeas"/>
+      <dep package="gtksourceview3"/>
+      <dep package="enchant"/>
+      <dep package="gsettings-desktop-schemas"/>
+      <dep package="iso-codes"/>
+      <dep package="shared-mime-info"/>
+    </dependencies>
+  </metamodule>
+
+  <metamodule id="gedit-meta">
+    <dependencies>
+      <dep package="gedit-deps"/>
+      <!--<dep package="gedit-plugins"/>-->
+    </dependencies>
+  </metamodule>
+
+  <autotools id="gedit" autogenargs="PYTHON=python3">
+    <branch repo="git.gnome.org" module="gedit" revision="wip/3.14-osx"/>
+    <dependencies>
+      <dep package="gedit-meta"/>
+    </dependencies>
+  </autotools>
+</moduleset>
+
+<!-- vi:ex:ts=2:et -->
diff --git a/osx/build/updater/update_modulesets.py b/osx/build/updater/update_modulesets.py
new file mode 100755
index 0000000..5d0ce72
--- /dev/null
+++ b/osx/build/updater/update_modulesets.py
@@ -0,0 +1,317 @@
+#!/usr/bin/env python
+
+import lxml.etree as ET
+import lxml.objectify
+
+import subprocess, shutil, os, glob, urllib2, json, sys, difflib
+
+if not os.path.exists('.gtk-osx'):
+    subprocess.call(['git', 'clone', 'git://git.gnome.org/gtk-osx', '.gtk-osx'])
+
+try:
+    os.makedirs('.cache')
+except:
+    pass
+
+class Merger:
+    def __init__(self):
+        self.repos = {}
+        self.modules = {}
+
+    def normalize_xml(self, xml):
+        s = ET.tostring(xml)
+        o = lxml.objectify.fromstring(s)
+
+        return ET.tostring(o, pretty_print=True)
+
+    def extract_repos(self, t):
+        default = None
+
+        for repo in t.findall('./repository'):
+            name = repo.attrib['name']
+
+            if 'default' in repo.attrib:
+                default = repo
+
+            if not name in self.repos:
+                self.repos[name] = repo
+
+        return default
+
+    def parse_module(self, f):
+        t = ET.parse(f)
+        drepo = self.extract_repos(t)
+
+        tags = {}
+
+        for x in t.getroot().findall('./'):
+            if x.tag == 'include' or x.tag == 'repository':
+                continue
+
+            branch = x.find('./branch')
+
+            if not branch is None and not 'repo' in branch.attrib:
+                branch.attrib['repo'] = drepo.attrib['name']
+
+            id = x.attrib['id']
+
+            if id in self.modules:
+                print('Overriding existing module {0}:'.format(id))
+
+                a = self.normalize_xml(self.modules[id]).splitlines(True)
+                b = self.normalize_xml(x).splitlines(True)
+
+                print(''.join(difflib.unified_diff(a, b, fromfile='old', tofile='new')))
+                print('\n')
+
+                sys.stdout.write('Do you want to keep the original, or the new file? [(o)riginal, (n)new] ')
+                sys.stdout.flush()
+                answer = sys.stdin.readline().rstrip()
+
+                if answer == '' or answer == 'n' or answer == 'new':
+                    self.modules[id] = x
+                    print('Using new version\n')
+                else:
+                    print('Used original version\n')
+            else:
+                self.modules[id] = x
+
+    def copy_patches(self, mod):
+        # Copy patches locally
+        patches = mod.findall('./branch/patch')
+
+        if len(patches) == 0:
+            return
+
+        dname = 'modulesets/patches/' + mod.attrib['id']
+
+        try:
+            os.makedirs(dname)
+        except:
+            pass
+
+        locc = 'http://git.gnome.org/browse/gtk-osx/plain/'
+
+        for p in patches:
+            f = p.attrib['file']
+
+            pname = os.path.basename(f)
+
+            if f.startswith(locc):
+                shutil.copyfile('.gtk-osx/' + f[len(locc):], dname + '/' + pname)
+            elif f.startswith('patches/'):
+                shutil.copyfile('../' + f, dname + '/' + pname)
+            else:
+                content = self.from_cache_or_url(os.path.join('patches', mod.attrib['id'], pname), f)
+
+                with open(dname + '/' + pname, 'w') as patch:
+                    patch.write(content)
+
+            p.attrib['file'] = mod.attrib['id'] + '/' + pname
+
+    def from_cache_or_url(self, filename, url):
+        cfile = os.path.join('.cache', filename)
+
+        try:
+            with open(cfile) as f:
+                return f.read()
+        except:
+            pass
+
+        resp = urllib2.urlopen(url)
+        ret = resp.read()
+        resp.close()
+
+        dname = os.path.dirname(cfile)
+
+        try:
+            os.makedirs(dname)
+        except:
+            pass
+
+        try:
+            with open(cfile, 'w') as f:
+                f.write(ret)
+        except:
+            pass
+
+        return ret
+
+    def update_module(self, mod):
+        branch = mod.find('./branch')
+
+        if branch is None:
+            return
+
+        if not branch.attrib['repo'].endswith('.gnome.org'):
+            return
+
+        # Check for latest versions
+        repo = self.repos[branch.attrib['repo']]
+
+        if repo.attrib['type'] != 'tarball':
+            return
+
+        module = branch.attrib['module']
+
+        modname = module.split('/', 2)[0]
+        version = [int(x) for x in branch.attrib['version'].split('.')]
+
+        # Skip updating gtk+ 2.x
+        if modname == 'gtk+' and version[0] == 2:
+            return
+
+        href = repo.attrib['href']
+        versions = self.from_cache_or_url(mod.attrib['id'] + '.json', href + modname + '/cache.json')
+        versions = json.loads(versions)
+
+        latest = [version, version]
+
+        for v in versions[1][modname]:
+            vv = [int(x) for x in v.split('.')]
+
+            if vv[1] % 2 == 0:
+                if vv > latest[0] and vv[0] == latest[0][0]:
+                    latest[0] = vv
+            else:
+                if vv > latest[1] and vv[0] == latest[1][0]:
+                    latest[1] = vv
+
+        if latest[0] > version or latest[1] > version:
+            choices = []
+
+            if latest[0] > version:
+                choices.append('stable = {0}'.format('.'.join([str(x) for x in latest[0]])))
+
+            if latest[1] > version:
+                choices.append('unstable = {0}'.format('.'.join([str(x) for x in latest[1]])))
+
+            sversion = '.'.join([str(x) for x in version])
+            print('Found new versions for {0} = {1}: {2}'.format(modname, sversion, ', '.join(choices)))
+
+            sys.stdout.write('Do you want to update? [(s)table/(u)nstable/(n)o]: ')
+            sys.stdout.flush()
+            answer = sys.stdin.readline().rstrip()
+
+            nv = None
+
+            if answer == '':
+                if latest[0] > latest[1]:
+                    answer = 'stable'
+                else:
+                    answer = 'unstable'
+
+            if (answer == 'stable' or answer == 's') and latest[0] > version:
+                nv = latest[0]
+            elif (answer =='unstable' or answer == 'u') and latest[1] > version:
+                nv = latest[1]
+
+            if not nv is None:
+                v = '.'.join([str(x) for x in nv])
+                info = versions[1][modname][v]
+                branch.attrib['version'] = v
+                branch.attrib['module'] = '{0}/{1}'.format(modname, info['tar.xz'])
+
+                hfile = href + modname + '/' + info['sha256sum']
+
+                ret = self.from_cache_or_url(os.path.join('hashes', modname, info['sha256sum']), hfile)
+
+                for line in ret.splitlines():
+                    hash, fname = line.rstrip().split(None, 2)
+
+                    if fname == os.path.basename(info['tar.xz']):
+                        branch.attrib['hash'] = 'sha256:{0}'.format(hash)
+
+                print('Updated to version {0}\n'.format(v))
+            else:
+                print('Keep version {0}\n'.format(sversion))
+
+    def merge(self, modules, entry_point, overrides):
+        self.modules = {}
+        self.repos = {}
+
+        for mod in modules:
+            self.parse_module(mod)
+
+        self.required_modules = []
+        processed = set()
+
+        self.parse_module(overrides)
+
+        process = [self.modules[entry_point]]
+        processed.add(entry_point)
+
+        while len(process) != 0:
+            mod = process.pop()
+            id = mod.attrib['id']
+
+            self.required_modules.insert(0, mod)
+
+            deps = mod.findall('./dependencies/dep') + mod.findall('./after/dep') + 
mod.findall('./suggests/dep')
+
+            for dep in deps:
+                package = dep.attrib['package']
+
+                if package in processed:
+                    continue
+
+                if not package in self.modules:
+                    sys.stderr.write('Package dependency is not in modules... {0}\n'.format(package))
+                    sys.exit(1)
+
+                processed.add(package)
+                process.insert(0, self.modules[package])
+
+    def write(self, f):
+        needed_repos = {}
+
+        for mod in self.required_modules:
+            branch = mod.find('./branch')
+
+            if not branch is None and 'repo' in branch.attrib:
+                needed_repos[branch.attrib['repo']] = self.repos[branch.attrib['repo']]
+
+        try:
+            os.makedirs('.cache')
+        except:
+            pass
+
+        for mod in self.required_modules:
+            self.copy_patches(mod)
+            self.update_module(mod)
+
+        with open(f, 'w') as f:
+            root = ET.Element('moduleset')
+
+            for repo in needed_repos:
+                root.append(needed_repos[repo])
+
+            for mod in self.required_modules:
+                root.append(mod)
+
+            ret = ET.ElementTree(root)
+
+            content = ET.tostring(ret, pretty_print=True, xml_declaration=True, encoding='utf-8', 
doctype='<!DOCTYPE moduleset SYSTEM "moduleset.dtd">')
+            f.write(content)
+
+shutil.rmtree('modulesets', ignore_errors=True)
+
+os.makedirs('modulesets')
+os.makedirs('modulesets/patches')
+
+allf = glob.glob('.gtk-osx/modulesets-stable/*.modules')
+
+nobs = [x for x in allf if os.path.basename(x) != 'bootstrap.modules']
+bs = [x for x in allf if os.path.basename(x) == 'bootstrap.modules']
+
+m = Merger()
+
+m.merge(nobs, 'gedit', 'gedit-overrides.modules')
+m.write('modulesets/gedit.modules')
+
+m.merge(bs, 'meta-bootstrap', 'gedit-bootstrap-overrides.modules')
+m.write('modulesets/bootstrap.modules')
+
+print('New modules have been written to "modulesets"')
+
+# vi:ts=4:et


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]