

DB_VERSION = '4.5.20'
DB_URL = 'http://download.oracle.com/berkeley-db/db-%s.tar.gz' % DB_VERSION
DB_PATCHES = ['http://www.oracle.com/technology/products/berkeley-db/db/update/4.5.20/patch.4.5.20.1',
              'http://www.oracle.com/technology/products/berkeley-db/db/update/4.5.20/patch.4.5.20.2']
DB_FILES = ['db_static.vcproj', 'db_static_dbginfo.vsprops']
DB_CONFIGURE = '--disable-cryptography --disable-replication ' + \
               '--disable-statistics --disable-shared --enable-static'

LIBICONV_VERSION = '1.11'
LIBICONV_URL = 'ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-%s.tar.gz' % LIBICONV_VERSION
LIBICONV_CONFIGURE = '--disable-shared'

GETTEXT_VERSION = '0.16.1'
GETTEXT_URL = 'ftp://ftp.gnu.org/pub/gnu/gettext/gettext-%s.tar.gz' % GETTEXT_VERSION
GETTEXT_PATCHES = ['gettext-0.16.1-mingw-localenames.patch']
GETTEXT_CONFIGURE = '--disable-java ' + \
                    '--disable-rpath --disable-openmp ' + \
                    '--disable-shared '
GETTEXT_BINARIES = ['msgfmt', 'msgmerge', 'msgunfmt', 'xgettext', 'msgcat']

WX_VERSION = '2.8.6'
WX_URL = 'ftp://ftp.wxwidgets.org/pub/%s/wxWidgets-%s.tar.bz2' % (WX_VERSION, WX_VERSION)
WX_PATCHES = ['wx-2.8.6-mac-dialog-fix.patch']
# NB: don't use --enable-debug_info, it forces -O0!
WX_CONFIGURE = '--disable-shared --enable-unicode --disable-tga'
WX_WINFLAGS = 'SHARED=0 BUILD=release DEBUG_INFO=1 UNICODE=1 USE_MEDIA=0 USE_AUI=0 USE_RICHTEXT=0 USE_STC=0 USE_QA=1'

SPARKLE_VERSION = '1.1'
SPARKLE_URL = 'http://www.andymatuschak.org/files/Sparkle-%s.zip' % SPARKLE_VERSION
SPARKLE_PATCHES = ['sparkle-1.1-carbon.patch']

INNOSETUP_VERSION = '5.2.2'
INNOSETUP_URL = 'http://files.jrsoftware.org/ispack/ispack-%s.exe' % INNOSETUP_VERSION
INNOUNP_URL = 'http://innounp.sf.net/test020.rar'


from rlsbot import BuildEnvironment
env = BuildEnvironment()


env['OSX_SDKROOT'] = '/Developer/SDKs/MacOSX10.4u.sdk'
env['OSX_CFLAGS'] = '-isysroot $OSX_SDKROOT -O2 -ggdb3'
env['OSX_CXXFLAGS'] = '-isysroot $OSX_SDKROOT -O2 -ggdb3'
env['OSX_OBJCFLAGS'] = '-isysroot $OSX_SDKROOT -O2 -ggdb3'
env['OSX_LDFLAGS'] = '-Wl,-syslibroot,$OSX_SDKROOT -ggdb3' # -feliminate-dwarf2-dups'
env['OSX_CFLAGS_PPC'] = '$OSX_CFLAGS -arch ppc'
env['OSX_CXXFLAGS_PPC'] = '$OSX_CXXFLAGS -arch ppc'
env['OSX_OBJCFLAGS_PPC'] = '$OSX_OBJCFLAGS -arch ppc'
env['OSX_LDFLAGS_PPC'] = '$OSX_LDFLAGS -arch ppc'
env['OSX_CFLAGS_X86'] = '$OSX_CFLAGS -arch i386'
env['OSX_CXXFLAGS_X86'] = '$OSX_CXXFLAGS -arch i386'
env['OSX_OBJCFLAGS_X86'] = '$OSX_OBJCFLAGS -arch i386'
env['OSX_LDFLAGS_X86'] = '$OSX_LDFLAGS -arch i386'
env['OSX_HOST_PPC'] = 'powerpc-apple-darwin8'
env['OSX_HOST_X86'] = 'i686-apple-darwin8'

# FIXME: this should be per-agent configuration
env['MINGW_HOST'] = 'i686-pc-mingw32'

# FIXME: this should be per-agent configuration
# FIXME: have some directives on specifying what is required from the agent
# native type of the agent we're executing on
env['OSX_NATIVE'] = 'ppc' # 'ppc' or 'x86'

