setup.py revision 708
1516N/A#!/usr/bin/python2.4
290N/A#
290N/A# CDDL HEADER START
290N/A#
290N/A# The contents of this file are subject to the terms of the
290N/A# Common Development and Distribution License (the "License").
290N/A# You may not use this file except in compliance with the License.
290N/A#
290N/A# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
290N/A# or http://www.opensolaris.org/os/licensing.
290N/A# See the License for the specific language governing permissions
290N/A# and limitations under the License.
290N/A#
290N/A# When distributing Covered Code, include this CDDL HEADER in each
290N/A# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
290N/A# If applicable, add the following below this CDDL HEADER, with the
290N/A# fields enclosed by brackets "[]" replaced with your own identifying
290N/A# information: Portions Copyright [yyyy] [name of copyright owner]
290N/A#
290N/A# CDDL HEADER END
290N/A#
1902N/A# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
395N/A# Use is subject to license terms.
290N/A#
883N/A
454N/Aimport fnmatch
290N/Aimport os
448N/Aimport platform
290N/Aimport stat
290N/Aimport sys
290N/Aimport shutil
383N/Aimport re
290N/Aimport subprocess
395N/Aimport tarfile
290N/Aimport tempfile
395N/Aimport urllib
849N/A
1516N/Afrom distutils.core import setup, Extension
290N/Afrom distutils.cmd import Command
849N/Afrom distutils.command.install import install as _install
290N/Afrom distutils.command.build import build as _build
290N/Afrom distutils.command.build_py import build_py as _build_py
290N/Afrom distutils.command.bdist import bdist as _bdist
290N/Afrom distutils.command.clean import clean as _clean
383N/A
290N/Afrom distutils.sysconfig import get_python_inc
290N/Aimport distutils.file_util as file_util
290N/Aimport distutils.dir_util as dir_util
290N/Aimport distutils.util as util
290N/A
290N/A# 3rd party software required for the build
290N/ACP = 'CherryPy'
290N/ACPIDIR = 'cherrypy'
1660N/ACPVER = '3.1.0'
1660N/ACPARC = '%s-%s.tar.gz' % (CP, CPVER)
1660N/ACPDIR = '%s-%s' % (CP, CPVER)
1660N/ACPURL = 'http://download.cherrypy.org/cherrypy/%s/%s' % (CPVER, CPARC)
1660N/A
1660N/APO = 'pyOpenSSL'
1660N/APOIDIR = 'OpenSSL'
1660N/APOVER = '0.7'
1660N/APOARC = '%s-%s.tar.gz' % (PO, POVER)
1660N/APODIR = '%s-%s' % (PO, POVER)
1660N/APOURL = 'http://downloads.sourceforge.net/pyopenssl/%s' % (POARC)
1660N/A
1660N/AFL = 'figleaf'
1660N/AFLIDIR = 'figleaf'
1660N/AFLVER = 'latest'
1660N/AFLARC = '%s-%s.tar.gz' % (FL, FLVER)
1660N/AFLDIR = '%s-%s' % (FL, FLVER)
1660N/AFLURL = 'http://darcs.idyll.org/~t/projects/%s' % FLARC
465N/A
465N/Aosname = platform.uname()[0].lower()
465N/Aostype = arch = 'unknown'
1516N/Aif osname == 'sunos':
465N/A arch = platform.processor()
465N/A ostype = "posix"
465N/Aelif osname == 'linux':
1516N/A arch = "linux_" + platform.machine()
465N/A ostype = "posix"
465N/Aelif osname == 'windows':
465N/A arch = osname
465N/A ostype = "windows"
465N/Aelif osname == 'darwin':
465N/A arch = osname
465N/A ostype = "posix"
1099N/A
465N/Apwd = os.path.normpath(sys.path[0])
1513N/A
1513N/A#
2075N/A# Unbuffer stdout and stderr. This helps to ensure that subprocess output
2180N/A# is properly interleaved with output from this program.
2075N/A#
2075N/Asys.stdout = os.fdopen(sys.stdout.fileno(), "w", 0)
2075N/Asys.stderr = os.fdopen(sys.stderr.fileno(), "w", 0)
2075N/A
708N/Adist_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "dist_" + arch))
1391N/Abuild_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "build_" + arch))
1391N/Aroot_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "root_" + arch))
1391N/Apkgs_dir = os.path.normpath(os.path.join(pwd, os.pardir, "packages", arch))
1391N/A
1391N/Apy_install_dir = 'usr/lib/python2.4/vendor-packages'
1391N/A
1391N/Ascripts_dir = 'usr/bin'
1391N/Alib_dir = 'usr/lib'
1391N/Asvc_method_dir = 'lib/svc/method'
1391N/A
1391N/Aman1_dir = 'usr/share/man/cat1'
742N/Aman1m_dir = 'usr/share/man/cat1m'
742N/Aman5_dir = 'usr/share/man/cat5'
742N/Aresource_dir = 'usr/share/lib/pkg'
742N/Asmf_dir = 'var/svc/manifest/application'
742N/Azones_dir = 'etc/zones'
742N/Abrand_dir = 'usr/lib/brand/ipkg'
1099N/A
742N/Ascripts_sunos = {
941N/A scripts_dir: [
941N/A ['client.py', 'pkg'],
941N/A ['publish.py', 'pkgsend'],
941N/A ['pull.py', 'pkgrecv'],
941N/A ['packagemanager.py', 'packagemanager'],
941N/A ['updatemanager.py', 'updatemanager'],
1099N/A ],
941N/A lib_dir: [
2023N/A ['depot.py', 'pkg.depotd'],
2023N/A ['updatemanagernotifier.py', 'updatemanagernotifier'],
2023N/A ],
2023N/A svc_method_dir: [
2023N/A ['svc-pkg-depot', 'svc-pkg-depot'],
2023N/A ],
2023N/A }
2023N/A
1191N/Ascripts_windows = {
1513N/A scripts_dir: [
1191N/A ['client.py', 'client.py'],
2180N/A ['publish.py', 'publish.py'],
1191N/A ['pull.py', 'pull.py'],
1191N/A ['scripts/pkg.bat', 'pkg.bat'],
1191N/A ['scripts/pkgsend.bat', 'pkgsend.bat'],
1191N/A ['scripts/pkgrecv.bat', 'pkgrecv.bat'],
1660N/A ],
1660N/A lib_dir: [
1660N/A ['depot.py', 'depot.py'],
290N/A ['scripts/pkg.depotd.bat', 'pkg.depotd.bat'],
2026N/A ],
2026N/A }
2026N/A
2026N/Ascripts_other_unix = {
2026N/A scripts_dir: [
2026N/A ['client.py', 'client.py'],
2026N/A ['pull.py', 'pull.py'],
2026N/A ['publish.py', 'publish.py'],
448N/A ['scripts/pkg.sh', 'pkg'],
448N/A ['scripts/pkgsend.sh', 'pkgsend'],
534N/A ['scripts/pkgrecv.sh', 'pkgrecv'],
534N/A ],
534N/A lib_dir: [
534N/A ['depot.py', 'depot.py'],
534N/A ['scripts/pkg.depotd.sh', 'pkg.depotd'],
534N/A ],
534N/A }
290N/A
290N/A# indexed by 'osname'
954N/Ascripts = {
954N/A "sunos": scripts_sunos,
954N/A "linux": scripts_other_unix,
954N/A "windows": scripts_windows,
534N/A "darwin": scripts_other_unix,
1099N/A "unknown": scripts_sunos,
290N/A }
1516N/A
290N/Aman1_files = [
290N/A 'man/pkg.1',
290N/A 'man/pkgsend.1',
661N/A 'man/pkgrecv.1',
290N/A ]
290N/Aman1m_files = [
290N/A 'man/pkg.depotd.1m'
395N/A ]
290N/Aman5_files = [
2125N/A 'man/pkg.5'
290N/A ]
1483N/Apackages = [
290N/A 'pkg',
1498N/A 'pkg.actions',
1498N/A 'pkg.bundle',
290N/A 'pkg.client',
1674N/A 'pkg.portable',
1674N/A 'pkg.publish',
1674N/A 'pkg.server'
1674N/A ]
1674N/Aweb_files = [
1674N/A 'web/pkg-block-icon.png',
1674N/A 'web/pkg-block-logo.png',
395N/A 'web/pkg.css',
430N/A 'web/feed-icon-32x32.png',
395N/A 'web/robots.txt',
1544N/A ]
1968N/Azones_files = [
1557N/A 'brand/SUNWipkg.xml',
1903N/A ]
2046N/Abrand_files = [
1506N/A 'brand/config.xml',
395N/A 'brand/platform.xml',
395N/A 'brand/pkgcreatezone',
2026N/A ]
424N/Asmf_files = [
1024N/A 'pkg-server.xml',
395N/A 'pkg-update.xml',
395N/A ]
395N/Apspawn_srcs = [
2078N/A 'modules/pspawn.c'
578N/A ]
1172N/Aelf_srcs = [
395N/A 'modules/elf.c',
661N/A 'modules/elfextract.c',
1099N/A 'modules/liblist.c',
1902N/A ]
661N/Aarch_srcs = [
395N/A 'modules/arch.c'
849N/A ]
290N/A_actions_srcs = [
395N/A 'modules/actions/_actions.c'
395N/A ]
1968N/Ainclude_dirs = [ 'modules' ]
395N/Alint_flags = [ '-u', '-axms', '-erroff=E_NAME_DEF_NOT_USED2' ]
395N/A
395N/A# Runs the test suite with the code coverage suite (figleaf) turned on, and
395N/A# outputs a coverage report.
395N/A# TODO: Make the cov report format an option (html, ast, cov, etc)
395N/Aclass cov_func(Command):
395N/A description = "Runs figleaf code coverage suite"
395N/A user_options = []
395N/A def initialize_options(self):
395N/A pass
395N/A def finalize_options(self):
290N/A pass
290N/A def run(self):
395N/A if not os.path.isdir(FLDIR):
395N/A install_sw(FL, FLVER, FLARC, FLDIR, FLURL, FLIDIR)
1231N/A # Run the test suite with coverage enabled
1557N/A os.putenv('PYEXE', sys.executable)
1903N/A os.chdir(os.path.join(pwd, "tests"))
1557N/A # Reconstruct the cmdline and send that to run.py
395N/A os.environ["PKGCOVERAGE"] = "1"
395N/A cmd = [sys.executable, "run.py"]
395N/A subprocess.call(cmd)
395N/A print "Generating coverage report in directory: '%s/cov_report'" % \
395N/A pwd
395N/A os.system("figleaf2html -d cov_report .figleaf")
395N/A
395N/A# Runs lint on the extension module source code
395N/Aclass lint_func(Command):
395N/A description = "Runs various lint tools over IPS extension source code"
395N/A user_options = []
290N/A
290N/A def initialize_options(self):
430N/A pass
395N/A
395N/A def finalize_options(self):
395N/A pass
395N/A
1302N/A # Make string shell-friendly
395N/A @staticmethod
395N/A def escape(astring):
290N/A return astring.replace(' ', '\\ ')
395N/A
1024N/A def run(self):
413N/A # assumes lint is on the $PATH
1544N/A if osname == 'sunos' or osname == "linux":
1557N/A archcmd = ['lint'] + lint_flags + ['-D_FILE_OFFSET_BITS=64'] + \
1903N/A ["%s%s" % ("-I", k) for k in include_dirs] + \
2046N/A ['-I' + self.escape(get_python_inc())] + \
1506N/A arch_srcs
413N/A elfcmd = ['lint'] + lint_flags + \
2026N/A ["%s%s" % ("-I", k) for k in include_dirs] + \
413N/A ['-I' + self.escape(get_python_inc())] + \
1978N/A ["%s%s" % ("-l", k) for k in elf_libraries] + \
1024N/A elf_srcs
395N/A _actionscmd = ['lint'] + lint_flags + \
395N/A ["%s%s" % ("-I", k) for k in include_dirs] + \
413N/A ['-I' + self.escape(get_python_inc())] + \
395N/A _actions_srcs
395N/A pspawncmd = ['lint'] + lint_flags + ['-D_FILE_OFFSET_BITS=64'] + \
413N/A ["%s%s" % ("-I", k) for k in include_dirs] + \
395N/A ['-I' + self.escape(get_python_inc())] + \
395N/A pspawn_srcs
395N/A
395N/A print(" ".join(archcmd))
395N/A os.system(" ".join(archcmd))
395N/A print(" ".join(elfcmd))
1191N/A os.system(" ".join(elfcmd))
1452N/A print(" ".join(_actionscmd))
1231N/A os.system(" ".join(_actionscmd))
2046N/A print(" ".join(pspawncmd))
395N/A os.system(" ".join(pspawncmd))
395N/A
424N/A proto = os.path.join(root_dir, py_install_dir)
395N/A sys.path.insert(0, proto)
742N/A
742N/A # Insert tests directory onto sys.path so any custom checkers
742N/A # can be found.
742N/A sys.path.insert(0, os.path.join(pwd, 'tests'))
742N/A print(sys.path)
742N/A
742N/A # assumes pylint is accessible on the sys.path
742N/A from pylint import lint
742N/A scriptlist = [ 'setup.py' ]
742N/A for d, m in scripts_sunos.items():
742N/A for a in m:
395N/A # specify the filenames of the scripts, in addition
395N/A # to the package names themselves
395N/A scriptlist.append(os.path.join(root_dir, d, a[1]))
395N/A
395N/A # For some reason, the load-plugins option, when used in the
954N/A # rcfile, does not work, so we put it here instead, to load
954N/A # our custom checkers.
954N/A lint.Run(['--load-plugins=multiplatform', '--rcfile',
954N/A os.path.join(pwd, 'tests', 'pylintrc')] +
954N/A scriptlist + packages)
954N/A
954N/Aclass install_func(_install):
395N/A def initialize_options(self):
1483N/A _install.initialize_options(self)
1483N/A
1483N/A # PRIVATE_BUILD set in the environment tells us to put the build
1483N/A # directory into the .pyc files, rather than the final
395N/A # installation directory.
1902N/A private_build = os.getenv("PRIVATE_BUILD", None)
1099N/A
1099N/A # It's OK to have /'s here, python figures it out when writing files
395N/A if private_build is None:
2046N/A self.install_lib = py_install_dir
2046N/A self.install_data = "/"
2046N/A self.root = root_dir
1498N/A else:
1498N/A self.install_lib = os.path.join(root_dir, py_install_dir)
691N/A self.install_data = root_dir
691N/A
691N/A # This is used when installing scripts, below, but it isn't a
395N/A # standard distutils variable.
395N/A self.root_dir = root_dir
395N/A
395N/A def run(self):
395N/A """
290N/A At the end of the install function, we need to rename some files
395N/A because distutils provides no way to rename files as they are
395N/A placed in their install locations.
591N/A Also, make sure that cherrypy is installed.
591N/A """
591N/A for f in man1_files + man1m_files + man5_files:
1505N/A file_util.copy_file(f + ".txt", f, update=1)
1505N/A
1505N/A _install.run(self)
1505N/A
1632N/A for d, files in scripts[osname].iteritems():
1632N/A for (srcname, dstname) in files:
1632N/A dst_dir = util.change_root(self.root_dir, d)
1632N/A dst_path = util.change_root(self.root_dir,
395N/A os.path.join(d, dstname))
395N/A dir_util.mkpath(dst_dir, verbose = True)
290N/A file_util.copy_file(srcname, dst_path, update = True)
290N/A # make scripts executable
290N/A os.chmod(dst_path,
290N/A os.stat(dst_path).st_mode | stat.S_IEXEC)
290N/A
290N/A install_sw(CP, CPVER, CPARC, CPDIR, CPURL, CPIDIR)
290N/A install_sw(PO, POVER, POARC, PODIR, POURL, POIDIR)
290N/A
290N/Adef install_sw(swname, swver, swarc, swdir, swurl, swidir):
290N/A if not os.path.exists(swarc):
290N/A print "downloading %s" % swname
290N/A try:
290N/A fname, hdr = urllib.urlretrieve(swurl, swarc)
290N/A except IOError:
395N/A pass
395N/A if not os.path.exists(swarc) or \
290N/A (hdr.gettype() != "application/x-gzip" and
290N/A hdr.gettype() != "application/x-tar"):
290N/A print "Unable to retrieve %s.\nPlease retrieve the file " \
290N/A "and place it at: %s\n" % (swurl, swarc)
290N/A # remove a partial download or error message from proxy
395N/A remove_sw(swname)
395N/A sys.exit(1)
395N/A if not os.path.exists(swdir):
290N/A print "unpacking %s" % swname
395N/A tar = tarfile.open(swarc)
395N/A # extractall doesn't exist until python 2.5
395N/A for m in tar.getmembers():
395N/A tar.extract(m)
591N/A tar.close()
591N/A swinst_dir = os.path.join(root_dir, py_install_dir, swidir)
591N/A if not os.path.exists(swinst_dir):
591N/A print "installing %s" % swname
691N/A subprocess.Popen(['python', 'setup.py', 'install',
691N/A '--root=%s' % root_dir,
691N/A '--install-lib=%s' % py_install_dir,
691N/A '--install-data=%s' % py_install_dir],
290N/A cwd = swdir).wait()
290N/A
290N/A
290N/Adef remove_sw(swname):
290N/A print("deleting %s" % swname)
591N/A for file in os.listdir("."):
591N/A if fnmatch.fnmatch(file, "%s*" % swname):
691N/A if os.path.isfile(file):
691N/A os.unlink(file)
290N/A else:
395N/A shutil.rmtree(file, True)
395N/A
290N/Aclass build_func(_build):
395N/A def initialize_options(self):
395N/A _build.initialize_options(self)
395N/A self.build_base = build_dir
395N/A
290N/Adef get_hg_version():
290N/A try:
290N/A p = subprocess.Popen(['hg', 'id', '-i'], stdout = subprocess.PIPE)
395N/A return p.communicate()[0].strip()
395N/A except OSError:
395N/A print >> sys.stderr, "ERROR: unable to obtain mercurial version"
395N/A return "unknown"
395N/A
395N/Aclass build_py_func(_build_py):
290N/A # override the build_module method to do VERSION substitution on pkg/__init__.py
290N/A def build_module (self, module, module_file, package):
290N/A if module == "__init__" and package == "pkg":
290N/A versionre = '(?m)^VERSION[^"]*"([^"]*)"'
290N/A # Grab the previously-built version out of the build
430N/A # tree.
290N/A try:
290N/A ocontent = \
395N/A file(self.get_module_outfile(self.build_lib,
290N/A [package], module)).read()
395N/A ov = re.search(versionre, ocontent).group(1)
506N/A except IOError:
506N/A ov = None
506N/A v = get_hg_version()
506N/A vstr = 'VERSION = "%s"' % v
506N/A # If the versions haven't changed, there's no need to
506N/A # recompile.
506N/A if v == ov:
506N/A return
834N/A
506N/A mcontent = file(module_file).read()
506N/A mcontent = re.sub(versionre, vstr, mcontent)
506N/A tmpfd, tmp_file = tempfile.mkstemp()
513N/A os.write(tmpfd, mcontent)
506N/A os.close(tmpfd)
506N/A print "doing version substitution: ", v
506N/A rv = _build_py.build_module(self, module, tmp_file, package)
506N/A os.unlink(tmp_file)
290N/A return rv
290N/A
395N/A return _build_py.build_module(self, module, module_file, package)
395N/A
849N/Aclass clean_func(_clean):
849N/A def initialize_options(self):
883N/A _clean.initialize_options(self)
883N/A self.build_base = build_dir
395N/A
413N/Aclass clobber_func(Command):
413N/A user_options = []
413N/A description = "Deletes any and all files created by setup"
395N/A
290N/A def initialize_options(self):
1674N/A pass
1674N/A def finalize_options(self):
1674N/A pass
1674N/A def run(self):
1674N/A # nuke everything
1674N/A print("deleting " + dist_dir)
1674N/A shutil.rmtree(dist_dir, True)
1674N/A print("deleting " + build_dir)
1674N/A shutil.rmtree(build_dir, True)
1674N/A print("deleting " + root_dir)
1674N/A shutil.rmtree(root_dir, True)
1674N/A print("deleting " + pkgs_dir)
1674N/A shutil.rmtree(pkgs_dir, True)
1674N/A remove_sw(CP)
1674N/A remove_sw(PO)
395N/A
395N/Aclass test_func(Command):
506N/A # NOTE: these options need to be in sync with tests/run.py
506N/A user_options = [("verbosemode", 'v', "run tests in verbose mode"),
395N/A ("genbaseline", 'g', "generate test baseline"),
395N/A ("parseable", 'p', "parseable output"),
395N/A ("baselinefile=", 'b', "baseline file <file>"),
395N/A ("only=", "o", "only <regex>")]
430N/A description = "Runs unit and functional tests"
849N/A
834N/A def initialize_options(self):
290N/A self.only = ""
1391N/A self.baselinefile = ""
1391N/A self.verbosemode = 0
1401N/A self.parseable = 0
1391N/A self.genbaseline = 0
1391N/A def finalize_options(self):
1391N/A pass
1391N/A def run(self):
1391N/A os.putenv('PYEXE', sys.executable)
1391N/A os.chdir(os.path.join(pwd, "tests"))
1391N/A
1391N/A # Reconstruct the cmdline and send that to run.py
836N/A cmd = [sys.executable, "run.py"]
836N/A args = ""
849N/A if "test" in sys.argv:
849N/A args = sys.argv[sys.argv.index("test")+1:]
849N/A cmd.extend(args)
849N/A subprocess.call(cmd)
849N/A
849N/Aclass dist_func(_bdist):
849N/A def initialize_options(self):
849N/A _bdist.initialize_options(self)
849N/A self.dist_dir = dist_dir
849N/A
849N/A
849N/A# These are set to real values based on the platform, down below
1513N/Acompile_args = None
1391N/Alink_args = None
849N/Aext_modules = [
2026N/A Extension(
2026N/A 'actions._actions',
1513N/A _actions_srcs,
1391N/A include_dirs = include_dirs,
1513N/A extra_compile_args = compile_args,
1391N/A extra_link_args = link_args
1391N/A ),
1660N/A ]
1513N/Aelf_libraries = None
1513N/Adata_files = [ (resource_dir, web_files) ]
2023N/Acmdclasses = {
2023N/A 'install': install_func,
290N/A 'build': build_func,
883N/A 'build_py': build_py_func,
883N/A 'bdist': dist_func,
883N/A 'lint': lint_func,
883N/A 'clean': clean_func,
883N/A 'clobber': clobber_func,
883N/A 'coverage': cov_func,
883N/A 'test': test_func,
883N/A }
883N/A
883N/A# all builds of IPS should have manpages
883N/Adata_files += [
883N/A (man1_dir, man1_files),
883N/A (man1m_dir, man1m_files),
883N/A (man5_dir, man5_files),
883N/A ]
883N/A
1099N/Aif osname == 'sunos':
1099N/A # Solaris-specific extensions are added here
1099N/A data_files += [
1099N/A (zones_dir, zones_files),
1099N/A (brand_dir, brand_files),
1516N/A (smf_dir, smf_files),
1265N/A ]
1099N/A
1099N/Aif osname == 'sunos' or osname == "linux":
1099N/A # Unix platforms which the elf extension has been ported to
1099N/A # are specified here, so they are built automatically
1099N/A elf_libraries = ['elf']
1099N/A ext_modules += [
1099N/A Extension(
1099N/A 'elf',
1099N/A elf_srcs,
1099N/A include_dirs = include_dirs,
1208N/A libraries = elf_libraries,
1208N/A extra_compile_args = compile_args,
1099N/A extra_link_args = link_args
1099N/A ),
1391N/A ]
1099N/A
1099N/A # Solaris has built-in md library and Solaris-specific arch extension
1099N/A # All others use OpenSSL and cross-platform arch module
1099N/A if osname == 'sunos':
1099N/A elf_libraries += [ 'md' ]
465N/A ext_modules += [
465N/A Extension(
395N/A 'arch',
465N/A arch_srcs,
395N/A include_dirs = include_dirs,
395N/A extra_compile_args = compile_args,
2176N/A extra_link_args = link_args,
1208N/A define_macros = [('_FILE_OFFSET_BITS', '64')]
1208N/A ),
465N/A Extension(
395N/A 'pspawn',
465N/A pspawn_srcs,
395N/A include_dirs = include_dirs,
465N/A extra_compile_args = compile_args,
1099N/A extra_link_args = link_args,
1099N/A define_macros = [('_FILE_OFFSET_BITS', '64')]
1099N/A ),
465N/A ]
465N/A else:
395N/A elf_libraries += [ 'ssl' ]
395N/A
1099N/Asetup(cmdclass = cmdclasses,
395N/A name = 'ips',
1191N/A version = '1.0',
1191N/A package_dir = {'pkg':'modules'},
1191N/A packages = packages,
1191N/A data_files = data_files,
1191N/A ext_package = 'pkg',
1191N/A ext_modules = ext_modules,
1191N/A )
1191N/A