moo-poelzi / makewin

#!/usr/bin/env python

import os
import sys
import getopt

def get_version():
    sys.path.insert(0, moo_builddir)
    import config
    return config.version

dir = os.getcwd()
builddir = dir
thisscript = os.path.abspath(sys.argv[0])
moo_windir = "/usr/local/win/medit"
strip = "i586-mingw32msvc-strip --strip-unneeded"
do_strip = True
do_zip = False
pida = False
bin_only = False
no_python = False
installer = None
release = False
name = None
dry_run = False
data_dirs = []

def usage():
    print "Usage: %s [--dry-run] [--no-strip] [--bin-only] [--zip] [--pida] [--no-python] [build_dir] [additional_dir1] ..." % (sys.argv[0],)
    print "       %s [--dry-run] --release build_dir gtk_dir python_dir" % (sys.argv[0],)
    sys.exit(2)

try:
    opts, args = getopt.getopt(sys.argv[1:], "", ["dry-run", "no-strip", "no-python", "bin-only", "zip", "pida", "release", "name="])
except getopt.GetoptError:
    usage()

for o, a in opts:
    if o == "--no-strip":
        do_strip = False
    if o == "--bin-only":
        bin_only = True
    if o == "--no-python":
        no_python = True
    if o == "--zip":
        do_zip = True
    if o == "--pida":
        pida = True
    if o == "--release":
        release = True
    if o == "--name":
        name = a
    if o == "--dry-run":
        dry_run = True
if args:
    moo_builddir = os.path.abspath(args[0])
else:
    moo_builddir = builddir
if args[1:]:
    data_dirs = [os.path.abspath(d) for d in args[1:]]

if pida:
    do_zip = True
    name = "medit-pida-%s.zip" % (get_version(),)

if release:
    if len(data_dirs) != 2:
        usage()

installdir = dir + "/inst_"

issdir = "Z:%s/medit" % (moo_builddir,)
iss = issdir + "/medit.iss"


class Error(Exception):
    def __init__(self, status):
        Exception.__init__(self)
        self.status = status

def do_cmd(cmd, force=False):
    print cmd
    if force or not dry_run:
        status = os.system(cmd)
        if status:
            raise Error(status)

def copy_mime():
    do_cmd("mkdir -p %s/mime/packages" % (installdir,))
    do_cmd("cp %s/usr/local/win/gtk/share/mime/packages/moo.xml %s/mime/packages" % (installdir, installdir))
    do_cmd("cp /usr/share/mime/packages/freedesktop.org.xml %s/mime/packages" % (installdir,))
    do_cmd("update-mime-database %s/mime" % (installdir,))
    do_cmd("mkdir -p %s/share/mime/" % (moo_windir,))
    do_cmd("cp %s/mime/mime.cache %s/share/mime/" % (installdir, moo_windir))
    do_cmd("rm -fr %s/mime/" % (installdir,))

def copy_files():
    if data_dirs:
        for d in data_dirs:
            do_cmd("cp -r %s/* %s/" % (d, moo_windir))

    do_cmd("mkdir -p %s/bin" % (moo_windir,))
    do_cmd("cp -r %s/usr/local/win/gtk/bin/libmoo.dll %s/bin/" % (installdir, moo_windir))

    if not pida:
        do_cmd("cp -r %s/usr/local/win/gtk/bin/medit.exe %s/bin/" % (installdir, moo_windir))

    if not bin_only:
        do_cmd("mkdir -p %s/share/mime" % (moo_windir,))
        do_cmd("mkdir -p %s/lib/moo" % (moo_windir,))

        do_cmd("cp -r %s/usr/local/win/gtk/share/moo %s/share/" % (installdir, moo_windir))
        do_cmd("cp -r %s/usr/local/win/gtk/lib/locale %s/lib/" % (installdir, moo_windir))
        copy_mime()

        if not no_python:
            do_cmd("cp -r %s/usr/local/win/gtk/lib/moo/plugins %s/lib/moo/" % (installdir, moo_windir))
            if os.path.exists("%s/usr/local/win/gtk/lib/moo/projects" % (installdir,)):
                do_cmd("cp -r %s/usr/local/win/gtk/lib/moo/projects %s/lib/moo/" % (installdir, moo_windir))

            if pida:
                do_cmd("mkdir -p %s/lib/site-packages" % (moo_windir,))
                do_cmd("cp %s/usr/local/win/gtk/lib/moo/plugins/lib/moo.pyd %s/lib/site-packages/moo.pyd" % (installdir, moo_windir))
            else:
                do_cmd("mkdir -p %s/lib/moo/plugins" % (moo_windir,))
                do_cmd("cp %s/usr/local/win/gtk/lib/moo/plugins/pymoo.dll %s/lib/moo/plugins/" % (installdir, moo_windir))
                do_cmd("cp %s/usr/local/win/gtk/lib/moo/plugins/lib/moo.pyd %s/lib/moo/plugins/" % (installdir, moo_windir))

    if do_strip:
        if not bin_only and not no_python:
            if pida:
                do_cmd("%s %s/lib/site-packages/*.pyd" % (strip, moo_windir))
            else:
                do_cmd("%s %s/lib/moo/plugins/*.dll" % (strip, moo_windir))
                do_cmd("%s %s/lib/moo/plugins/*/*.pyd" % (strip, moo_windir))
        do_cmd("%s %s/bin/medit.exe %s/bin/libmoo.dll" % (strip, moo_windir, moo_windir))

def build():
    global installer

    if release:
        script = thisscript
        if dry_run:
            script += " --dry-run"
        installer_no_gtk = "medit-no-gtk-%s.exe" % (get_version(),)
        installer_no_python = "medit-%s.exe" % (get_version(),)
        installer_python = "medit-python-%s.exe" % (get_version(),)
        do_cmd('%s --name=%s "%s"' % (script, installer_no_gtk, moo_builddir), True)
        do_cmd('%s --name=%s "%s" "%s"' % (script, installer_no_python, moo_builddir, data_dirs[0]), True)
        do_cmd('%s --name=%s "%s" "%s" "%s"' % (script, installer_python, moo_builddir, data_dirs[0], data_dirs[1]), True)
        print ""
        print "+++ Success +++"
        print "Installers: %s, %s, %s" % (installer_no_gtk, installer_no_python, installer_python)
        sys.exit(0)

    do_cmd("mkdir " + moo_windir)
    do_cmd("mkdir " + installdir)
    os.chdir(moo_builddir)
    do_cmd("make install DESTDIR=" + installdir)
    copy_files()

    if do_strip:
        dbg = ""
    else:
        dbg = "dbg-"

    if do_zip:
        zipdir = "medit-" + dbg + get_version()
        installer = name or (zipdir + ".zip")
        do_cmd("rm -fr %s %s" % (zipdir, installer))
        do_cmd("mv %s ./%s" % (moo_windir, zipdir))
        do_cmd("zip -r9 %s %s" % (installer, zipdir))
        do_cmd("rm -fr %s" % (zipdir,))
    else:
        installer = name or ("medit-" + dbg + get_version() + ".exe")
        do_cmd("wine /usr/local/win/InnoSetup5/ISCC.exe " + iss)
        do_cmd("mv %s/medit/Output/setup.exe %s/%s" % (moo_builddir, dir, installer))

def clean():
    do_cmd("rm -rf %s %s %s" % (moo_windir, installdir,
                                moo_builddir + "/medit/Output"))

try:
    build()
except Error, e:
    clean()
    sys.exit(e.status)

clean()
print "*** Success ***"
print "Installer: ", installer
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.