OSX_ENVIRONMENT_COMMON = {
        'MACOSX_DEPLOYMENT_TARGET' : '10.4',
    }

OSX_ENVIRONMENT_PPC = {
        'CFLAGS'   : '$OSX_CFLAGS_PPC',
        'CXXFLAGS' : '$OSX_CXXFLAGS_PPC',
        'OBJCFLAGS' : '$OSX_OBJCFLAGS_PPC',
        'LDFLAGS'  : '$OSX_LDFLAGS_PPC',
    }
OSX_ENVIRONMENT_PPC.update(OSX_ENVIRONMENT_COMMON)

OSX_ENVIRONMENT_X86 = {
        'CFLAGS'   : '$OSX_CFLAGS_X86',
        'CXXFLAGS' : '$OSX_CXXFLAGS_X86',
        'OBJCFLAGS' : '$OSX_OBJCFLAGS_X86',
        'LDFLAGS'  : '$OSX_LDFLAGS_X86',
    }
OSX_ENVIRONMENT_X86.update(OSX_ENVIRONMENT_COMMON)


# FIXME: these two should be in agent-specific (SCons) environment rather
#        that agent/target execution (OS) environment
MINGW_ENVIRONMENT = {
        'CC'        : '$MINGW_HOST-gcc',
        'CXX'       : '$MINGW_HOST-g++',
    }

VS2005_ENVIRONMENT = {
        'MSVS_PATH' : 'C:\\Program Files\\Microsoft Visual Studio 8',
        'PSDK_PATH' : 'C:\\Program Files\\Microsoft Platform SDK',
    }


# -----------------------------------------------------------------
# Berkeley DB
# -----------------------------------------------------------------

src_db = env.ComponentSources(
        name='db',
        source=DB_URL,
        patches=DB_PATCHES,
        morefiles=DB_FILES,
        post_commands=['mv db_static* build_windows'])


db_osx_ppc = env.BuildComponent(
        name='db-osx-ppc',
        agent='osx',
        sources=src_db,
        deps=None,
        commands=[
            '(cd build_unix ; ../dist/configure --host=$OSX_HOST_PPC --prefix=/usr/local %s)' % DB_CONFIGURE,
            '(cd build_unix ; make)',
            '(cd build_unix; make install DESTDIR=`pwd`/../D)',
            'rm -rf D/usr/local/docs'
            ],
        environment=OSX_ENVIRONMENT_PPC,
        outputs=['D/usr/local/*'])

db_osx_x86 = env.BuildComponent(
        name='db-osx-x86',
        agent='osx',
        sources=src_db,
        deps=None,
        commands=[
            '(cd build_unix ; ../dist/configure --host=$OSX_HOST_X86 --prefix=/usr/local %s)' % DB_CONFIGURE,
            '(cd build_unix ; make)',
            '(cd build_unix; make install DESTDIR=`pwd`/../D)',
            'rm -rf D/usr/local/docs'
            ],
        environment=OSX_ENVIRONMENT_X86,
        outputs=['D/usr/local/*'])

db_osx = env.Alias('build-db-osx', [db_osx_ppc, db_osx_x86])


db_win32 = env.BuildComponent(
        name='db-win32',
        agent=['win32','vs2005'],
        sources=src_db,
        deps=None,
        toolchain=env.VisualStudioToolchain,
        commands=[
            'cd build_windows',
            'vcbuild /useenv /override:db_static_dbginfo.vsprops /platform:Win32 db_static.vcproj Release',
            'del /f /q Release\\db_static\\*.*',
            ],
        environment=VS2005_ENVIRONMENT,
        outputs=['build_windows'])


# -----------------------------------------------------------------
# libiconv (needed by gettext)
# -----------------------------------------------------------------

src_libiconv = env.ComponentSources(
        name='libiconv',
        source=LIBICONV_URL)


libiconv_win32 = env.BuildComponent(
        name='libiconv-win32',
        agent='mingw',
        sources=src_libiconv,
        deps=None,
        commands=[
            './configure --host=$MINGW_HOST %s' % LIBICONV_CONFIGURE,
            'make',
            'make install DESTDIR=`pwd`/D',
            ],
        environment=MINGW_ENVIRONMENT,
        outputs=['D/usr/local/*'])

# -----------------------------------------------------------------
# GNU gettext
# -----------------------------------------------------------------

src_gettext = env.ComponentSources(
        name='gettext',
        source=GETTEXT_URL,
        patches=GETTEXT_PATCHES)

