The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env python

from distutils.core import setup, Extension

DEBUG = 0
perl = 'perl'

import sys, os
from os      import popen, system, access, F_OK
from os.path import isfile, getmtime
from string  import split
from sys     import exit

MULTI_PERL = isfile("MULTI_PERL")
BOOT_FROM_PERL = isfile("BOOT_FROM_PERL")

p = popen(perl + ' ./opts.pl')
perl_ccopts = p.readline()
perl_ldopts = p.readline()
p.close()

ext_name     = "perl"
include_dirs = []
macros       = []
cc_extra     = []

for x in split(perl_ccopts):
    if x[:2] == '-I':
	include_dirs.append(x[2:])

    # XXX This is disabled since distutils does not yet implement
    # define_macros.  Aarghhh!!  So much time wasted on debugging
    # because of this.
    elif 0 and x[:2] == '-D':
	m = split(x[2:], '=', 2)
	if len(m) == 1:
	    m.append(None)
	macros.append(tuple(m))
    else:
        cc_extra.append(x)

lib_dirs  = []
libs      = []
ld_extra  = []
o_extra   = []
sym_extra   = []

extra_ext = []

# Hack name to get it to compile as C++ file on Windows
svrv_object_c_name = "svrv_object.c"
if sys.platform[:3] == "win":
    import shutil
    svrv_object_c_name = "svrv_object.cpp"
    if os.path.exists(svrv_object_c_name):
        os.chmod(svrv_object_c_name, 0777)
        os.unlink(svrv_object_c_name)
    shutil.copy("svrv_object.c", svrv_object_c_name)

sources = ['perlmodule.c',
           'lang_lock.c',
           'lang_map.c',
           svrv_object_c_name,
           'try_perlapi.c',
          ]

if BOOT_FROM_PERL:
    cc_extra.append("-DBOOT_FROM_PERL")
else:
    for x in split(perl_ldopts):
        if x[:2] == '-L':
            lib_dirs.append(x[2:])
        elif x[:2] == '-l' and sys.platform != 'win32':
            libs.append(x[2:])
        elif x[:1] != '-' and (x[-3:] == '.so' or
                               x[-2:] == '.o'  or
                               x[-2:] == '.a'
                               ):
            o_extra.append(x)
        else:
            ld_extra.append(x)

    p = popen(perl + ' ./objs.pl')
    objs = p.readline()
    for x in split(objs):
        o_extra.append(x)
    p.close()

    if not isfile("perlxsi.c"):
        system(perl + " -MExtUtils::Embed -e xsinit")
    sources.append('perlxsi.c');

    # Try to figure out if we use dlopen on this platform
    p = popen(perl + ' -V:dlsrc')
    dlsrc = p.readline()
    p.close()
    if dlsrc == "dlsrc='dl_dlopen.xs';\n":
        ext_name = "perl2"
        cc_extra.append("-DDL_HACK")
        extra_ext.append(Extension(name = "perl",
                                   sources = ["dlhack.c"],
                                   libraries = ["dl"],
                                   ))
        

if MULTI_PERL:
    cc_extra.append("-DMULTI_PERL")
    sources.append('thrd_ctx.c')

if not isfile("try_perlapi.c") or \
       getmtime("try_perlapi.c") < getmtime("try_perlapi.pl"):
    system(perl + " try_perlapi.pl")

if sys.platform == 'win32':
    libs.append('perl56')
    for x in ['15','16','20']:
	if access(os.path.join(sys.prefix, 'libs', 'python'+x+'.lib'), \
		  F_OK) == 1 :
	    libs.append('python'+x)
    sym_extra.append('get_thread_ctx')
    sym_extra.append('sv2pyo')
    sym_extra.append('pyo2sv')

if DEBUG:
    print "Macros:", macros
    print "Include: ", include_dirs
    print "Extra CC: ", cc_extra
    print "Obj: ", o_extra
    print "Libs:", libs
    print "Lib dirs:",  lib_dirs
    print "Extra LD: ", ld_extra

ext_modules = []
ext_modules.append(Extension(name = ext_name,
                             sources = sources,
                             define_macros = macros,
                             include_dirs = include_dirs,
                             extra_compile_args = cc_extra,
                             
                             extra_objects =  o_extra,
                             libraries = libs,
                             library_dirs = lib_dirs,
                             extra_link_args = ld_extra,
                             export_symbols = sym_extra,
                             ))
ext_modules.extend(extra_ext)

setup (name        = "pyperl",
       version     = "1.0",
       description = "Embed a perl interpreter",
       url         = "http://www.ActiveState.com",
       author      = "ActiveState",
       author_email= "gisle@ActiveState.com",
       py_modules  = ['dbi', 'dbi2', 'perlpickle', 'perlmod'],
       ext_modules = ext_modules,
      )