#!/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,
)