gettext_osx_ppc = env.BuildComponent(
        name='gettext-osx-ppc',
        agent='osx',
        sources=src_gettext,
        deps=None,
        commands=[
            './configure --host=$OSX_HOST_PPC --with-libiconv-prefix=$OSX_SDKROOT/usr %s' % GETTEXT_CONFIGURE,
            'make',
            'make install DESTDIR=`pwd`/D',
            ],
        environment=OSX_ENVIRONMENT_PPC,
        outputs=['D/usr/local/bin/*'])

gettext_osx_x86 = env.BuildComponent(
        name='gettext-osx-x86',
        agent='osx',
        sources=src_gettext,
        deps=None,
        commands=[
            './configure --host=$OSX_HOST_X86 --with-libiconv-prefix=$OSX_SDKROOT/usr %s' % GETTEXT_CONFIGURE,
            'make',
            'make install DESTDIR=`pwd`/D',
            ],
        environment=OSX_ENVIRONMENT_X86,
        outputs=['D/usr/local/bin/*'])

gettext_osx = env.BuildComponent(
        name='gettext-osx',
        agent='osx',
        sources=[],
        deps=[(gettext_osx_ppc, 'ppc'), (gettext_osx_x86, 'x86')],
        commands=[
            'mkdir univ',
            'for i in %s ; do lipo -arch ppc ppc/$$i -arch i386 x86/$$i -create -output univ/$$i; done' % ' '.join(GETTEXT_BINARIES)
            ],
        environment=OSX_ENVIRONMENT_COMMON,
        outputs=['univ/*'])

gettext_win32 = env.BuildComponent(
        name='gettext-win32',
        agent='mingw',
        sources=src_gettext,
        deps=[(libiconv_win32, 'libiconv')],
        commands=[
            './configure --host=$MINGW_HOST --with-libiconv-prefix=`pwd`/libiconv %s' % GETTEXT_CONFIGURE,
            'make',
            'make install-strip DESTDIR=`pwd`/D',
            'cp COPYING `pwd`/D/usr/local/bin',
            ],
        environment=MINGW_ENVIRONMENT,
        outputs=['D/usr/local/bin/*'])


# -----------------------------------------------------------------
# Sparkle
# -----------------------------------------------------------------

src_sparkle = env.ComponentSources(
        name='sparkle',
        source=SPARKLE_URL,
        patches=SPARKLE_PATCHES)


sparkle = env.BuildComponent(
        name='sparkle',
        agent='osx',
        sources=src_sparkle,
        deps=None,
        commands=[
            'cd Extras/Source',
            'xcodebuild -project Sparkle.xcodeproj -target Sparkle -configuration Release',
            ],
        environment=OSX_ENVIRONMENT_COMMON,
        outputs=['Extras/Source/build/Release/*'])

# -----------------------------------------------------------------
# wxWidgets
# -----------------------------------------------------------------

src_wx = env.ComponentSources(
        name='wx',
        source=WX_URL,
        patches=WX_PATCHES,
        post_commands=['(cd locale ; make allmo)'])

wx_osx_ppc = env.BuildComponent(
        name='wx-osx-ppc',
        agent='osx',
        sources=src_wx,
        deps=None,
        commands=[
            './configure --host=$OSX_HOST_PPC %s' % WX_CONFIGURE,
            'make',
            'make install DESTDIR=`pwd`/D',
            '(cd D/usr/local/bin; ln -sf ../lib/wx/config/* wx-config)'],
        environment=OSX_ENVIRONMENT_PPC,
        outputs=['D/usr/local/*'])

wx_osx_x86 = env.BuildComponent(
        name='wx-osx-x86',
        agent='osx',
        sources=src_wx,
        deps=None,
        commands=[
            './configure --host=$OSX_HOST_X86 %s' % WX_CONFIGURE,
            'make',
            'make install DESTDIR=`pwd`/D',
            '(cd D/usr/local/bin; ln -sf ../lib/wx/config/* wx-config)'],
        environment=OSX_ENVIRONMENT_X86,
        outputs=['D/usr/local/*'])

wx_osx = env.Alias('build-wx-osx', [wx_osx_ppc, wx_osx_x86])

wx_win32 = env.BuildComponent(
        name='wx-win32',
        agent=['win32', 'vs2005'],
        sources=src_wx,
        deps=None,
        toolchain=env.VisualStudioToolchain,
        commands=[
            'cd build/msw',
            'nmake -f makefile.vc %s' % WX_WINFLAGS,
            'cd ../../utils/wxrc',
            'nmake -f makefile.vc %s' % WX_WINFLAGS],
        environment=VS2005_ENVIRONMENT,
        outputs=['include', 'lib', 'locale', 'utils/wxrc/vc_*/wxrc.exe*'])


# -----------------------------------------------------------------
# innosetup
# -----------------------------------------------------------------

src_innounp = env.ComponentSources(
        name='innounp',
        source=INNOUNP_URL)

