import os

# From elias's xcodebuild for iphone
# /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -x c -arch armv6 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 "-DCMAKE_INTDIR=\"Debug\"" -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb -miphoneos-version-min=4.3 -I/Users/elias/prog/git5/build-iphone/lib/Debug/include -I/Users/elias/prog/git5/include -I/Users/elias/prog/git5/build-iphone/include -I/Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphoneos/allegro.build/DerivedSources/armv6 -I/Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphoneos/allegro.build/DerivedSources -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -F/Users/elias/prog/git5/build-iphone/lib/Debug -std=gnu99 -W -Wall -DDEBUGMODE=1 -DD3D_DEBUG_INFO -DALLEGRO_SRC -DALLEGRO_STATICLINK -DALLEGRO_LIB_BUILD -c /Users/elias/prog/git5/src/allegro.c -o /Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphoneos/allegro.build/Objects-normal/armv6/allegro.o

# x86 build for the simulator
# /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -x c -arch i386 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 "-DCMAKE_INTDIR=\"Debug\"" -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -fexceptions -fasm-blocks -mmacosx-version-min=10.6 -gdwarf-2 -D__IPHONE_OS_VERSION_MIN_REQUIRED=40300 -I/Users/elias/prog/git5/build-iphone/lib/Debug/include -I/Users/elias/prog/git5/include -I/Users/elias/prog/git5/build-iphone/include -I/Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphonesimulator/allegro.build/DerivedSources/i386 -I/Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphonesimulator/allegro.build/DerivedSources -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -F/Users/elias/prog/git5/build-iphone/lib/Debug -std=gnu99 -W -Wall -DDEBUGMODE=1 -DD3D_DEBUG_INFO -DALLEGRO_SRC -DALLEGRO_STATICLINK -DALLEGRO_LIB_BUILD -c /Users/elias/prog/git5/src/allegro.c -o /Users/elias/prog/git5/build-iphone/ALLEGRO.build/Debug-iphonesimulator/allegro.build/Objects-normal/i386/allegro.o


sim_env = Environment(ENV = os.environ)
phone_env = Environment(ENV = os.environ)

gccversion = '4.2'
iostarget = '4.3'
osxtarget = '10.6'

postfix = '-%s' % gccversion
def setGCC(env):
    def setup(x, post):
        return '%s%s' % (x, post)
    # only the compiler can have different versions
    # maybe use clang here?
    env['CC'] = setup('gcc', postfix)
    env['CXX'] = setup('g++', postfix)

    # env['LD'] = setup('ld', postfix)
    # env['AS'] = setup('as', postfix)
    # env['AR'] = setup('ar', postfix)
    # env['OBJCOPY'] = setup('objcopy', postfix)

def stringify(array):
    str = ''
    for item in array:
        str += item + ' '
    return [str.split(" ")]

def makeAll(base, path):
    # print "Make all %s" % path
    dir, rest = os.path.split(path)
    if dir != '':
        makeAll(base, dir)
    Execute(Mkdir("%s/%s" % (base, dir)))
    # print "dir %s rest %s" % (dir, rest)

def stripAllegro(path):
    head, tail = os.path.split(path)
    if tail == 'allegro5':
        return tail
    return os.path.join(stripAllegro(head), tail)

def copyHeaders(where):
    headers = Glob('include/allegro5/*/*.h') + Glob('allegro/include/allegro5/*/*.h') + Glob('allegro/include/allegro5/*.h') + Glob('allegro/include/allegro5/*/*/*.h') + Glob('allegro/include/allegro5/*/*.inl') + Glob('allegro/addons/*/allegro5/*.h') + Glob('allegro/addons/*/allegro5/*/*.h')
    for header in headers:
        # print "Make directory for %s" % stripAllegro(header.path)
        makeAll(where, stripAllegro(header.path))
        Execute(Copy('%s/%s' % (where, stripAllegro(header.path)), header))
        # Copy('%s/%s' % (where, stripAllegro(header.path)), header)

def baseEnv(platform, arch, name):
    base = Environment(ENV = os.environ)
    bin_dir = '/Developer/Platforms/%s.platform/Developer/usr/bin' % platform
    base.PrependENVPath('PATH', bin_dir)
    sdkroot = '/Developer/Platforms/%s.platform/Developer/SDKs/%s%s.sdk' % (platform, platform, iostarget)
    setGCC(base)

    cflags = ['-arch %s' % arch, '-pipe', '-mdynamic-no-pic', '-fvisibility=hidden', '-isysroot %s' % sdkroot, '-std=gnu99', '-mmacosx-version-min=%s' % osxtarget]
    cxxflags = ['-arch %s' % arch, '-pipe', '-mdynamic-no-pic', '-fvisibility=hidden', '-isysroot %s' % sdkroot, '-std=gnu99', '-mmacosx-version-min=%s' % osxtarget]
    ldflags = ['-arch %s' % arch, '-isysroot %s' % sdkroot, '-Wl,-dead_strip', '-mmacosx-version-min=%s' % osxtarget]
    defines = Split("""__IPHONE_OS_VERSION_MIN_REQUIRED=40300 DEBUGMODE=1 D3D_DEBUG_INFO ALLEGRO_SRC ALLEGRO_STATICLINK ALLEGRO_LIB_BUILD""")
    cflags = cflags + Split("""-g -O2 -gdwarf-2 -mthumb -Wall -Wmissing-prototypes -ffast-math -fno-strict-aliasing -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 -Wmost -Wno-four-char-constants -Wno-unknown-pragmas""")
    cppflags = Split("""-x objective-c -g -O2 -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch -Wall -fno-strict-aliasing""")
    includes = Split("""#includes""")

    base.Append(CPPPATH = includes,
                CFLAGS = stringify(cflags),
                CXXFLAGS = stringify(cxxflags),
                CPPFLAGS = cppflags,
                LINKFLAGS = ldflags,
                CPPDEFINES = defines)

    base.VariantDir('build/%s' % name, 'allegro/src')
    base.VariantDir('build/%s/addons' % name, 'allegro/addons')
    base['NAME'] = name

    return base

