setup.py revision 3374
3177N/A#!/usr/bin/python2.7
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#
3313N/A# Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
395N/A#
290N/A
3143N/Afrom __future__ import print_function
883N/Aimport errno
454N/Aimport fnmatch
290N/Aimport os
448N/Aimport platform
3234N/Aimport six
290N/Aimport stat
290N/Aimport sys
290N/Aimport shutil
383N/Aimport re
290N/Aimport subprocess
395N/Aimport tarfile
290N/Aimport tempfile
849N/Aimport py_compile
1516N/Aimport hashlib
2508N/Aimport time
290N/A
2535N/Afrom distutils.errors import DistutilsError, DistutilsFileError
2698N/Afrom distutils.core import setup
290N/Afrom distutils.cmd import Command
290N/Afrom distutils.command.install import install as _install
2535N/Afrom distutils.command.install_data import install_data as _install_data
2561N/Afrom distutils.command.install_lib import install_lib as _install_lib
290N/Afrom distutils.command.build import build as _build
2508N/Afrom distutils.command.build_ext import build_ext as _build_ext
383N/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
2339N/Afrom distutils.dist import Distribution
2535N/Afrom distutils import log
290N/A
290N/Afrom distutils.sysconfig import get_python_inc
2535N/Aimport distutils.dep_util as dep_util
2535N/Aimport distutils.dir_util as dir_util
290N/Aimport distutils.file_util as file_util
290N/Aimport distutils.util as util
2508N/Aimport distutils.ccompiler
2508N/Afrom distutils.unixccompiler import UnixCCompiler
290N/A
1660N/Aosname = platform.uname()[0].lower()
1660N/Aostype = arch = 'unknown'
1660N/Aif osname == 'sunos':
1660N/A arch = platform.processor()
1660N/A ostype = "posix"
1660N/Aelif osname == 'linux':
1660N/A arch = "linux_" + platform.machine()
1660N/A ostype = "posix"
1660N/Aelif osname == 'windows':
1660N/A arch = osname
1660N/A ostype = "windows"
1660N/Aelif osname == 'darwin':
1660N/A arch = osname
1660N/A ostype = "posix"
1660N/Aelif osname == 'aix':
1660N/A arch = "aix"
1660N/A ostype = "posix"
1660N/A
448N/Apwd = os.path.normpath(sys.path[0])
448N/A
2828N/A# the version of pylint that we must have in order to run the pylint checks.
3253N/Areq_pylint_version = "1.4.3"
2828N/A
534N/A#
534N/A# Unbuffer stdout and stderr. This helps to ensure that subprocess output
534N/A# is properly interleaved with output from this program.
534N/A#
3339N/A# Can't have unbuffered text I/O in Python 3. This doesn't quite matter.
3339N/Aif six.PY2:
3339N/A sys.stdout = os.fdopen(sys.stdout.fileno(), "w", 0)
3339N/A sys.stderr = os.fdopen(sys.stderr.fileno(), "w", 0)
534N/A
290N/Adist_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "dist_" + arch))
290N/Abuild_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "build_" + arch))
954N/Aif "ROOT" in os.environ and os.environ["ROOT"] != "":
954N/A root_dir = os.environ["ROOT"]
954N/Aelse:
954N/A root_dir = os.path.normpath(os.path.join(pwd, os.pardir, "proto", "root_" + arch))
534N/Apkgs_dir = os.path.normpath(os.path.join(pwd, os.pardir, "packages", arch))
1099N/Aextern_dir = os.path.normpath(os.path.join(pwd, "extern"))
3261N/Acffi_dir = os.path.normpath(os.path.join(pwd, "cffi_src"))
290N/A
3117N/A# Extract Python minor version.
3117N/Apy_version = '.'.join(platform.python_version_tuple()[:2])
3203N/Aassert py_version in ('2.7', '3.4')
3117N/Apy_install_dir = 'usr/lib/python' + py_version + '/vendor-packages'
290N/A
3246N/Apy64_executable = None
3246N/A#Python 3 is always 64 bit and located in /usr/bin.
3246N/Aif float(py_version) < 3 and osname == 'sunos':
3374N/A py64_executable = '/usr/bin/64/python' + py_version
3246N/A
290N/Ascripts_dir = 'usr/bin'
290N/Alib_dir = 'usr/lib'
661N/Asvc_method_dir = 'lib/svc/method'
2867N/Asvc_share_dir = 'lib/svc/share'
290N/A
2494N/Aman1_dir = 'usr/share/man/man1'
3356N/Aman7_dir = 'usr/share/man/man7'
3356N/Aman8_dir = 'usr/share/man/man8'
2516N/Aman1_ja_JP_dir = 'usr/share/man/ja_JP.UTF-8/man1'
3356N/Aman8_ja_JP_dir = 'usr/share/man/ja_JP.UTF-8/man8'
3356N/Aman7_ja_JP_dir = 'usr/share/man/ja_JP.UTF-8/man7'
2516N/Aman1_zh_CN_dir = 'usr/share/man/zh_CN.UTF-8/man1'
3356N/Aman8_zh_CN_dir = 'usr/share/man/zh_CN.UTF-8/man8'
3356N/Aman7_zh_CN_dir = 'usr/share/man/zh_CN.UTF-8/man7'
2516N/A
290N/Aresource_dir = 'usr/share/lib/pkg'
3185N/Arad_dir = 'usr/share/lib/pkg'
2523N/Atransform_dir = 'usr/share/pkg/transforms'
3138N/Aignored_deps_dir = 'usr/share/pkg/ignored_deps'
2390N/Asmf_app_dir = 'lib/svc/manifest/application/pkg'
1498N/Aexecattrd_dir = 'etc/security/exec_attr.d'
1498N/Aauthattrd_dir = 'etc/security/auth_attr.d'
2867N/Auserattrd_dir = 'etc/user_attr.d'
2310N/Asysrepo_dir = 'etc/pkg/sysrepo'
3237N/Asysrepo_dir_22 = 'etc/pkg/sysrepo/apache22'
2310N/Asysrepo_logs_dir = 'var/log/pkg/sysrepo'
2310N/Asysrepo_cache_dir = 'var/cache/pkg/sysrepo'
2852N/Adepot_dir = 'etc/pkg/depot'
3237N/Adepot_dir_22 = 'etc/pkg/depot/apache22'
2852N/Adepot_conf_dir = 'etc/pkg/depot/conf.d'
2852N/Adepot_logs_dir = 'var/log/pkg/depot'
2852N/Adepot_cache_dir = 'var/cache/pkg/depot'
2535N/Alocale_dir = 'usr/share/locale'
2867N/Amirror_logs_dir = 'var/log/pkg/mirror'
2867N/Amirror_cache_dir = 'var/cache/pkg/mirror'
2310N/A
290N/A
1674N/A# A list of source, destination tuples of modules which should be hardlinked
1674N/A# together if the os supports it and otherwise copied.
2262N/Ahardlink_modules = []
1674N/A
395N/Ascripts_sunos = {
430N/A scripts_dir: [
395N/A ['client.py', 'pkg'],
1544N/A ['pkgdep.py', 'pkgdepend'],
1968N/A ['pkgrepo.py', 'pkgrepo'],
1557N/A ['util/publish/pkgdiff.py', 'pkgdiff'],
1903N/A ['util/publish/pkgfmt.py', 'pkgfmt'],
2046N/A ['util/publish/pkglint.py', 'pkglint'],
2240N/A ['util/publish/pkgmerge.py', 'pkgmerge'],
1506N/A ['util/publish/pkgmogrify.py', 'pkgmogrify'],
2928N/A ['util/publish/pkgsurf.py', 'pkgsurf'],
395N/A ['publish.py', 'pkgsend'],
395N/A ['pull.py', 'pkgrecv'],
2026N/A ['sign.py', 'pkgsign'],
395N/A ],
395N/A lib_dir: [
395N/A ['depot.py', 'pkg.depotd'],
2310N/A ['sysrepo.py', 'pkg.sysrepo'],
2852N/A ['depot-config.py', "pkg.depot-config"]
395N/A ],
661N/A svc_method_dir: [
2867N/A ['svc/svc-pkg-depot', 'svc-pkg-depot'],
2867N/A ['svc/svc-pkg-mdns', 'svc-pkg-mdns'],
2867N/A ['svc/svc-pkg-mirror', 'svc-pkg-mirror'],
2867N/A ['svc/svc-pkg-repositories-setup',
2867N/A 'svc-pkg-repositories-setup'],
2852N/A ['svc/svc-pkg-server', 'svc-pkg-server'],
2310N/A ['svc/svc-pkg-sysrepo', 'svc-pkg-sysrepo'],
3216N/A ['svc/svc-pkg-sysrepo-cache',
3216N/A 'svc-pkg-sysrepo-cache'],
2867N/A ],
2867N/A svc_share_dir: [
2867N/A ['svc/pkg5_include.sh', 'pkg5_include.sh'],
661N/A ],
3185N/A rad_dir: [
3185N/A ["rad-invoke.py", "rad-invoke"],
3185N/A ],
395N/A }
849N/A
290N/Ascripts_windows = {
395N/A scripts_dir: [
395N/A ['client.py', 'client.py'],
1968N/A ['pkgrepo.py', 'pkgrepo.py'],
395N/A ['publish.py', 'publish.py'],
395N/A ['pull.py', 'pull.py'],
395N/A ['scripts/pkg.bat', 'pkg.bat'],
395N/A ['scripts/pkgsend.bat', 'pkgsend.bat'],
395N/A ['scripts/pkgrecv.bat', 'pkgrecv.bat'],
395N/A ],
395N/A lib_dir: [
395N/A ['depot.py', 'depot.py'],
395N/A ['scripts/pkg.depotd.bat', 'pkg.depotd.bat'],
395N/A ],
395N/A }
290N/A
290N/Ascripts_other_unix = {
395N/A scripts_dir: [
395N/A ['client.py', 'client.py'],
1231N/A ['pkgdep.py', 'pkgdep'],
1557N/A ['util/publish/pkgdiff.py', 'pkgdiff'],
1903N/A ['util/publish/pkgfmt.py', 'pkgfmt'],
1557N/A ['util/publish/pkgmogrify.py', 'pkgmogrify'],
395N/A ['pull.py', 'pull.py'],
395N/A ['publish.py', 'publish.py'],
395N/A ['scripts/pkg.sh', 'pkg'],
395N/A ['scripts/pkgsend.sh', 'pkgsend'],
395N/A ['scripts/pkgrecv.sh', 'pkgrecv'],
395N/A ],
395N/A lib_dir: [
395N/A ['depot.py', 'depot.py'],
395N/A ['scripts/pkg.depotd.sh', 'pkg.depotd'],
395N/A ],
3185N/A rad_dir: [
3185N/A ["rad-invoke.py", "rad-invoke"],
3185N/A ],
395N/A }
290N/A
290N/A# indexed by 'osname'
430N/Ascripts = {
395N/A "sunos": scripts_sunos,
395N/A "linux": scripts_other_unix,
395N/A "windows": scripts_windows,
395N/A "darwin": scripts_other_unix,
1302N/A "aix" : scripts_other_unix,
395N/A "unknown": scripts_sunos,
395N/A }
290N/A
3313N/AMANPAGE_SRC_ROOT = "man"
3313N/AMANPAGE_OUTPUT_ROOT = MANPAGE_SRC_ROOT + "/nroff"
3139N/A
395N/Aman1_files = [
3139N/A MANPAGE_OUTPUT_ROOT + '/man1/' + f
3139N/A for f in [
3139N/A 'pkg.1',
3139N/A 'pkgdepend.1',
3139N/A 'pkgdiff.1',
3139N/A 'pkgfmt.1',
3139N/A 'pkglint.1',
3139N/A 'pkgmerge.1',
3139N/A 'pkgmogrify.1',
3139N/A 'pkgrecv.1',
3139N/A 'pkgrepo.1',
3139N/A 'pkgsend.1',
3139N/A 'pkgsign.1',
3139N/A 'pkgsurf.1',
3139N/A ]
3139N/A]
3356N/Aman7_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/man7/' + f
3139N/A for f in [
3356N/A 'pkg.7'
3139N/A ]
3139N/A]
3356N/Aman8_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/man8/' + f
3139N/A for f in [
3356N/A 'pkg.depotd.8',
3356N/A 'pkg.depot-config.8',
3356N/A 'pkg.sysrepo.8',
3139N/A ]
3139N/A]
2516N/A
2516N/Aman1_ja_files = [
3139N/A MANPAGE_OUTPUT_ROOT + '/ja_JP.UTF-8/man1/' + f
3139N/A for f in [
3139N/A 'pkg.1',
3139N/A 'pkgdepend.1',
3139N/A 'pkgdiff.1',
3139N/A 'pkgfmt.1',
3139N/A 'pkglint.1',
3139N/A 'pkgmerge.1',
3139N/A 'pkgmogrify.1',
3139N/A 'pkgrecv.1',
3139N/A 'pkgrepo.1',
3139N/A 'pkgsend.1',
3139N/A 'pkgsign.1',
3139N/A ]
3139N/A]
3356N/Aman7_ja_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/ja_JP.UTF-8/man7/' + f
3139N/A for f in [
3356N/A 'pkg.7'
3139N/A ]
3139N/A]
3356N/Aman8_ja_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/ja_JP.UTF-8/man8/' + f
3139N/A for f in [
3356N/A 'pkg.depotd.8',
3356N/A 'pkg.sysrepo.8',
3139N/A ]
3139N/A]
2516N/A
2516N/Aman1_zh_CN_files = [
3139N/A MANPAGE_OUTPUT_ROOT + '/zh_CN.UTF-8/man1/' + f
3139N/A for f in [
3139N/A 'pkg.1',
3139N/A 'pkgdepend.1',
3139N/A 'pkgdiff.1',
3139N/A 'pkgfmt.1',
3139N/A 'pkglint.1',
3139N/A 'pkgmerge.1',
3139N/A 'pkgmogrify.1',
3139N/A 'pkgrecv.1',
3139N/A 'pkgrepo.1',
3139N/A 'pkgsend.1',
3139N/A 'pkgsign.1',
3139N/A ]
3139N/A]
3356N/Aman7_zh_CN_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/zh_CN.UTF-8/man7/' + f
3139N/A for f in [
3356N/A 'pkg.7'
3139N/A ]
3139N/A]
3356N/Aman8_zh_CN_files = [
3356N/A MANPAGE_OUTPUT_ROOT + '/zh_CN.UTF-8/man8/' + f
3139N/A for f in [
3356N/A 'pkg.depotd.8',
3356N/A 'pkg.sysrepo.8',
3139N/A ]
3139N/A]
2516N/A
395N/Apackages = [
395N/A 'pkg',
395N/A 'pkg.actions',
395N/A 'pkg.bundle',
395N/A 'pkg.client',
2339N/A 'pkg.client.linkedimage',
1191N/A 'pkg.client.transport',
1452N/A 'pkg.file_layout',
1231N/A 'pkg.flavor',
2046N/A 'pkg.lint',
395N/A 'pkg.portable',
395N/A 'pkg.publish',
424N/A 'pkg.server'
395N/A ]
742N/A
2339N/Apylint_targets = [
2339N/A 'pkg.altroot',
2693N/A 'pkg.client.__init__',
2690N/A 'pkg.client.api',
2339N/A 'pkg.client.linkedimage',
3094N/A 'pkg.client.pkg_solver',
2339N/A 'pkg.client.pkgdefs',
2690N/A 'pkg.client.pkgremote',
2690N/A 'pkg.client.plandesc',
2693N/A 'pkg.client.printengine',
2693N/A 'pkg.client.progress',
2690N/A 'pkg.misc',
2690N/A 'pkg.pipeutils',
2339N/A ]
2339N/A
742N/Aweb_files = []
742N/Afor entry in os.walk("web"):
742N/A web_dir, dirs, files = entry
742N/A if not files:
742N/A continue
742N/A web_files.append((os.path.join(resource_dir, web_dir), [
742N/A os.path.join(web_dir, f) for f in files
742N/A if f != "Makefile"
742N/A ]))
3136N/A # install same set of files in "en/" in "__LOCALE__/ as well"
2688N/A # for localizable file package (regarding themes, install
2688N/A # theme "oracle.com" only)
2688N/A if os.path.basename(web_dir) == "en" and \
2688N/A os.path.dirname(web_dir) in ("web", "web/_themes/oracle.com"):
2688N/A web_files.append((os.path.join(resource_dir,
2688N/A os.path.dirname(web_dir), "__LOCALE__"), [
2688N/A os.path.join(web_dir, f) for f in files
2688N/A if f != "Makefile"
2688N/A ]))
742N/A
2310N/Asmf_app_files = [
2852N/A 'svc/pkg-depot.xml',
1902N/A 'svc/pkg-mdns.xml',
2867N/A 'svc/pkg-mirror.xml',
2867N/A 'svc/pkg-repositories-setup.xml',
1099N/A 'svc/pkg-server.xml',
2867N/A 'svc/pkg-system-repository.xml',
3216N/A 'svc/pkg-sysrepo-cache.xml',
2338N/A 'svc/zoneproxy-client.xml',
2338N/A 'svc/zoneproxyd.xml'
2310N/A ]
2046N/Aresource_files = [
2223N/A 'util/opensolaris.org.sections',
2046N/A 'util/pkglintrc',
2046N/A ]
2523N/Atransform_files = [
2523N/A 'util/publish/transforms/developer',
2523N/A 'util/publish/transforms/documentation',
2523N/A 'util/publish/transforms/locale',
2523N/A 'util/publish/transforms/smf-manifests'
2523N/A ]
2310N/Asysrepo_files = [
2677N/A 'util/apache2/sysrepo/sysrepo_p5p.py',
2310N/A 'util/apache2/sysrepo/sysrepo_httpd.conf.mako',
2310N/A 'util/apache2/sysrepo/sysrepo_publisher_response.mako',
2310N/A ]
3237N/Asysrepo_files_22 = [
3237N/A 'util/apache22/sysrepo/sysrepo_httpd.conf.mako',
3237N/A 'util/apache22/sysrepo/sysrepo_publisher_response.mako',
3237N/A ]
2310N/Asysrepo_log_stubs = [
2310N/A 'util/apache2/sysrepo/logs/access_log',
2310N/A 'util/apache2/sysrepo/logs/error_log',
2858N/A 'util/apache2/sysrepo/logs/rewrite.log',
2310N/A ]
2852N/Adepot_files = [
2852N/A 'util/apache2/depot/depot.conf.mako',
2852N/A 'util/apache2/depot/depot_httpd.conf.mako',
2852N/A 'util/apache2/depot/depot_index.py',
3136N/A 'util/apache2/depot/depot_httpd_ssl_protocol.conf',
2852N/A ]
3237N/Adepot_files_22 = [
3237N/A 'util/apache22/depot/depot.conf.mako',
3237N/A 'util/apache22/depot/depot_httpd.conf.mako',
3237N/A 'util/apache22/depot/depot_httpd_ssl_protocol.conf',
3237N/A ]
2852N/Adepot_log_stubs = [
2852N/A 'util/apache2/depot/logs/access_log',
2852N/A 'util/apache2/depot/logs/error_log',
2858N/A 'util/apache2/depot/logs/rewrite.log',
2852N/A ]
3138N/Aignored_deps_files = []
3138N/A
2852N/A# The apache-based depot includes an shtml file we add to the resource dir
2852N/Aweb_files.append((os.path.join(resource_dir, "web"),
2852N/A ["util/apache2/depot/repos.shtml"]))
2508N/Aexecattrd_files = [
2508N/A 'util/misc/exec_attr.d/package:pkg',
2508N/A]
2508N/Aauthattrd_files = ['util/misc/auth_attr.d/package:pkg']
2867N/Auserattrd_files = ['util/misc/user_attr.d/package:pkg']
2535N/Apkg_locales = \
2535N/A 'ar ca cs de es fr he hu id it ja ko nl pl pt_BR ru sk sv zh_CN zh_HK zh_TW'.split()
2535N/A
3053N/Asha512_t_srcs = [
3261N/A 'cffi_src/_sha512_t.c'
3053N/A ]
3026N/Asysattr_srcs = [
3261N/A 'cffi_src/_sysattr.c'
3026N/A ]
2339N/Asyscallat_srcs = [
3261N/A 'cffi_src/_syscallat.c'
2339N/A ]
691N/Apspawn_srcs = [
3261N/A 'cffi_src/_pspawn.c'
691N/A ]
395N/Aelf_srcs = [
395N/A 'modules/elf.c',
395N/A 'modules/elfextract.c',
395N/A 'modules/liblist.c',
395N/A ]
290N/Aarch_srcs = [
3261N/A 'cffi_src/_arch.c'
395N/A ]
591N/A_actions_srcs = [
591N/A 'modules/actions/_actions.c'
591N/A ]
2639N/A_actcomm_srcs = [
2639N/A 'modules/actions/_common.c'
2639N/A ]
2639N/A_varcet_srcs = [
2639N/A 'modules/_varcet.c'
2639N/A ]
1505N/Asolver_srcs = [
2516N/A 'modules/solver/solver.c',
1505N/A 'modules/solver/py_solver.c'
1505N/A ]
1632N/Asolver_link_args = ["-lm", "-lc"]
1632N/Aif osname == 'sunos':
1632N/A solver_link_args = ["-ztext"] + solver_link_args
1632N/A
2339N/A# Runs lint on the extension module source code
2339N/Aclass pylint_func(Command):
2339N/A description = "Runs pylint tools over IPS python source code"
2339N/A user_options = []
2339N/A
2339N/A def initialize_options(self):
2339N/A pass
2339N/A
2339N/A def finalize_options(self):
2339N/A pass
2339N/A
2339N/A # Make string shell-friendly
2339N/A @staticmethod
2339N/A def escape(astring):
2339N/A return astring.replace(' ', '\\ ')
2339N/A
3253N/A def run(self, quiet=False, py3k=False):
2828N/A
2828N/A def supported_pylint_ver(version):
2828N/A """Compare the installed version against the version
2828N/A we require to build with, returning False if the version
2828N/A is too old. It's tempting to use pkg.version.Version
2828N/A here, but since that's a build artifact, we'll do it
2828N/A the long way."""
2828N/A inst_pylint_ver = version.split(".")
2828N/A req_pylint_ver = req_pylint_version.split(".")
2828N/A
2828N/A # if the lists are of different lengths, we just
2828N/A # compare with the precision we have.
2828N/A vers_comp = zip(inst_pylint_ver, req_pylint_ver)
2828N/A for inst, req in vers_comp:
2828N/A try:
2828N/A if int(inst) < int(req):
2828N/A return False
3253N/A elif int(inst) > int(req):
3253N/A return True
2828N/A except ValueError:
2828N/A # if we somehow get non-numeric version
2828N/A # components, we ignore them.
2828N/A continue
2828N/A return True
2828N/A
2828N/A # it's fine to default to the required version - the build will
2828N/A # break if the installed version is incompatible and $PYLINT_VER
2828N/A # didn't get set, somehow.
2828N/A pylint_ver_str = os.environ.get("PYLINT_VER",
2828N/A req_pylint_version)
2892N/A if pylint_ver_str == "":
2892N/A pylint_ver_str = req_pylint_version
2828N/A
2828N/A if os.environ.get("PKG_SKIP_PYLINT"):
2828N/A log.warn("WARNING: skipping pylint checks: "
2828N/A "$PKG_SKIP_PYLINT was set")
2828N/A return
2828N/A elif not pylint_ver_str or \
2828N/A not supported_pylint_ver(pylint_ver_str):
2828N/A log.warn("WARNING: skipping pylint checks: the "
3158N/A "installed version {0} is older than version {1}".format(
3158N/A pylint_ver_str, req_pylint_version))
2828N/A return
2828N/A
2339N/A proto = os.path.join(root_dir, py_install_dir)
2339N/A sys.path.insert(0, proto)
2339N/A
3253N/A
2339N/A # Insert tests directory onto sys.path so any custom checkers
2339N/A # can be found.
2339N/A sys.path.insert(0, os.path.join(pwd, 'tests'))
2339N/A # assumes pylint is accessible on the sys.path
2339N/A from pylint import lint
2339N/A
2339N/A #
2339N/A # Unfortunately, pylint seems pretty fragile and will crash if
2339N/A # we try to run it over all the current pkg source. Hence for
2339N/A # now we only run it over a subset of the source. As source
2339N/A # files are made pylint clean they should be added to the
2339N/A # pylint_targets list.
2339N/A #
3253N/A if not py3k:
3253N/A args = []
3253N/A if quiet:
3253N/A args += ['--reports=no']
3253N/A args += ['--rcfile={0}'.format(os.path.join(
3253N/A pwd, 'tests', 'pylintrc'))]
3253N/A args += pylint_targets
3253N/A lint.Run(args)
3253N/A else:
3253N/A #
3253N/A # In Python 3 porting mode, all checkers will be
3253N/A # disabled and only messages emitted by the porting
3253N/A # checker will be displayed. Therefore we need to run
3253N/A # this checker separately.
3253N/A #
3253N/A args = []
3253N/A if quiet:
3253N/A args += ['--reports=no']
3253N/A args += ['--rcfile={0}'.format(os.path.join(
3253N/A pwd, 'tests', 'pylintrc_py3k'))]
3253N/A # We check all Python files in the gate.
3253N/A for root, dirs, files in os.walk(pwd):
3253N/A for f in files:
3253N/A if f.endswith(".py"):
3253N/A args += [os.path.join(root, f)]
3253N/A lint.Run(args)
2364N/A
2364N/A
2364N/Aclass pylint_func_quiet(pylint_func):
2364N/A
2364N/A def run(self, quiet=False):
2364N/A pylint_func.run(self, quiet=True)
2364N/A
3253N/Aclass pylint_func_py3k(pylint_func):
3253N/A def run(self, quiet=False, py3k=False):
3253N/A pylint_func.run(self, py3k=True)
2339N/A
395N/Ainclude_dirs = [ 'modules' ]
395N/Alint_flags = [ '-u', '-axms', '-erroff=E_NAME_DEF_NOT_USED2' ]
290N/A
290N/A# Runs lint on the extension module source code
2339N/Aclass clint_func(Command):
2339N/A description = "Runs lint tools over IPS C extension source code"
290N/A user_options = []
290N/A
290N/A def initialize_options(self):
290N/A pass
290N/A
290N/A def finalize_options(self):
290N/A pass
290N/A
290N/A # Make string shell-friendly
290N/A @staticmethod
395N/A def escape(astring):
395N/A return astring.replace(' ', '\\ ')
290N/A
290N/A def run(self):
2674N/A if "LINT" in os.environ and os.environ["LINT"] != "":
2674N/A lint = [os.environ["LINT"]]
2674N/A else:
2674N/A lint = ['lint']
290N/A if osname == 'sunos' or osname == "linux":
2674N/A archcmd = lint + lint_flags + \
2674N/A ['-D_FILE_OFFSET_BITS=64'] + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
395N/A ['-I' + self.escape(get_python_inc())] + \
395N/A arch_srcs
2674N/A elfcmd = lint + lint_flags + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
395N/A ['-I' + self.escape(get_python_inc())] + \
3158N/A ["{0}{1}".format("-l", k) for k in elf_libraries] + \
395N/A elf_srcs
2674N/A _actionscmd = lint + lint_flags + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
591N/A ['-I' + self.escape(get_python_inc())] + \
591N/A _actions_srcs
2674N/A _actcommcmd = lint + lint_flags + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
2639N/A ['-I' + self.escape(get_python_inc())] + \
2639N/A _actcomm_srcs
2674N/A _varcetcmd = lint + lint_flags + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
2639N/A ['-I' + self.escape(get_python_inc())] + \
2639N/A _varcet_srcs
2674N/A pspawncmd = lint + lint_flags + \
2674N/A ['-D_FILE_OFFSET_BITS=64'] + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
691N/A ['-I' + self.escape(get_python_inc())] + \
691N/A pspawn_srcs
2674N/A syscallatcmd = lint + lint_flags + \
2674N/A ['-D_FILE_OFFSET_BITS=64'] + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
2339N/A ['-I' + self.escape(get_python_inc())] + \
2339N/A syscallat_srcs
3026N/A sysattrcmd = lint + lint_flags + \
3026N/A ['-D_FILE_OFFSET_BITS=64'] + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
3026N/A ['-I' + self.escape(get_python_inc())] + \
3158N/A ["{0}{1}".format("-l", k) for k in sysattr_libraries] + \
3026N/A sysattr_srcs
3053N/A sha512_tcmd = lint + lint_flags + \
3053N/A ['-D_FILE_OFFSET_BITS=64'] + \
3158N/A ["{0}{1}".format("-I", k) for k in include_dirs] + \
3053N/A ['-I' + self.escape(get_python_inc())] + \
3158N/A ["{0}{1}".format("-l", k) for k in sha512_t_libraries] + \
3053N/A sha512_t_srcs
290N/A
290N/A print(" ".join(archcmd))
290N/A os.system(" ".join(archcmd))
290N/A print(" ".join(elfcmd))
290N/A os.system(" ".join(elfcmd))
591N/A print(" ".join(_actionscmd))
591N/A os.system(" ".join(_actionscmd))
2639N/A print(" ".join(_actcommcmd))
2639N/A os.system(" ".join(_actcommcmd))
2639N/A print(" ".join(_varcetcmd))
2639N/A os.system(" ".join(_varcetcmd))
691N/A print(" ".join(pspawncmd))
691N/A os.system(" ".join(pspawncmd))
2339N/A print(" ".join(syscallatcmd))
2339N/A os.system(" ".join(syscallatcmd))
3026N/A print(" ".join(sysattrcmd))
3026N/A os.system(" ".join(sysattrcmd))
3053N/A print(" ".join(sha512_tcmd))
3053N/A os.system(" ".join(sha512_tcmd))
290N/A
290N/A
2339N/A# Runs both C and Python lint
2339N/Aclass lint_func(Command):
2339N/A description = "Runs C and Python lint checkers"
2339N/A user_options = []
2339N/A
2339N/A def initialize_options(self):
2339N/A pass
290N/A
2339N/A def finalize_options(self):
2339N/A pass
290N/A
2339N/A # Make string shell-friendly
2339N/A @staticmethod
2339N/A def escape(astring):
2339N/A return astring.replace(' ', '\\ ')
2339N/A
2339N/A def run(self):
2339N/A clint_func(Distribution()).run()
2339N/A pylint_func(Distribution()).run()
290N/A
395N/Aclass install_func(_install):
290N/A def initialize_options(self):
395N/A _install.initialize_options(self)
506N/A
506N/A # PRIVATE_BUILD set in the environment tells us to put the build
506N/A # directory into the .pyc files, rather than the final
506N/A # installation directory.
506N/A private_build = os.getenv("PRIVATE_BUILD", None)
506N/A
506N/A if private_build is None:
506N/A self.install_lib = py_install_dir
834N/A self.install_data = os.path.sep
506N/A self.root = root_dir
506N/A else:
506N/A self.install_lib = os.path.join(root_dir, py_install_dir)
513N/A self.install_data = root_dir
506N/A
506N/A # This is used when installing scripts, below, but it isn't a
506N/A # standard distutils variable.
506N/A self.root_dir = root_dir
290N/A
290N/A def run(self):
2535N/A """At the end of the install function, we need to rename some
2535N/A files because distutils provides no way to rename files as they
2535N/A are placed in their install locations.
395N/A """
413N/A
395N/A _install.run(self)
1674N/A for o_src, o_dest in hardlink_modules:
1674N/A for e in [".py", ".pyc"]:
1674N/A src = util.change_root(self.root_dir, o_src + e)
1674N/A dest = util.change_root(
1674N/A self.root_dir, o_dest + e)
1674N/A if ostype == "posix":
1674N/A if os.path.exists(dest) and \
1674N/A os.stat(src)[stat.ST_INO] != \
1674N/A os.stat(dest)[stat.ST_INO]:
1674N/A os.remove(dest)
1674N/A file_util.copy_file(src, dest,
1674N/A link="hard", update=1)
1674N/A else:
1674N/A file_util.copy_file(src, dest, update=1)
1674N/A
3203N/A # XXX Uncomment it when we need to deliver python 3.4 version
3203N/A # of modules.
3203N/A # Don't install the scripts for python 3.4.
3339N/A if py_version == '3.4':
3339N/A return
3234N/A for d, files in six.iteritems(scripts[osname]):
395N/A for (srcname, dstname) in files:
506N/A dst_dir = util.change_root(self.root_dir, d)
506N/A dst_path = util.change_root(self.root_dir,
395N/A os.path.join(d, dstname))
2535N/A dir_util.mkpath(dst_dir, verbose=True)
3246N/A file_util.copy_file(srcname, dst_path,
3246N/A update=True)
395N/A # make scripts executable
430N/A os.chmod(dst_path,
849N/A os.stat(dst_path).st_mode
834N/A | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
290N/A
2561N/Aclass install_lib_func(_install_lib):
2561N/A """Remove the target files prior to the standard install_lib procedure
2561N/A if the build_py module has determined that they've actually changed.
2561N/A This may be needed when a module's timestamp goes backwards in time, if
2561N/A a working-directory change is reverted, or an older changeset is checked
2561N/A out.
2561N/A """
2561N/A
2561N/A def install(self):
2561N/A build_py = self.get_finalized_command("build_py")
2561N/A prefix_len = len(self.build_dir) + 1
2561N/A for p in build_py.copied:
2561N/A id_p = os.path.join(self.install_dir, p[prefix_len:])
2561N/A rm_f(id_p)
2561N/A if self.compile:
2561N/A rm_f(id_p + "c")
2561N/A if self.optimize > 0:
2561N/A rm_f(id_p + "o")
2561N/A return _install_lib.install(self)
2561N/A
2535N/Aclass install_data_func(_install_data):
2535N/A """Enhance the standard install_data subcommand to take not only a list
2535N/A of filenames, but a list of source and destination filename tuples, for
2535N/A the cases where a filename needs to be renamed between the two
2535N/A locations."""
1099N/A
2535N/A def run(self):
2535N/A self.mkpath(self.install_dir)
2535N/A for f in self.data_files:
2535N/A dir, files = f
2535N/A dir = util.convert_path(dir)
2535N/A if not os.path.isabs(dir):
2535N/A dir = os.path.join(self.install_dir, dir)
2535N/A elif self.root:
2535N/A dir = change_root(self.root, dir)
2535N/A self.mkpath(dir)
1099N/A
2535N/A if not files:
2535N/A self.outfiles.append(dir)
2535N/A else:
2535N/A for file in files:
3234N/A if isinstance(file, six.string_types):
2535N/A infile = file
2535N/A outfile = os.path.join(dir,
2535N/A os.path.basename(file))
2535N/A else:
2535N/A infile, outfile = file
2535N/A infile = util.convert_path(infile)
2535N/A outfile = util.convert_path(outfile)
2535N/A if os.path.sep not in outfile:
2535N/A outfile = os.path.join(dir,
2535N/A outfile)
2535N/A self.copy_file(infile, outfile)
2535N/A self.outfiles.append(outfile)
1099N/A
2826N/Adef run_cmd(args, swdir, updenv=None, ignerr=False, savestderr=None):
2688N/A if updenv:
2688N/A # use temp environment modified with the given dict
2688N/A env = os.environ.copy()
2688N/A env.update(updenv)
2688N/A else:
2688N/A # just use environment of this (parent) process as is
1660N/A env = os.environ
2688N/A if ignerr:
2688N/A # send stderr to devnull
2688N/A stderr = open(os.devnull)
2826N/A elif savestderr:
2826N/A stderr = savestderr
2688N/A else:
2688N/A # just use stderr of this (parent) process
2688N/A stderr = None
2688N/A ret = subprocess.Popen(args, cwd=swdir, env=env,
2688N/A stderr=stderr).wait()
849N/A if ret != 0:
2688N/A if stderr:
2688N/A stderr.close()
3158N/A print("install failed and returned {0:d}.".format(ret),
3143N/A file=sys.stderr)
3177N/A print("Command was: {0}".format(" ".join(args)),
3143N/A file=sys.stderr)
3158N/A
849N/A sys.exit(1)
2688N/A if stderr:
2688N/A stderr.close()
290N/A
2535N/Adef _copy_file_contents(src, dst, buffer_size=16*1024):
2535N/A """A clone of distutils.file_util._copy_file_contents() that strips the
2597N/A CDDL text. For Python files, we replace the CDDL text with an equal
2597N/A number of empty comment lines so that line numbers match between the
2597N/A source and destination files."""
2535N/A
2535N/A # Match the lines between and including the CDDL header signposts, as
2535N/A # well as empty comment lines before and after, if they exist.
3339N/A cddl_re = re.compile(b"\n(#\s*\n)?^[^\n]*CDDL HEADER START.+"
3339N/A b"CDDL HEADER END[^\n]*$(\n#\s*$)?", re.MULTILINE|re.DOTALL)
2535N/A
3246N/A # Look for shebang line to replace with arch-specific Python executable.
3246N/A shebang_re = re.compile('^#!.*python[0-9]\.[0-9]')
3246N/A first_buf = True
3246N/A
3339N/A with open(src, "rb") as sfp:
2535N/A try:
2535N/A os.unlink(dst)
3171N/A except EnvironmentError as e:
2535N/A if e.errno != errno.ENOENT:
2535N/A raise DistutilsFileError("could not delete "
3158N/A "'{0}': {1}".format(dst, e))
2535N/A
3339N/A with open(dst, "wb") as dfp:
2535N/A while True:
2535N/A buf = sfp.read(buffer_size)
2535N/A if not buf:
2535N/A break
3374N/A if src.endswith(".py"):
2597N/A match = cddl_re.search(buf)
2597N/A if match:
2597N/A # replace the CDDL expression
2597N/A # with the same number of empty
2597N/A # comment lines as the cddl_re
2597N/A # matched.
2597N/A substr = buf[
2597N/A match.start():match.end()]
2597N/A count = len(
3339N/A substr.split(b"\n")) - 2
3339N/A blanks = b"#\n" * count
3339N/A buf = cddl_re.sub(b"\n" + blanks,
2597N/A buf)
3246N/A
3246N/A if not first_buf or not py64_executable:
3246N/A dfp.write(buf)
3246N/A continue
3246N/A
3246N/A fl = buf[:buf.find(os.linesep) + 1]
3246N/A sb_match = shebang_re.search(fl)
3246N/A if sb_match:
3246N/A buf = shebang_re.sub(
3246N/A "#!" + py64_executable,
3246N/A buf)
2597N/A else:
3339N/A buf = cddl_re.sub(b"", buf)
2535N/A dfp.write(buf)
3246N/A first_buf = False
2535N/A
2535N/A# Make file_util use our version of _copy_file_contents
2535N/Afile_util._copy_file_contents = _copy_file_contents
2535N/A
2688N/Adef intltool_update_maintain():
2688N/A """Check if scope of localization looks up-to-date or possibly not,
2688N/A by comparing file set described in po/POTFILES.{in,skip} and
2688N/A actual source files (e.g. .py) detected.
2688N/A """
2688N/A rm_f("po/missing")
2688N/A rm_f("po/notexist")
2688N/A
2688N/A args = [
2688N/A "/usr/bin/intltool-update", "--maintain"
2688N/A ]
3143N/A print(" ".join(args))
2688N/A podir = os.path.join(os.getcwd(), "po")
2688N/A run_cmd(args, podir, updenv={"LC_ALL": "C"}, ignerr=True)
2688N/A
2688N/A if os.path.exists("po/missing"):
3143N/A print("New file(s) with translatable strings detected:",
3143N/A file=sys.stderr)
2688N/A missing = open("po/missing", "r")
3143N/A print("--------", file=sys.stderr)
2688N/A for fn in missing:
3158N/A print("{0}".format(fn.strip()), file=sys.stderr)
3177N/A print("--------", file=sys.stderr)
2688N/A missing.close()
3143N/A print("""\
3143N/APlease evaluate whether any of the above file(s) needs localization.
3136N/AIf so, please add its name to po/POTFILES.in. If not (e.g., it's not
3136N/Adelivered), please add its name to po/POTFILES.skip.
3143N/APlease be sure to maintain alphabetical ordering in both files.""", file=sys.stderr)
2688N/A sys.exit(1)
2688N/A
2688N/A if os.path.exists("po/notexist"):
3143N/A print("""\
3143N/AThe following files are listed in po/POTFILES.in, but no longer exist
3143N/Ain the workspace:""", file=sys.stderr)
2688N/A notexist = open("po/notexist", "r")
3143N/A print("--------", file=sys.stderr)
2688N/A for fn in notexist:
3158N/A print("{0}".format(fn.strip()), file=sys.stderr)
3158N/A print("--------", file=sys.stderr)
3158N/A
2688N/A notexist.close()
3143N/A print("Please remove the file names from po/POTFILES.in",
3143N/A file=sys.stderr)
2688N/A sys.exit(1)
2688N/A
2688N/Adef intltool_update_pot():
2688N/A """Generate pkg.pot by extracting localizable strings from source
2688N/A files (e.g. .py)
2688N/A """
2688N/A rm_f("po/pkg.pot")
2688N/A
2688N/A args = [
2688N/A "/usr/bin/intltool-update", "--pot"
2688N/A ]
3143N/A print(" ".join(args))
2688N/A podir = os.path.join(os.getcwd(), "po")
2688N/A run_cmd(args, podir,
2688N/A updenv={"LC_ALL": "C", "XGETTEXT": "/usr/gnu/bin/xgettext"})
2688N/A
2688N/A if not os.path.exists("po/pkg.pot"):
3143N/A print("Failed in generating pkg.pot.", file=sys.stderr)
2688N/A sys.exit(1)
2688N/A
2535N/Adef intltool_merge(src, dst):
2535N/A if not dep_util.newer(src, dst):
2535N/A return
2535N/A
2535N/A args = [
2535N/A "/usr/bin/intltool-merge", "-d", "-u",
2535N/A "-c", "po/.intltool-merge-cache", "po", src, dst
2535N/A ]
3143N/A print(" ".join(args))
2688N/A run_cmd(args, os.getcwd(), updenv={"LC_ALL": "C"})
2535N/A
2826N/Adef i18n_check():
2826N/A """Checks for common i18n messaging bugs in the source."""
2826N/A
2826N/A src_files = []
2826N/A # A list of the i18n errors we check for in the code
2826N/A common_i18n_errors = [
2826N/A # This checks that messages with multiple parameters are always
3158N/A # written using "{name}" format, rather than just "{0}"
2826N/A "format string with unnamed arguments cannot be properly localized"
2826N/A ]
2826N/A
2826N/A for line in open("po/POTFILES.in", "r").readlines():
2826N/A if line.startswith("["):
2826N/A continue
2826N/A if line.startswith("#"):
2826N/A continue
2826N/A src_files.append(line.rstrip())
2826N/A
2826N/A args = [
2826N/A "/usr/gnu/bin/xgettext", "--from-code=UTF-8", "-o", "/dev/null"]
2826N/A args += src_files
2826N/A
2826N/A xgettext_output_path = tempfile.mkstemp()[1]
2826N/A xgettext_output = open(xgettext_output_path, "w")
2826N/A run_cmd(args, os.getcwd(), updenv={"LC_ALL": "C"},
2826N/A savestderr=xgettext_output)
2826N/A
2826N/A found_errs = False
2826N/A i18n_errs = open("po/i18n_errs.txt", "w")
2826N/A for line in open(xgettext_output_path, "r").readlines():
2826N/A for err in common_i18n_errors:
2826N/A if err in line:
2826N/A i18n_errs.write(line)
2826N/A found_errs = True
2826N/A i18n_errs.close()
2826N/A if found_errs:
3143N/A print("""\
3143N/AThe following i18n errors were detected and should be corrected:
3143N/A(this list is saved in po/i18n_errs.txt)
3143N/A""", file=sys.stderr)
2826N/A for line in open("po/i18n_errs.txt", "r"):
3143N/A print(line.rstrip(), file=sys.stderr)
2826N/A sys.exit(1)
2826N/A os.remove(xgettext_output_path)
2826N/A
2535N/Adef msgfmt(src, dst):
2535N/A if not dep_util.newer(src, dst):
2535N/A return
2535N/A
2535N/A args = ["/usr/bin/msgfmt", "-o", dst, src]
3143N/A print(" ".join(args))
2535N/A run_cmd(args, os.getcwd())
2535N/A
2688N/Adef localizablexml(src, dst):
2688N/A """create XML help for localization, where French part of legalnotice
2688N/A is stripped off
2688N/A """
2688N/A if not dep_util.newer(src, dst):
2688N/A return
2688N/A
2688N/A fsrc = open(src, "r")
2688N/A fdst = open(dst, "w")
2688N/A
2688N/A # indicates currently in French part of legalnotice
2688N/A in_fr = False
2688N/A
2688N/A for l in fsrc:
2688N/A if in_fr: # in French part
2688N/A if l.startswith('</legalnotice>'):
2688N/A # reached end of legalnotice
3143N/A print(l, file=fdst)
2688N/A in_fr = False
2688N/A elif l.startswith('<para lang="fr"/>') or \
2688N/A l.startswith('<para lang="fr"></para>'):
2688N/A in_fr = True
2688N/A else:
2688N/A # not in French part
3143N/A print(l, file=fdst)
3136N/A
2688N/A fsrc.close()
2688N/A fdst.close()
2688N/A
2688N/Adef xml2po_gen(src, dst):
2688N/A """Input is English XML file. Output is pkg_help.pot, message
2688N/A source for next translation update.
2688N/A """
2688N/A if not dep_util.newer(src, dst):
2688N/A return
2688N/A
2688N/A args = ["/usr/bin/xml2po", "-o", dst, src]
3143N/A print(" ".join(args))
2688N/A run_cmd(args, os.getcwd())
2688N/A
2688N/Adef xml2po_merge(src, dst, mofile):
2688N/A """Input is English XML file and <lang>.po file (which contains
2688N/A translations). Output is translated XML file.
2688N/A """
2535N/A msgfmt(mofile[:-3] + ".po", mofile)
2535N/A
2535N/A monewer = dep_util.newer(mofile, dst)
2535N/A srcnewer = dep_util.newer(src, dst)
2535N/A
2535N/A if not srcnewer and not monewer:
2535N/A return
2535N/A
2535N/A args = ["/usr/bin/xml2po", "-t", mofile, "-o", dst, src]
3143N/A print(" ".join(args))
2535N/A run_cmd(args, os.getcwd())
2535N/A
2535N/Aclass installfile(Command):
2535N/A user_options = [
2535N/A ("file=", "f", "source file to copy"),
2535N/A ("dest=", "d", "destination directory"),
2535N/A ("mode=", "m", "file mode"),
2535N/A ]
2535N/A
2535N/A description = "De-CDDLing file copy"
2535N/A
2535N/A def initialize_options(self):
2535N/A self.file = None
2535N/A self.dest = None
2535N/A self.mode = None
2535N/A
2535N/A def finalize_options(self):
2535N/A if self.mode is None:
3194N/A self.mode = 0o644
3234N/A elif isinstance(self.mode, six.string_types):
2535N/A try:
2535N/A self.mode = int(self.mode, 8)
2535N/A except ValueError:
3194N/A self.mode = 0o644
2535N/A
2535N/A def run(self):
2535N/A dest_file = os.path.join(self.dest, os.path.basename(self.file))
2535N/A ret = self.copy_file(self.file, dest_file)
2535N/A
2535N/A os.chmod(dest_file, self.mode)
2535N/A os.utime(dest_file, None)
2535N/A
2535N/A return ret
849N/A
290N/Aclass build_func(_build):
2535N/A sub_commands = _build.sub_commands + [('build_data', None)]
2535N/A
430N/A def initialize_options(self):
395N/A _build.initialize_options(self)
395N/A self.build_base = build_dir
290N/A
383N/Adef get_hg_version():
383N/A try:
395N/A p = subprocess.Popen(['hg', 'id', '-i'], stdout = subprocess.PIPE)
383N/A return p.communicate()[0].strip()
383N/A except OSError:
3143N/A print("ERROR: unable to obtain mercurial version",
3143N/A file=sys.stderr)
383N/A return "unknown"
849N/A
849N/Adef syntax_check(filename):
849N/A """ Run python's compiler over the file, and discard the results.
849N/A Arrange to generate an exception if the file does not compile.
849N/A This is needed because distutil's own use of pycompile (in the
849N/A distutils.utils module) is broken, and doesn't stop on error. """
849N/A try:
3339N/A tmpfd, tmp_file = tempfile.mkstemp()
3339N/A py_compile.compile(filename, tmp_file, doraise=True)
3171N/A except py_compile.PyCompileError as e:
2242N/A res = ""
2242N/A for err in e.exc_value:
3234N/A if isinstance(err, six.string_types):
2242N/A res += err + "\n"
2242N/A continue
2242N/A
2242N/A # Assume it's a tuple of (filename, lineno, col, code)
2242N/A fname, line, col, code = err
3158N/A res += "line {0:d}, column {1}, in {2}:\n{3}".format(
3158N/A line, col or "unknown", fname, code)
2242N/A
2242N/A raise DistutilsError(res)
849N/A
2508N/A# On Solaris, ld inserts the full argument to the -o option into the symbol
2508N/A# table. This means that the resulting object will be different depending on
2508N/A# the path at which the workspace lives, and not just on the interesting content
2508N/A# of the object.
2508N/A#
2508N/A# In order to work around that bug (7076871), we create a new compiler class
2508N/A# that looks at the argument indicating the output file, chdirs to its
2508N/A# directory, and runs the real link with the output file set to just the base
2508N/A# name of the file.
2508N/A#
2508N/A# Unfortunately, distutils isn't too customizable in this regard, so we have to
2508N/A# twiddle with a couple of the names in the distutils.ccompiler namespace: we
2508N/A# have to add a new entry to the compiler_class dict, and we have to override
2508N/A# the new_compiler() function to point to our own. Luckily, our copy of
2508N/A# new_compiler() gets to be very simple, since we always know what we want to
2508N/A# return.
2508N/Aclass MyUnixCCompiler(UnixCCompiler):
2508N/A
2508N/A def link(self, *args, **kwargs):
2508N/A
2508N/A output_filename = args[2]
2508N/A output_dir = kwargs.get('output_dir')
2508N/A cwd = os.getcwd()
2508N/A
2508N/A assert(not output_dir)
2508N/A output_dir = os.path.join(cwd, os.path.dirname(output_filename))
2508N/A output_filename = os.path.basename(output_filename)
2508N/A nargs = args[:2] + (output_filename,) + args[3:]
2677N/A if not os.path.exists(output_dir):
3194N/A os.mkdir(output_dir, 0o755)
2508N/A os.chdir(output_dir)
2508N/A
2508N/A UnixCCompiler.link(self, *nargs, **kwargs)
2508N/A
2508N/A os.chdir(cwd)
2508N/A
2508N/Adistutils.ccompiler.compiler_class['myunix'] = (
2508N/A 'unixccompiler', 'MyUnixCCompiler',
2508N/A 'standard Unix-style compiler with a link stage modified for Solaris'
2508N/A)
2508N/A
2508N/Adef my_new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
2508N/A return MyUnixCCompiler(None, dry_run, force)
2508N/A
2508N/Aif osname == 'sunos':
2508N/A distutils.ccompiler.new_compiler = my_new_compiler
2508N/A
2508N/Aclass build_ext_func(_build_ext):
2508N/A
2508N/A def initialize_options(self):
2508N/A _build_ext.initialize_options(self)
2677N/A self.build64 = False
2677N/A
2508N/A if osname == 'sunos':
2508N/A self.compiler = 'myunix'
849N/A
2677N/A def build_extension(self, ext):
2677N/A # Build 32-bit
3339N/A self.build_temp = str(self.build_temp)
2677N/A _build_ext.build_extension(self, ext)
2698N/A if not ext.build_64:
2698N/A return
2677N/A
2677N/A # Set up for 64-bit
2677N/A old_build_temp = self.build_temp
2677N/A d, f = os.path.split(self.build_temp)
2677N/A
2677N/A # store our 64-bit extensions elsewhere
3339N/A self.build_temp = str(d + "/temp64.{0}".format(
3339N/A os.path.basename(self.build_temp).replace("temp.", "")))
2677N/A ext.extra_compile_args += ["-m64"]
2677N/A ext.extra_link_args += ["-m64"]
2677N/A self.build64 = True
2677N/A
2677N/A # Build 64-bit
2677N/A _build_ext.build_extension(self, ext)
2677N/A
2677N/A # Reset to 32-bit
3339N/A self.build_temp = str(old_build_temp)
2677N/A ext.extra_compile_args.remove("-m64")
2677N/A ext.extra_link_args.remove("-m64")
2677N/A self.build64 = False
2677N/A
2677N/A def get_ext_fullpath(self, ext_name):
2677N/A path = _build_ext.get_ext_fullpath(self, ext_name)
2677N/A if not self.build64:
2677N/A return path
2677N/A
2677N/A dpath, fpath = os.path.split(path)
3339N/A if py_version < '3.0':
3339N/A return os.path.join(dpath, "64", fpath)
3339N/A return os.path.join(dpath, fpath)
2677N/A
2677N/A
383N/Aclass build_py_func(_build_py):
2508N/A
2508N/A def __init__(self, dist):
2508N/A ret = _build_py.__init__(self, dist)
2508N/A
2561N/A self.copied = []
2561N/A
2508N/A # Gather the timestamps of the .py files in the gate, so we can
2508N/A # force the mtimes of the built and delivered copies to be
2508N/A # consistent across builds, causing their corresponding .pyc
2508N/A # files to be unchanged unless the .py file content changed.
2508N/A
2508N/A self.timestamps = {}
2508N/A
2508N/A p = subprocess.Popen(
3339N/A ["/usr/bin/python2.7", os.path.join(pwd, "pydates")],
2508N/A stdout=subprocess.PIPE)
2508N/A
2508N/A for line in p.stdout:
2508N/A stamp, path = line.split()
2508N/A stamp = float(stamp)
2508N/A self.timestamps[path] = stamp
2508N/A
2508N/A if p.wait() != 0:
3143N/A print("ERROR: unable to gather .py timestamps",
3143N/A file=sys.stderr)
2508N/A sys.exit(1)
2508N/A
3261N/A # Before building extensions, we need to generate .c files
3261N/A # for the C extension modules by running the CFFI build
3261N/A # script files.
3261N/A for path in os.listdir(cffi_dir):
3261N/A if not path.startswith("build_"):
3261N/A continue
3261N/A path = os.path.join(cffi_dir, path)
3261N/A # make scripts executable
3261N/A os.chmod(path,
3261N/A os.stat(path).st_mode
3261N/A | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
3261N/A
3261N/A # run the scripts
3261N/A p = subprocess.Popen(
3261N/A [sys.executable, path])
3261N/A
2508N/A return ret
2508N/A
2535N/A # override the build_module method to do VERSION substitution on
2535N/A # pkg/__init__.py
383N/A def build_module (self, module, module_file, package):
849N/A
383N/A if module == "__init__" and package == "pkg":
422N/A versionre = '(?m)^VERSION[^"]*"([^"]*)"'
422N/A # Grab the previously-built version out of the build
422N/A # tree.
422N/A try:
422N/A ocontent = \
3234N/A open(self.get_module_outfile(self.build_lib,
422N/A [package], module)).read()
422N/A ov = re.search(versionre, ocontent).group(1)
3339N/A except (IOError, AttributeError):
422N/A ov = None
422N/A v = get_hg_version()
3158N/A vstr = 'VERSION = "{0}"'.format(v)
422N/A # If the versions haven't changed, there's no need to
422N/A # recompile.
422N/A if v == ov:
422N/A return
422N/A
3339N/A with open(module_file) as f:
3339N/A mcontent = f.read()
3339N/A mcontent = re.sub(versionre, vstr, mcontent)
3339N/A tmpfd, tmp_file = tempfile.mkstemp()
3339N/A with open(tmp_file, "w") as wf:
3339N/A wf.write(mcontent)
3143N/A print("doing version substitution: ", v)
3339N/A rv = _build_py.build_module(self, module, tmp_file, str(package))
383N/A os.unlink(tmp_file)
383N/A return rv
422N/A
849N/A # Will raise a DistutilsError on failure.
849N/A syntax_check(module_file)
849N/A
3339N/A return _build_py.build_module(self, module, module_file, str(package))
383N/A
2508N/A def copy_file(self, infile, outfile, preserve_mode=1, preserve_times=1,
2508N/A link=None, level=1):
2508N/A
2508N/A # If the timestamp on the source file (coming from mercurial if
2508N/A # unchanged, or from the filesystem if changed) doesn't match
2508N/A # the filesystem timestamp on the destination, then force the
2508N/A # copy to make sure the right data is in place.
2508N/A
2508N/A try:
2508N/A dst_mtime = os.stat(outfile).st_mtime
3171N/A except OSError as e:
2508N/A if e.errno != errno.ENOENT:
2508N/A raise
2508N/A dst_mtime = time.time()
2508N/A
2508N/A # The timestamp for __init__.py is the timestamp for the
2508N/A # workspace itself.
2508N/A if outfile.endswith("/pkg/__init__.py"):
3339N/A src_mtime = self.timestamps[b"."]
2508N/A else:
2535N/A src_mtime = self.timestamps.get(
3339N/A os.path.join("src", infile), self.timestamps[b"."])
2508N/A
2561N/A # Force a copy of the file if the source timestamp is different
2561N/A # from that of the destination, not just if it's newer. This
2561N/A # allows timestamps in the working directory to regress (for
2561N/A # instance, following the reversion of a change).
2508N/A if dst_mtime != src_mtime:
2508N/A f = self.force
2508N/A self.force = True
2508N/A dst, copied = _build_py.copy_file(self, infile, outfile,
2508N/A preserve_mode, preserve_times, link, level)
2508N/A self.force = f
2508N/A else:
2508N/A dst, copied = outfile, 0
2508N/A
2508N/A # If we copied the file, then we need to go and readjust the
2508N/A # timestamp on the file to match what we have in our database.
2561N/A # Save the filename aside for our version of install_lib.
2508N/A if copied and dst.endswith(".py"):
2508N/A os.utime(dst, (src_mtime, src_mtime))
2561N/A self.copied.append(dst)
2508N/A
2508N/A return dst, copied
2508N/A
3139N/Adef manpage_input_dir(path):
3139N/A """Convert a manpage output path to the directory where its source lives."""
3139N/A
3139N/A patharr = path.split("/")
3139N/A if len(patharr) == 4:
3139N/A loc = ""
3139N/A elif len(patharr) == 5:
3139N/A loc = patharr[-3].split(".")[0]
3139N/A else:
3139N/A raise RuntimeError("bad manpage path")
3139N/A return os.path.join(patharr[0], loc).rstrip("/")
3139N/A
3139N/Adef xml2roff(files):
3139N/A """Convert XML manpages to ROFF for delivery.
3139N/A
3139N/A The input should be a list of the output file paths. The corresponding
3139N/A inputs will be generated from this. We do it in this way so that we can
3139N/A share the paths with the install code.
3139N/A
3139N/A All paths should have a common manpath root. In particular, pages
3139N/A belonging to different localizations should be run through this function
3139N/A separately.
3139N/A """
3139N/A
3139N/A input_dir = manpage_input_dir(files[0])
3139N/A do_files = [
3139N/A os.path.join(input_dir, os.path.basename(f))
3139N/A for f in files
3139N/A if dep_util.newer(os.path.join(input_dir, os.path.basename(f)), f)
3139N/A ]
3139N/A if do_files:
3139N/A # Get the output dir by removing the filename and the manX
3139N/A # directory
3139N/A output_dir = os.path.join(*files[0].split("/")[:-2])
3139N/A args = ["/usr/share/xml/xsolbook/python/xml2roff.py", "-o", output_dir]
3139N/A args += do_files
3143N/A print(" ".join(args))
3139N/A run_cmd(args, os.getcwd())
3139N/A
2535N/Aclass build_data_func(Command):
2535N/A description = "build data files whose source isn't in deliverable form"
2535N/A user_options = []
2535N/A
2535N/A # As a subclass of distutils.cmd.Command, these methods are required to
2535N/A # be implemented.
2535N/A def initialize_options(self):
2535N/A pass
2535N/A
2535N/A def finalize_options(self):
2535N/A pass
2535N/A
2535N/A def run(self):
2535N/A # Anything that gets created here should get deleted in
2535N/A # clean_func.run() below.
2826N/A i18n_check()
2688N/A
2535N/A for l in pkg_locales:
3158N/A msgfmt("po/{0}.po".format(l), "po/{0}.mo".format(l))
2535N/A
2688N/A # generate pkg.pot for next translation
2688N/A intltool_update_maintain()
2688N/A intltool_update_pot()
2688N/A
3356N/A xml2roff(man1_files + man7_files + man8_files)
3356N/A xml2roff(man1_ja_files + man7_ja_files + man8_ja_files)
3356N/A xml2roff(man1_zh_CN_files + man7_zh_CN_files + man8_zh_CN_files)
3139N/A
2535N/Adef rm_f(filepath):
2535N/A """Remove a file without caring whether it exists."""
2535N/A
2535N/A try:
2535N/A os.unlink(filepath)
3171N/A except OSError as e:
2535N/A if e.errno != errno.ENOENT:
2535N/A raise
2535N/A
290N/Aclass clean_func(_clean):
430N/A def initialize_options(self):
395N/A _clean.initialize_options(self)
395N/A self.build_base = build_dir
290N/A
2535N/A def run(self):
2535N/A _clean.run(self)
2535N/A
2535N/A rm_f("po/.intltool-merge-cache")
2535N/A
2535N/A for l in pkg_locales:
3158N/A rm_f("po/{0}.mo".format(l))
2535N/A
2688N/A rm_f("po/pkg.pot")
2688N/A
2826N/A rm_f("po/i18n_errs.txt")
2688N/A
3139N/A shutil.rmtree(MANPAGE_OUTPUT_ROOT, True)
3139N/A
290N/Aclass clobber_func(Command):
290N/A user_options = []
290N/A description = "Deletes any and all files created by setup"
290N/A
290N/A def initialize_options(self):
290N/A pass
290N/A def finalize_options(self):
290N/A pass
290N/A def run(self):
290N/A # nuke everything
395N/A print("deleting " + dist_dir)
290N/A shutil.rmtree(dist_dir, True)
395N/A print("deleting " + build_dir)
290N/A shutil.rmtree(build_dir, True)
395N/A print("deleting " + root_dir)
290N/A shutil.rmtree(root_dir, True)
534N/A print("deleting " + pkgs_dir)
534N/A shutil.rmtree(pkgs_dir, True)
1099N/A print("deleting " + extern_dir)
1099N/A shutil.rmtree(extern_dir, True)
3261N/A # These files generated by the CFFI build scripts are useless
3261N/A # at this point, therefore clean them up.
3261N/A print("deleting temporary files generated by CFFI")
3261N/A for path in os.listdir(cffi_dir):
3261N/A if not path.startswith("_"):
3261N/A continue
3261N/A path = os.path.join(cffi_dir, path)
3261N/A rm_f(path)
290N/A
290N/Aclass test_func(Command):
1101N/A # NOTE: these options need to be in sync with tests/run.py and the
1101N/A # list of options stored in initialize_options below. The first entry
1101N/A # in each tuple must be the exact name of a member variable.
1513N/A user_options = [
1715N/A ("archivedir=", 'a', "archive failed tests <dir>"),
1513N/A ("baselinefile=", 'b', "baseline file <file>"),
1513N/A ("coverage", "c", "collect code coverage data"),
448N/A ("genbaseline", 'g', "generate test baseline"),
1513N/A ("only=", "o", "only <regex>"),
448N/A ("parseable", 'p', "parseable output"),
2272N/A ("port=", "z", "lowest port to start a depot on"),
1101N/A ("timing", "t", "timing file <file>"),
1513N/A ("verbosemode", 'v', "run tests in verbose mode"),
1715N/A ("stoponerr", 'x', "stop when a baseline mismatch occurs"),
1715N/A ("debugoutput", 'd', "emit debugging output"),
1716N/A ("showonexpectedfail", 'f',
1715N/A "show all failure info, even for expected fails"),
1715N/A ("startattest=", 's', "start at indicated test"),
2499N/A ("jobs=", 'j', "number of parallel processes to use"),
2499N/A ("quiet", "q", "use the dots as the output format"),
3049N/A ("livesystem", 'l', "run tests on live system"),
1513N/A ]
290N/A description = "Runs unit and functional tests"
290N/A
290N/A def initialize_options(self):
448N/A self.only = ""
448N/A self.baselinefile = ""
430N/A self.verbosemode = 0
448N/A self.parseable = 0
430N/A self.genbaseline = 0
1101N/A self.timing = 0
1513N/A self.coverage = 0
1715N/A self.stoponerr = 0
1715N/A self.debugoutput = 0
1716N/A self.showonexpectedfail = 0
1715N/A self.startattest = ""
1715N/A self.archivedir = ""
2272N/A self.port = 12001
2499N/A self.jobs = 1
2499N/A self.quiet = False
3049N/A self.livesystem = False
1101N/A
290N/A def finalize_options(self):
290N/A pass
1101N/A
290N/A def run(self):
1101N/A
290N/A os.putenv('PYEXE', sys.executable)
290N/A os.chdir(os.path.join(pwd, "tests"))
290N/A
448N/A # Reconstruct the cmdline and send that to run.py
448N/A cmd = [sys.executable, "run.py"]
448N/A args = ""
448N/A if "test" in sys.argv:
448N/A args = sys.argv[sys.argv.index("test")+1:]
430N/A cmd.extend(args)
448N/A subprocess.call(cmd)
290N/A
290N/Aclass dist_func(_bdist):
290N/A def initialize_options(self):
430N/A _bdist.initialize_options(self)
395N/A self.dist_dir = dist_dir
290N/A
2698N/Aclass Extension(distutils.core.Extension):
2698N/A # This class wraps the distutils Extension class, allowing us to set
2698N/A # build_64 in the object constructor instead of being forced to add it
2698N/A # after the object has been created.
2698N/A def __init__(self, name, sources, build_64=False, **kwargs):
3339N/A # 'name' and the item in 'sources' must be a string literal
3339N/A sources = [str(s) for s in sources]
3339N/A distutils.core.Extension.__init__(self, str(name), sources, **kwargs)
2698N/A self.build_64 = build_64
2698N/A
290N/A# These are set to real values based on the platform, down below
290N/Acompile_args = None
1637N/Aif osname in ("sunos", "linux", "darwin"):
1637N/A compile_args = [ "-O3" ]
2508N/Aif osname == "sunos":
2508N/A link_args = [ "-zstrip-class=nonalloc" ]
2508N/Aelse:
2508N/A link_args = []
3185N/A
613N/Aext_modules = [
613N/A Extension(
613N/A 'actions._actions',
613N/A _actions_srcs,
613N/A include_dirs = include_dirs,
613N/A extra_compile_args = compile_args,
2698N/A extra_link_args = link_args,
2698N/A build_64 = True
613N/A ),
1632N/A Extension(
2639N/A 'actions._common',
2639N/A _actcomm_srcs,
2639N/A include_dirs = include_dirs,
2639N/A extra_compile_args = compile_args,
2698N/A extra_link_args = link_args,
2698N/A build_64 = True
2639N/A ),
2639N/A Extension(
2639N/A '_varcet',
2639N/A _varcet_srcs,
2639N/A include_dirs = include_dirs,
2639N/A extra_compile_args = compile_args,
2698N/A extra_link_args = link_args,
2698N/A build_64 = True
2639N/A ),
2639N/A Extension(
1632N/A 'solver',
1632N/A solver_srcs,
1632N/A include_dirs = include_dirs + ["."],
1632N/A extra_compile_args = compile_args,
2508N/A extra_link_args = link_args + solver_link_args,
3185N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3185N/A build_64 = True
1632N/A ),
613N/A ]
290N/Aelf_libraries = None
3026N/Asysattr_libraries = None
3053N/Asha512_t_libraries = None
742N/Adata_files = web_files
395N/Acmdclasses = {
395N/A 'install': install_func,
2535N/A 'install_data': install_data_func,
2561N/A 'install_lib': install_lib_func,
395N/A 'build': build_func,
2535N/A 'build_data': build_data_func,
2508N/A 'build_ext': build_ext_func,
395N/A 'build_py': build_py_func,
395N/A 'bdist': dist_func,
395N/A 'lint': lint_func,
2339N/A 'clint': clint_func,
2339N/A 'pylint': pylint_func,
2364N/A 'pylint_quiet': pylint_func_quiet,
3253N/A 'pylint_py3k': pylint_func_py3k,
395N/A 'clean': clean_func,
395N/A 'clobber': clobber_func,
395N/A 'test': test_func,
2535N/A 'installfile': installfile,
395N/A }
290N/A
383N/A# all builds of IPS should have manpages
3313N/Aenglish_manpage_files = [
395N/A (man1_dir, man1_files),
3356N/A (man7_dir, man7_files),
3356N/A (man8_dir, man8_files),
3313N/A ]
3313N/Adata_files += english_manpage_files
3313N/Adata_files += [
2516N/A (man1_ja_JP_dir, man1_ja_files),
3356N/A (man7_ja_JP_dir, man7_ja_files),
3356N/A (man8_ja_JP_dir, man8_ja_files),
2516N/A (man1_zh_CN_dir, man1_zh_CN_files),
3356N/A (man7_zh_CN_dir, man7_zh_CN_files),
3356N/A (man8_zh_CN_dir, man8_zh_CN_files),
3313N/A ]
3313N/A# add resource files
3313N/Adata_files += [
3313N/A (resource_dir, resource_files)
395N/A ]
2523N/A# add transforms
2523N/Adata_files += [
2523N/A (transform_dir, transform_files)
2523N/A ]
3138N/A# add ignored deps
3138N/Adata_files += [
3138N/A (ignored_deps_dir, ignored_deps_files)
3138N/A ]
290N/Aif osname == 'sunos':
395N/A # Solaris-specific extensions are added here
395N/A data_files += [
2310N/A (smf_app_dir, smf_app_files),
1498N/A (execattrd_dir, execattrd_files),
1498N/A (authattrd_dir, authattrd_files),
2867N/A (userattrd_dir, userattrd_files),
2310N/A (sysrepo_dir, sysrepo_files),
3237N/A (sysrepo_dir_22, sysrepo_files_22),
2310N/A (sysrepo_logs_dir, sysrepo_log_stubs),
2535N/A (sysrepo_cache_dir, {}),
2852N/A (depot_dir, depot_files),
3237N/A (depot_dir_22, depot_files_22),
2852N/A (depot_conf_dir, {}),
2852N/A (depot_logs_dir, depot_log_stubs),
2852N/A (depot_cache_dir, {}),
2867N/A (mirror_cache_dir, {}),
2867N/A (mirror_logs_dir, {}),
2535N/A ]
2688N/A # install localizable .xml and its .pot file to put into localizable file package
2688N/A data_files += [
2535N/A (os.path.join(locale_dir, locale, 'LC_MESSAGES'),
3158N/A [('po/{0}.mo'.format(locale), 'pkg.mo')])
2535N/A for locale in pkg_locales
2535N/A ]
2688N/A # install English .pot file to put into localizable file package
2688N/A data_files += [
2688N/A (os.path.join(locale_dir, '__LOCALE__', 'LC_MESSAGES'),
2688N/A [('po/pkg.pot', 'pkg.pot')])
2688N/A ]
3313N/A # install English manpage sources to put into localizable file package
3313N/A data_files += [
3313N/A (dir.replace('usr/share/man/', 'usr/share/man/__LOCALE__/'),
3313N/A (os.path.join(MANPAGE_SRC_ROOT, os.path.basename(f))
3313N/A for f in files))
3313N/A for dir, files in english_manpage_files
3313N/A ]
290N/A
290N/Aif osname == 'sunos' or osname == "linux":
395N/A # Unix platforms which the elf extension has been ported to
395N/A # are specified here, so they are built automatically
395N/A elf_libraries = ['elf']
613N/A ext_modules += [
290N/A Extension(
395N/A 'elf',
395N/A elf_srcs,
395N/A include_dirs = include_dirs,
395N/A libraries = elf_libraries,
395N/A extra_compile_args = compile_args,
2698N/A extra_link_args = link_args,
3185N/A build_64 = True
395N/A ),
395N/A ]
290N/A
395N/A # Solaris has built-in md library and Solaris-specific arch extension
395N/A # All others use OpenSSL and cross-platform arch module
395N/A if osname == 'sunos':
395N/A elf_libraries += [ 'md' ]
3026N/A sysattr_libraries = [ 'nvpair' ]
3053N/A sha512_t_libraries = [ 'md' ]
395N/A ext_modules += [
395N/A Extension(
3261N/A '_arch',
395N/A arch_srcs,
395N/A include_dirs = include_dirs,
395N/A extra_compile_args = compile_args,
395N/A extra_link_args = link_args,
3185N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3185N/A build_64 = True
395N/A ),
691N/A Extension(
3261N/A '_pspawn',
691N/A pspawn_srcs,
691N/A include_dirs = include_dirs,
691N/A extra_compile_args = compile_args,
691N/A extra_link_args = link_args,
3185N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3185N/A build_64 = True
691N/A ),
2339N/A Extension(
3261N/A '_syscallat',
2339N/A syscallat_srcs,
2339N/A include_dirs = include_dirs,
2339N/A extra_compile_args = compile_args,
2339N/A extra_link_args = link_args,
3185N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3185N/A build_64 = True
2339N/A ),
3026N/A Extension(
3261N/A '_sysattr',
3026N/A sysattr_srcs,
3026N/A include_dirs = include_dirs,
3026N/A libraries = sysattr_libraries,
3026N/A extra_compile_args = compile_args,
3026N/A extra_link_args = link_args,
3026N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3026N/A build_64 = True
3026N/A ),
3053N/A Extension(
3261N/A '_sha512_t',
3053N/A sha512_t_srcs,
3053N/A include_dirs = include_dirs,
3053N/A libraries = sha512_t_libraries,
3053N/A extra_compile_args = compile_args,
3053N/A extra_link_args = link_args,
3053N/A define_macros = [('_FILE_OFFSET_BITS', '64')],
3053N/A build_64 = True
3053N/A ),
395N/A ]
395N/A else:
395N/A elf_libraries += [ 'ssl' ]
395N/A
395N/Asetup(cmdclass = cmdclasses,
1516N/A name = 'pkg',
1516N/A version = '0.1',
395N/A package_dir = {'pkg':'modules'},
395N/A packages = packages,
395N/A data_files = data_files,
395N/A ext_package = 'pkg',
395N/A ext_modules = ext_modules,
3245N/A classifiers = [
3339N/A 'Programming Language :: Python :: 2',
3245N/A 'Programming Language :: Python :: 2.7',
3339N/A 'Programming Language :: Python :: 3',
3339N/A 'Programming Language :: Python :: 3.4',
3245N/A ]
3245N/A)