src_innosetup = env.ComponentSources(
        name='innosetup',
        source=INNOSETUP_URL)

innosetup = env.BuildComponent(
        name='innosetup',
        agent='win32',
        sources=src_innosetup,
        deps=[src_innounp],
        commands=[
            'innounp -x ispack-5.2.2.exe',
            'move {app}\\ISCC?2.exe {app}\\ISCC.exe',
            'del {app}\\ISCC?1.exe',
            'move {app}\\ISCmplr?2.dll {app}\\ISCmplr.dll',
            'move {app}\\ISCmplr?1.dll {app}\\ISCmplr.dls',
        ],
        outputs=['{app}/*'])


# -----------------------------------------------------------------
# poedit
# -----------------------------------------------------------------

src_poedit = env.ComponentSources(
        name='poedit',
        source='..',
        post_commands=['./bootstrap'])

poedit_tarball = env.BuildComponent(
        name='poedit-tarball',
        agent='unix',
        sources=src_poedit,
        deps=None,
        commands=['./make-distrib.sh'],
        outputs=['poedit-*.tar.gz'])

poedit_osx = env.BuildComponent(
        name='poedit-osx',
        agent='osx',
        sources=src_poedit,
        deps=[
              (wx_osx_ppc, 'ppc/deps'),
              (wx_osx_x86, 'x86/deps'),
              (db_osx_ppc, 'ppc/deps'),
              (db_osx_x86, 'x86/deps'),
              (gettext_osx, 'deps/gettext'),
              (sparkle, 'deps/sparkle'),
              ],
        commands=[
            # build PPC binary:
            'cd ppc',
            '../configure'
            '  --host=$OSX_HOST_PPC'
            '  --with-wx-config=`pwd`/deps/bin/wx-config --with-wx-prefix=`pwd`/deps'
            '  --with-sparkle=`pwd`/../deps/sparkle'
            '  CFLAGS="$OSX_CFLAGS_PPC"'
            '  CXXFLAGS="$OSX_CXXFLAGS_PPC"'
            '  OBJCFLAGS="$OSX_OBJCFLAGS_PPC"'
            '  CPPFLAGS="-I`pwd`/deps/include"'
            '  LDFLAGS="$OSX_LDFLAGS_PPC -L`pwd`/deps/lib"'
            '  WXRC="`pwd`/../$OSX_NATIVE/deps/bin/wxrc"',
            'make',
            'cd ..',
            # build Intel binary:
            'cd x86',
            '../configure'
            '  --host=$OSX_HOST_X86'
            '  --with-wx-config=`pwd`/deps/bin/wx-config --with-wx-prefix=`pwd`/deps'
            '  --with-sparkle=`pwd`/../deps/sparkle'
            '  CFLAGS="$OSX_CFLAGS_X86"'
            '  CXXFLAGS="$OSX_CXXFLAGS_X86"'
            '  OBJCFLAGS="$OSX_OBJCFLAGS_X86"'
            '  CPPFLAGS="-I`pwd`/deps/include"'
            '  LDFLAGS="$OSX_LDFLAGS_X86 -L`pwd`/deps/lib"'
            '  WXRC="`pwd`/../$OSX_NATIVE/deps/bin/wxrc"',
            'make',
            # merge them:
            'mv src/poedit src/poedit-x86',
            'lipo -arch ppc ../ppc/src/poedit -arch i386 src/poedit-x86 -create -output src/poedit',
            # finally, create the bundle:
            'GETTEXT_BINARIES="`pwd`/../deps/gettext" WX_ROOT="`pwd`/deps" make dist-osx',
            ],
        environment=OSX_ENVIRONMENT_COMMON,
        outputs=['x86/poedit-*.dmg', 'x86/src/*dSYM*'])

poedit_win32 = env.BuildComponent(
        name='poedit-win32',
        agent=['win32', 'vs2005'],
        sources=src_poedit,
        deps=[
              (wx_win32, 'deps/wx'),
              (gettext_win32, 'deps/gettext'),
              (db_win32, 'deps/db'),
              (innosetup, 'deps/inno'),
              ],
        toolchain=env.VisualStudioToolchain,
        commands=[
            'cd win32',
            'set WXWIN=..\\deps\\wx',
            'set WXRC="%WXWIN%\\wxrc.exe"',
            'nmake -f makefile.vc WX_DEBUG=0 WXRC=%WXRC% DB_PATH=..\\deps\\db',
            '..\\deps\\inno\\iscc poedit.iss',
            ],
        environment=VS2005_ENVIRONMENT,
        outputs=['poedit-*-setup.exe', 'win32/poedit.pdb'])
