2011-09-10 11:13:51 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# encoding: utf-8
|
|
|
|
# andersg at 0x63.nu 2007
|
|
|
|
# Thomas Nagy 2010 (ita)
|
|
|
|
|
|
|
|
"""
|
|
|
|
Support for Perl extensions. A C/C++ compiler is required::
|
|
|
|
|
|
|
|
def options(opt):
|
|
|
|
opt.load('compiler_c perl')
|
|
|
|
def configure(conf):
|
|
|
|
conf.load('compiler_c perl')
|
|
|
|
conf.check_perl_version((5,6,0))
|
|
|
|
conf.check_perl_ext_devel()
|
|
|
|
conf.check_perl_module('Cairo')
|
|
|
|
conf.check_perl_module('Devel::PPPort 4.89')
|
|
|
|
def build(bld):
|
|
|
|
bld(
|
|
|
|
features = 'c cshlib perlext',
|
|
|
|
source = 'Mytest.xs',
|
|
|
|
target = 'Mytest',
|
|
|
|
install_path = '${ARCHDIR_PERL}/auto')
|
|
|
|
bld.install_files('${ARCHDIR_PERL}', 'Mytest.pm')
|
|
|
|
"""
|
|
|
|
|
|
|
|
import os
|
|
|
|
from waflib import Task, Options, Utils
|
|
|
|
from waflib.Configure import conf
|
|
|
|
from waflib.TaskGen import extension, feature, before_method
|
|
|
|
|
|
|
|
@before_method('apply_incpaths', 'apply_link', 'propagate_uselib_vars')
|
|
|
|
@feature('perlext')
|
|
|
|
def init_perlext(self):
|
|
|
|
"""
|
|
|
|
Change the values of *cshlib_PATTERN* and *cxxshlib_PATTERN* to remove the
|
|
|
|
*lib* prefix from library names.
|
|
|
|
"""
|
|
|
|
self.uselib = self.to_list(getattr(self, 'uselib', []))
|
|
|
|
if not 'PERLEXT' in self.uselib: self.uselib.append('PERLEXT')
|
|
|
|
self.env['cshlib_PATTERN'] = self.env['cxxshlib_PATTERN'] = self.env['perlext_PATTERN']
|
|
|
|
|
|
|
|
@extension('.xs')
|
|
|
|
def xsubpp_file(self, node):
|
|
|
|
"""
|
|
|
|
Create :py:class:`waflib.Tools.perl.xsubpp` tasks to process *.xs* files
|
|
|
|
"""
|
|
|
|
outnode = node.change_ext('.c')
|
|
|
|
self.create_task('xsubpp', node, outnode)
|
|
|
|
self.source.append(outnode)
|
|
|
|
|
|
|
|
class xsubpp(Task.Task):
|
|
|
|
"""
|
|
|
|
Process *.xs* files
|
|
|
|
"""
|
|
|
|
run_str = '${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}'
|
|
|
|
color = 'BLUE'
|
|
|
|
ext_out = ['.h']
|
|
|
|
|
|
|
|
@conf
|
|
|
|
def check_perl_version(self, minver=None):
|
|
|
|
"""
|
|
|
|
Check if Perl is installed, and set the variable PERL.
|
2011-11-20 15:27:11 +01:00
|
|
|
minver is supposed to be a tuple
|
2011-09-10 11:13:51 +02:00
|
|
|
"""
|
|
|
|
res = True
|
2011-11-20 15:27:11 +01:00
|
|
|
if minver:
|
|
|
|
cver = '.'.join(map(str,minver))
|
|
|
|
else:
|
|
|
|
cver = ''
|
2011-09-10 11:13:51 +02:00
|
|
|
|
|
|
|
self.start_msg('Checking for minimum perl version %s' % cver)
|
|
|
|
|
|
|
|
perl = getattr(Options.options, 'perlbinary', None)
|
|
|
|
|
|
|
|
if not perl:
|
|
|
|
perl = self.find_program('perl', var='PERL')
|
|
|
|
if not perl:
|
|
|
|
self.end_msg("Perl not found", color="YELLOW")
|
|
|
|
return False
|
2015-04-11 10:51:19 +02:00
|
|
|
|
2011-09-10 11:13:51 +02:00
|
|
|
self.env['PERL'] = perl
|
|
|
|
|
2013-09-05 06:05:04 +02:00
|
|
|
version = self.cmd_and_log(self.env.PERL + ["-e", 'printf \"%vd\", $^V'])
|
2011-09-10 11:13:51 +02:00
|
|
|
if not version:
|
|
|
|
res = False
|
|
|
|
version = "Unknown"
|
|
|
|
elif not minver is None:
|
|
|
|
ver = tuple(map(int, version.split(".")))
|
|
|
|
if ver < minver:
|
|
|
|
res = False
|
|
|
|
|
2011-11-20 15:27:11 +01:00
|
|
|
self.end_msg(version, color=res and "GREEN" or "YELLOW")
|
2011-09-10 11:13:51 +02:00
|
|
|
return res
|
|
|
|
|
|
|
|
@conf
|
|
|
|
def check_perl_module(self, module):
|
|
|
|
"""
|
|
|
|
Check if specified perlmodule is installed.
|
|
|
|
|
|
|
|
The minimum version can be specified by specifying it after modulename
|
|
|
|
like this::
|
|
|
|
|
|
|
|
def configure(conf):
|
|
|
|
conf.check_perl_module("Some::Module 2.92")
|
|
|
|
"""
|
2013-09-05 06:05:04 +02:00
|
|
|
cmd = self.env.PERL + ['-e', 'use %s' % module]
|
2011-09-10 11:13:51 +02:00
|
|
|
self.start_msg('perl module %s' % module)
|
|
|
|
try:
|
|
|
|
r = self.cmd_and_log(cmd)
|
2012-02-11 14:49:27 +01:00
|
|
|
except Exception:
|
2011-09-10 11:13:51 +02:00
|
|
|
self.end_msg(False)
|
|
|
|
return None
|
|
|
|
self.end_msg(r or True)
|
|
|
|
return r
|
|
|
|
|
|
|
|
@conf
|
|
|
|
def check_perl_ext_devel(self):
|
|
|
|
"""
|
|
|
|
Check for configuration needed to build perl extensions.
|
|
|
|
|
|
|
|
Sets different xxx_PERLEXT variables in the environment.
|
|
|
|
|
|
|
|
Also sets the ARCHDIR_PERL variable useful as installation path,
|
|
|
|
which can be overridden by ``--with-perl-archdir`` option.
|
|
|
|
"""
|
|
|
|
|
|
|
|
env = self.env
|
|
|
|
perl = env.PERL
|
|
|
|
if not perl:
|
|
|
|
self.fatal('find perl first')
|
|
|
|
|
2013-09-05 06:05:04 +02:00
|
|
|
def cmd_perl_config(s):
|
|
|
|
return perl + ['-MConfig', '-e', 'print \"%s\"' % s]
|
|
|
|
def cfg_str(cfg):
|
|
|
|
return self.cmd_and_log(cmd_perl_config(cfg))
|
|
|
|
def cfg_lst(cfg):
|
|
|
|
return Utils.to_list(cfg_str(cfg))
|
2015-04-11 13:17:21 +02:00
|
|
|
def find_xsubpp():
|
|
|
|
for var in ('privlib', 'vendorlib'):
|
|
|
|
xsubpp = cfg_lst('$Config{%s}/ExtUtils/xsubpp$Config{exe_ext}' % var)
|
|
|
|
if xsubpp and os.path.isfile(xsubpp[0]):
|
|
|
|
return xsubpp
|
|
|
|
return self.find_program('xsubpp')
|
2011-09-10 11:13:51 +02:00
|
|
|
|
2013-09-05 06:05:04 +02:00
|
|
|
env['LINKFLAGS_PERLEXT'] = cfg_lst('$Config{lddlflags}')
|
|
|
|
env['INCLUDES_PERLEXT'] = cfg_lst('$Config{archlib}/CORE')
|
|
|
|
env['CFLAGS_PERLEXT'] = cfg_lst('$Config{ccflags} $Config{cccdlflags}')
|
|
|
|
env['EXTUTILS_TYPEMAP'] = cfg_lst('$Config{privlib}/ExtUtils/typemap')
|
2015-04-11 13:17:21 +02:00
|
|
|
env['XSUBPP'] = find_xsubpp()
|
2015-04-11 10:51:19 +02:00
|
|
|
|
2011-09-10 11:13:51 +02:00
|
|
|
if not getattr(Options.options, 'perlarchdir', None):
|
2013-09-05 06:05:04 +02:00
|
|
|
env['ARCHDIR_PERL'] = cfg_str('$Config{sitearch}')
|
2011-09-10 11:13:51 +02:00
|
|
|
else:
|
|
|
|
env['ARCHDIR_PERL'] = getattr(Options.options, 'perlarchdir')
|
|
|
|
|
2013-09-05 06:05:04 +02:00
|
|
|
env['perlext_PATTERN'] = '%s.' + cfg_str('$Config{dlext}')
|
2011-09-10 11:13:51 +02:00
|
|
|
|
|
|
|
def options(opt):
|
|
|
|
"""
|
|
|
|
Add the ``--with-perl-archdir`` and ``--with-perl-binary`` command-line options.
|
|
|
|
"""
|
|
|
|
opt.add_option('--with-perl-binary', type='string', dest='perlbinary', help = 'Specify alternate perl binary', default=None)
|
|
|
|
opt.add_option('--with-perl-archdir', type='string', dest='perlarchdir', help = 'Specify directory where to install arch specific files', default=None)
|