def simEnv():
    return baseEnv(platform = 'iPhoneSimulator', arch = 'i686', name = 'sim')

def phoneEnv():
    return baseEnv(platform = 'iPhoneOS', arch = 'armv6', name = 'phone')

source = Split("""allegro.c display.c file_slice.c iphone/EAGLView.m
iphone/ViewController.m iphone/allegroAppDelegate.m iphone/iphone_display.c
iphone/iphone_joystick.m iphone/iphone_keyboard.c iphone/iphone_main.m
iphone/iphone_mouse.m iphone/iphone_path.m iphone/iphone_system.c
iphone/iphone_touch_input.m math.c opengl/extensions.c opengl/ogl_bitmap.c
opengl/ogl_display.c opengl/ogl_draw.c threads.c unix/udrvlist.c unix/ufdwatch.c
unix/ugfxdrv.c unix/ujoydrv.c unix/ukeybd.c unix/umodules.c unix/umouse.c unix/upath.c
unix/utime.c unix/uxthread.c bitmap.c display_settings.c file_stdio.c joynu.c
memblit.c optimized.c timernu.c utf8.c bitmap_io.c dtor.c fshook.c keybdnu.c
memdraw.c path.c tls.c blenders.c events.c fshook_stdio.c libc.c memory.c
pixels.c touch_input.c config.c evtsrc.c misc/aatree.c misc/bstrlib.c
misc/list.c misc/vector.c transformations.c convert.c file.c inline.c
mousenu.c system.c tri_soft.c""")

primitives = Split("""primitives/directx_shaders.cpp primitives/high_primitives.c
primitives/line_soft.c primitives/point_soft.c primitives/polygon.c primitives/polyline.c
primitives/prim_directx.cpp primitives/prim_opengl.c primitives/prim_soft.c
primitives/prim_util.c primitives/primitives.c primitives/triangulator.c""")

ttf = Split("""ttf/ttf.c""")
memfile = Split("""memfile/memfile.c""")
image = Split("""image/bmp.c image/iio.c image/iphone.m image/pcx.c image/tga.c""")
# image/jpg.c image/png.c 
audio = Split("""audio/audio.c audio/kcm_instance.c audio/kcm_sample.c audio/kcm_voice.c audio/audio_io.c audio/kcm_dtor.c audio/kcm_mixer.c audio/kcm_stream.c audio/openal.c""")
acodec = Split("""acodec/acodec.c acodec/wav.c""")
# acodec/flac.c acodec/modaudio.c acodec/ogg.c 
font = Split("""font/font.c font/font.h font/fontbmp.c font/text.c""")
# main = Split("""main/generic_main.c""")

def prepend(location, source):
    new_source = []
    for s in source:
        new_source.append('%s/%s' % (location, s))
    return new_source

def buildLibraries(env):
    def buildAddon(env, name, source):
        env.Default(env.StaticLibrary('install/%s/lib/allegro_%s' % (env['NAME'], name), prepend('build/%s/addons' % env['NAME'], source)))

    # Need to include freetype
    def ttfEnv(env):
        ttf = env.Clone()
        ttf.Append(CPPPATH = ['#install/%s/include' % env['NAME'], '#install/%s/include/freetype2' % env['NAME']])
        return ttf

    #buildLib(sim_env, '%s/allegro_ttf' % libsim, prepend('build/sim/addons', ttf), createAddonIncludes('ttf') + ['#freetype'])
    env.Default(env.StaticLibrary('install/%s/lib/allegro' % env['NAME'], prepend('build/%s' % env['NAME'], source)))

    buildAddon(env, 'memfile', memfile)
    buildAddon(env, 'image', image)
    buildAddon(env, 'primitives', primitives)
    buildAddon(env, 'audio', audio)
    buildAddon(env, 'acodec', acodec)
    buildAddon(env, 'font', font)
    buildAddon(ttfEnv(env), 'ttf', ttf)
    env.Default(env.Install('install/%s/include' % env['NAME'], 'includes/allegro5'))

# Copy allegro headers and our own
Execute(Mkdir('includes'))
copyHeaders('includes')

buildLibraries(simEnv())
buildLibraries(phoneEnv())
