[Python-checkins] r76316 - in python/branches/tarek_sysconfig/Lib: sysconfig.py test/test_sysconfig.py
tarek.ziade
python-checkins at python.org
Mon Nov 16 01:11:20 CET 2009
Author: tarek.ziade
Date: Mon Nov 16 01:11:20 2009
New Revision: 76316
Log:
added missing paths and removed unecessary APIs
Modified:
python/branches/tarek_sysconfig/Lib/sysconfig.py
python/branches/tarek_sysconfig/Lib/test/test_sysconfig.py
Modified: python/branches/tarek_sysconfig/Lib/sysconfig.py
==============================================================================
--- python/branches/tarek_sysconfig/Lib/sysconfig.py (original)
+++ python/branches/tarek_sysconfig/Lib/sysconfig.py Mon Nov 16 01:11:20 2009
@@ -1,76 +1,83 @@
+"""Provide access to Python's configuration information.
+
+"""
import sys
import os
from os.path import pardir, abspath
_INSTALL_SCHEMES = {
'unix_prefix': {
+ 'stdlib': '$base/lib/python$py_version_short',
+ 'platstdlib': '$platbase/lib/python$py_version_short',
'purelib': '$base/lib/python$py_version_short/site-packages',
'platlib': '$platbase/lib/python$py_version_short/site-packages',
- 'headers': '$base/include/python$py_version_short/$dist_name',
+ 'include': '$base/include/python$py_version_short',
+ 'platinclude': '$platbase/include/python$py_version_short',
'scripts': '$base/bin',
- 'data' : '$base',
+ 'data': '$base',
},
'unix_home': {
+ 'stdlib': '$base/lib/python',
+ 'platstdlib': '$base/lib/python',
'purelib': '$base/lib/python',
'platlib': '$base/lib/python',
- 'headers': '$base/include/python/$dist_name',
+ 'include': '$base/include/python',
+ 'platinclude': '$base/include/python',
'scripts': '$base/bin',
'data' : '$base',
},
'nt': {
+ 'stdlib': '$base/Lib',
+ 'platstdlib': '$base/Lib',
'purelib': '$base/Lib/site-packages',
'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- },
- 'mac': {
- 'purelib': '$base/Lib/site-packages',
- 'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
+ 'include': '$base/include',
+ 'platinclude': '$base/include',
'scripts': '$base/Scripts',
'data' : '$base',
},
-
'os2': {
+ 'stdlib': '$base/Lib',
+ 'platstdlib': '$base/Lib',
'purelib': '$base/Lib/site-packages',
'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
+ 'include': '$base/Include',
+ 'platinclude': '$base/Include',
'scripts': '$base/Scripts',
'data' : '$base',
},
+ 'os2_home': {
+ 'stdlib': '$userbase/lib/python/$py_version_short',
+ 'platstdlib': '$userbase/lib/python/$py_version_short',
+ 'purelib': '$userbase/lib/python/$py_version_short/site-packages',
+ 'platlib': '$userbase/lib/python/$py_version_short/site-packages',
+ 'include': '$userbase/include/python$py_version_short',
+ 'scripts': '$userbase/bin',
+ 'data' : '$userbase',
+ },
'nt_user': {
+ 'stdlib': '$userbase/Python/$py_version_nodot',
+ 'platstdlib': '$userbase/Python/$py_version_nodot',
'purelib': '$userbase/Python/$py_version_nodot/site-packages',
'platlib': '$userbase/Python/$py_version_nodot/site-packages',
- 'headers': '$userbase/Python$py_version_nodot/Include/$dist_name',
+ 'include': '$userbase/Python$py_version_nodot/Include',
'scripts': '$userbase/Scripts',
'data' : '$userbase',
},
'unix_user': {
+ 'stdlib': '$userbase/lib/python/$py_version_short',
+ 'platstdlib': '$userbase/lib/python/$py_version_short',
'purelib': '$userbase/lib/python/$py_version_short/site-packages',
'platlib': '$userbase/lib/python/$py_version_short/site-packages',
- 'headers': '$userbase/include/python$py_version_short/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- },
- 'mac_user': {
- 'purelib': '$userbase/lib/python/$py_version_short/site-packages',
- 'platlib': '$userbase/lib/python/$py_version_short/site-packages',
- 'headers': '$userbase/$py_version_short/include/$dist_name',
+ 'include': '$userbase/include/python$py_version_short',
'scripts': '$userbase/bin',
'data' : '$userbase',
},
- 'os2_home': {
- 'purelib': '$userbase/lib/python/$py_version_short/site-packages',
- 'platlib': '$userbase/lib/python/$py_version_short/site-packages',
- 'headers': '$userbase/include/python$py_version_short/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- }
}
-_SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data')
_PY_VERSION = sys.version.split()[0]
+_PY_VERSION_SHORT = sys.version[:3]
+_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2]
_PREFIX = os.path.normpath(sys.prefix)
_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
_CONFIG_VARS = None
@@ -94,12 +101,10 @@
_PYTHON_BUILD = _python_build()
-def get_python_version():
- """Return a string containing the major and minor Python version,
- leaving off the patchlevel. Sample return values could be '1.5'
- or '2.2'.
- """
- return sys.version[:3]
+if _PYTHON_BUILD:
+ for scheme in ('unix_prefix', 'unix_home'):
+ _INSTALL_SCHEMES[scheme]['include'] = '$projectbase'
+ _INSTALL_SCHEMES[scheme]['platinclude'] = '$srcdir/Include'
def _subst_vars(s, local_vars):
import re
@@ -128,23 +133,8 @@
return 'unix_home'
return os.name
-def get_paths(scheme=_get_default_scheme(), vars=None):
- """Returns a mapping containing the install scheme.
-
- ``scheme`` is the install scheme name
- """
- return _expand_vars(scheme, vars)
-
-def get_path(scheme, name, vars=None):
- """Returns a mapping containing the install scheme.
-
- ``scheme`` is the install scheme name
- """
- return _expand_vars(scheme, vars)[name]
-
def _getuserbase():
env_base = os.environ.get("PYTHONUSERBASE", None)
-
def joinuser(*args):
return os.path.expanduser(os.path.join(*args))
@@ -155,12 +145,205 @@
return env_base if env_base else joinuser("~", ".local")
+
+def _parse_makefile(filename, vars=None):
+ """Parse a Makefile-style file.
+
+ A dictionary containing name/value pairs is returned. If an
+ optional dictionary is passed in as the second argument, it is
+ used instead of a new dictionary.
+ """
+ import re
+ # Regexes needed for parsing Makefile (and similar syntaxes,
+ # like old-style Setup files).
+ _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
+ _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
+ _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
+
+ if vars is None:
+ vars = {}
+ done = {}
+ notdone = {}
+
+ with open(filename) as f:
+ lines = f.readlines()
+
+ for line in lines:
+ if line.startswith('#') or line.strip() == '':
+ continue
+ m = _variable_rx.match(line)
+ if m:
+ n, v = m.group(1, 2)
+ v = v.strip()
+ # `$$' is a literal `$' in make
+ tmpv = v.replace('$$', '')
+
+ if "$" in tmpv:
+ notdone[n] = v
+ else:
+ try:
+ v = int(v)
+ except ValueError:
+ # insert literal `$'
+ done[n] = v.replace('$$', '$')
+ else:
+ done[n] = v
+
+ # do variable interpolation here
+ while notdone:
+ for name in notdone.keys():
+ value = notdone[name]
+ m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+ if m:
+ n = m.group(1)
+ found = True
+ if n in done:
+ item = str(done[n])
+ elif n in notdone:
+ # get it on a subsequent round
+ found = False
+ elif n in os.environ:
+ # do it like make: fall back to environment
+ item = os.environ[n]
+ else:
+ done[n] = item = ""
+ if found:
+ after = value[m.end():]
+ value = value[:m.start()] + item + after
+ if "$" in after:
+ notdone[name] = value
+ else:
+ try: value = int(value)
+ except ValueError:
+ done[name] = value.strip()
+ else:
+ done[name] = value
+ del notdone[name]
+ else:
+ # bogus variable reference; just drop it since we can't deal
+ del notdone[name]
+ # save the results in the global dictionary
+ vars.update(done)
+ return vars
+
+def _parse_config_h(fp, vars=None):
+ """Parse a config.h-style file.
+
+ A dictionary containing name/value pairs is returned. If an
+ optional dictionary is passed in as the second argument, it is
+ used instead of a new dictionary.
+ """
+ import re
+ if vars is None:
+ vars = {}
+ define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
+ undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
+
+ while True:
+ line = fp.readline()
+ if not line:
+ break
+ m = define_rx.match(line)
+ if m:
+ n, v = m.group(1, 2)
+ try: v = int(v)
+ except ValueError: pass
+ vars[n] = v
+ else:
+ m = undef_rx.match(line)
+ if m:
+ vars[m.group(1)] = 0
+ return vars
+
+def _init_posix(vars):
+ """Initialize the module as appropriate for POSIX systems."""
+ # load the installed Makefile:
+ if _PYTHON_BUILD:
+ makefile = os.path.join(_PROJECT_BASE, "Makefile")
+ else:
+ makefile = os.path.join(get_path('stdlib'), "config", "Makefile")
+ try:
+ _parse_makefile(makefile, vars)
+ except IOError, e:
+ msg = "invalid Python installation: unable to open %s" % filename
+ if hasattr(e, "strerror"):
+ msg = msg + " (%s)" % e.strerror
+ raise IOError(msg)
+
+ # load the installed pyconfig.h:
+ if _PYTHON_BUILD:
+ if os.name == "nt":
+ inc_dir = os.path.join(_PROJECT_BASE, "PC")
+ else:
+ inc_dir = _PROJECT_BASE
+ else:
+ inc_dir = get_path('platinclude')
+ config_h = os.path.join(inc_dir, 'pyconfig.h')
+ try:
+ _parse_config_h(open(config_h), vars)
+ except IOError, e:
+ msg = "invalid Python installation: unable to open %s" % filename
+ if hasattr(e, "strerror"):
+ msg = msg + " (%s)" % e.strerror
+ raise IOError(msg)
+
+ # On MacOSX we need to check the setting of the environment variable
+ # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
+ # it needs to be compatible.
+ # If it isn't set we set it to the configure-time value
+ if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in vars:
+ cfg_target = vars['MACOSX_DEPLOYMENT_TARGET']
+ cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
+ if cur_target == '':
+ cur_target = cfg_target
+ os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
+ elif map(int, cfg_target.split('.')) > map(int, cur_target.split('.')):
+ msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" '
+ 'during configure' % (cur_target, cfg_target))
+ raise IOError(msg)
+
+ # On AIX, there are wrong paths to the linker scripts in the Makefile
+ # -- these paths are relative to the Python source, but when installed
+ # the scripts are in another directory.
+ if _PYTHON_BUILD:
+ vars['LDSHARED'] = vars['BLDSHARED']
+
+def _init_non_posix(vars):
+ """Initialize the module as appropriate for NT"""
+ # set basic install directories
+ vars['LIBDEST'] = get_path('stdlib')
+ vars['BINLIBDEST'] = get_path('platstdlib')
+ vars['INCLUDEPY'] = get_path('include')
+ vars['SO'] = '.pyd'
+ vars['EXE'] = '.exe'
+ vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
+ vars['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
+
+#
+# public APIs
+#
+def get_paths(scheme=_get_default_scheme(), vars=None):
+ """Returns a mapping containing an install scheme.
+
+ ``scheme`` is the install scheme name. If not provided, it will
+ return the default scheme for the current platform.
+ """
+ return _expand_vars(scheme, vars)
+
+def get_path(name, scheme=_get_default_scheme(), vars=None):
+ """Returns a path corresponding to the scheme.
+
+ ``scheme`` is the install scheme name.
+ """
+ return _expand_vars(scheme, vars)[name]
+
+
def get_config_vars(*args):
"""With no arguments, return a dictionary of all configuration
- variables relevant for the current platform. Generally this includes
- everything needed to build extensions and install both pure modules and
- extensions. On Unix, this means every variable defined in Python's
- installed Makefile; on Windows and Mac OS it's a much smaller set.
+ variables relevant for the current platform.
+
+ On Unix, this means every variable defined in Python's installed Makefile;
+ On Windows and Mac OS it's a much smaller set.
With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
@@ -168,11 +351,11 @@
import re
global _CONFIG_VARS
if _CONFIG_VARS is None:
- func = globals().get("_init_" + os.name)
- if func:
- func()
- else:
- _CONFIG_VARS = {}
+ _CONFIG_VARS = {}
+ if os.name in ('nt', 'os2'):
+ _init_non_posix(_CONFIG_VARS)
+ if os.name == 'posix':
+ _init_posix(_CONFIG_VARS)
# Normalized versions of prefix and exec_prefix are handy to have;
# in fact, these are the standard versions used most places in the
@@ -180,12 +363,12 @@
_CONFIG_VARS['prefix'] = _PREFIX
_CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
_CONFIG_VARS['py_version'] = _PY_VERSION
- _CONFIG_VARS['py_version_short'] = _PY_VERSION[3:0]
+ _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
_CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
_CONFIG_VARS['base'] = _PREFIX
_CONFIG_VARS['platbase'] = _EXEC_PREFIX
_CONFIG_VARS['userbase'] = _getuserbase()
- _CONFIG_VARS['dist_name'] = ''
+ _CONFIG_VARS['projectbase'] = _PROJECT_BASE
if 'srcdir' not in _CONFIG_VARS:
_CONFIG_VARS['srcdir'] = _PROJECT_BASE
@@ -195,7 +378,7 @@
# testing, for example, we might be running a non-installed python
# from a different directory.
if _PYTHON_BUILD and os.name == "posix":
- base = os.path.dirname(abspath(sys.executable))
+ base = _PROJECT_BASE
if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
base != os.getcwd()):
# srcdir is relative and we are not in the same directory
@@ -213,7 +396,6 @@
# are in CFLAGS or LDFLAGS and remove them if they are.
# This is needed when building extensions on a 10.3 system
# using a universal build of python.
-
for key in ('LDFLAGS', 'BASECFLAGS',
# a number of derived variables. These need to be
# patched up as well.
@@ -222,15 +404,12 @@
flags = re.sub('-arch\s+\w+\s', ' ', flags)
flags = re.sub('-isysroot [^ \t]*', ' ', flags)
_CONFIG_VARS[key] = flags
-
else:
-
# Allow the user to override the architecture flags using
# an environment variable.
# NOTE: This name was introduced by Apple in OSX 10.5 and
# is used by several scripting languages distributed with
# that OS release.
-
if 'ARCHFLAGS' in os.environ:
arch = os.environ['ARCHFLAGS']
for key in ('LDFLAGS', 'BASECFLAGS',
@@ -276,9 +455,10 @@
return _CONFIG_VARS
def get_config_var(name):
- """Return the value of a single variable using the dictionary
- returned by 'get_CONFIG_VARS()'. Equivalent to
- get_CONFIG_VARS().get(name)
+ """Return the value of a single variable using the dictionary returned by
+ 'get_config_vars()'.
+
+ Equivalent to get_config_vars().get(name)
"""
return get_config_vars().get(name)
@@ -307,6 +487,7 @@
For other non-POSIX platforms, currently just returns 'sys.platform'.
"""
+ import re
if os.name == 'nt':
# sniff sys.version for architecture.
prefix = " bit ("
@@ -363,7 +544,6 @@
# machine is going to compile and link as if it were
# MACOSX_DEPLOYMENT_TARGET.
cfgvars = get_config_vars()
-
macver = os.environ.get('MACOSX_DEPLOYMENT_TARGET')
if not macver:
macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
@@ -435,155 +615,3 @@
machine = 'ppc'
return "%s-%s-%s" % (osname, release, machine)
-
-
-def get_python_inc(plat_specific=0, prefix=None):
- """Return the directory containing installed Python header files.
-
- If 'plat_specific' is false (the default), this is the path to the
- non-platform-specific header files, i.e. Python.h and so on;
- otherwise, this is the path to platform-specific header files
- (namely pyconfig.h).
-
- If 'prefix' is supplied, use it instead of sys.prefix or
- sys.exec_prefix -- i.e., ignore 'plat_specific'.
- """
- if prefix is None:
- prefix = plat_specific and _EXEC_PREFIX or _PREFIX
- if os.name == "posix":
- if _PYTHON_BUILD:
- # Assume the executable is in the build directory. The
- # pyconfig.h file should be in the same directory. Since
- # the build directory may not be the source directory, we
- # must use "srcdir" from the makefile to find the "Include"
- # directory.
- base = os.path.dirname(os.path.abspath(sys.executable))
- if plat_specific:
- return base
- else:
- incdir = os.path.join(get_config_var('srcdir'), 'Include')
- return os.path.normpath(incdir)
- return os.path.join(prefix, "include", "python" + get_python_version())
- elif os.name == "nt":
- return os.path.join(prefix, "include")
- elif os.name == "mac":
- if plat_specific:
- return os.path.join(prefix, "Mac", "Include")
- else:
- return os.path.join(prefix, "Include")
- elif os.name == "os2":
- return os.path.join(prefix, "Include")
- else:
- raise DistutilsPlatformError(
- "I don't know where Python installs its C header files "
- "on platform '%s'" % os.name)
-
-def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
- """Return the directory containing the Python library (standard or
- site additions).
-
- If 'plat_specific' is true, return the directory containing
- platform-specific modules, i.e. any module from a non-pure-Python
- module distribution; otherwise, return the platform-shared library
- directory. If 'standard_lib' is true, return the directory
- containing standard Python library modules; otherwise, return the
- directory for site-specific modules.
-
- If 'prefix' is supplied, use it instead of sys.prefix or
- sys.exec_prefix -- i.e., ignore 'plat_specific'.
- """
- if prefix is None:
- prefix = plat_specific and _EXEC_PREFIX or _PREFIX
-
- if os.name == "posix":
- libpython = os.path.join(prefix,
- "lib", "python" + get_python_version())
- if standard_lib:
- return libpython
- else:
- return os.path.join(libpython, "site-packages")
-
- elif os.name == "nt":
- if standard_lib:
- return os.path.join(prefix, "Lib")
- else:
- if get_python_version() < "2.2":
- return prefix
- else:
- return os.path.join(prefix, "Lib", "site-packages")
-
- elif os.name == "mac":
- if plat_specific:
- if standard_lib:
- return os.path.join(prefix, "Lib", "lib-dynload")
- else:
- return os.path.join(prefix, "Lib", "site-packages")
- else:
- if standard_lib:
- return os.path.join(prefix, "Lib")
- else:
- return os.path.join(prefix, "Lib", "site-packages")
-
- elif os.name == "os2":
- if standard_lib:
- return os.path.join(prefix, "Lib")
- else:
- return os.path.join(prefix, "Lib", "site-packages")
-
- else:
- raise DistutilsPlatformError(
- "I don't know where Python installs its library "
- "on platform '%s'" % os.name)
-
-
-def get_config_h_filename():
- """Return full pathname of installed pyconfig.h file."""
- if _PYTHON_BUILD:
- if os.name == "nt":
- inc_dir = os.path.join(project_base, "PC")
- else:
- inc_dir = _PROJECT_BASE
- else:
- inc_dir = get_python_inc(plat_specific=1)
- if get_python_version() < '2.2':
- config_h = 'config.h'
- else:
- # The name of the config.h file changed in 2.2
- config_h = 'pyconfig.h'
- return os.path.join(inc_dir, config_h)
-
-
-def get_makefile_filename():
- """Return full pathname of installed Makefile from the Python build."""
- if _PYTHON_BUILD:
- return os.path.join(os.path.dirname(sys.executable), "Makefile")
- lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
- return os.path.join(lib_dir, "config", "Makefile")
-
-def parse_config_h(fp, g=None):
- """Parse a config.h-style file.
-
- A dictionary containing name/value pairs is returned. If an
- optional dictionary is passed in as the second argument, it is
- used instead of a new dictionary.
- """
- if g is None:
- g = {}
- define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
- undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
- #
- while 1:
- line = fp.readline()
- if not line:
- break
- m = define_rx.match(line)
- if m:
- n, v = m.group(1, 2)
- try: v = int(v)
- except ValueError: pass
- g[n] = v
- else:
- m = undef_rx.match(line)
- if m:
- g[m.group(1)] = 0
- return g
Modified: python/branches/tarek_sysconfig/Lib/test/test_sysconfig.py
==============================================================================
--- python/branches/tarek_sysconfig/Lib/test/test_sysconfig.py (original)
+++ python/branches/tarek_sysconfig/Lib/test/test_sysconfig.py Mon Nov 16 01:11:20 2009
@@ -8,9 +8,13 @@
import sys
import test
import os
+from copy import copy, deepcopy
+
from test.test_support import run_unittest, TESTFN
-from sysconfig import *
-from sysconfig import _INSTALL_SCHEMES, _SCHEME_KEYS
+
+import sysconfig
+from sysconfig import (get_paths, get_platform, get_config_vars, get_path,
+ _INSTALL_SCHEMES)
class TestSysConfig(unittest.TestCase):
@@ -19,6 +23,24 @@
super(TestSysConfig, self).setUp()
self.sys_path = sys.path[:]
self.makefile = None
+ # patching os.uname
+ if hasattr(os, 'uname'):
+ self.uname = os.uname
+ self._uname = os.uname()
+ else:
+ self.uname = None
+ self._uname = None
+ os.uname = self._get_uname
+ # saving the environment
+ self.name = os.name
+ self.platform = sys.platform
+ self.version = sys.version
+ self.sep = os.sep
+ self.join = os.path.join
+ self.isabs = os.path.isabs
+ self.splitdrive = os.path.splitdrive
+ self._config_vars = copy(sysconfig._CONFIG_VARS)
+ self.old_environ = deepcopy(os.environ)
def tearDown(self):
"""Restore sys.path"""
@@ -26,8 +48,34 @@
if self.makefile is not None:
os.unlink(self.makefile)
self._cleanup_testfn()
+ if self.uname is not None:
+ os.uname = self.uname
+ else:
+ del os.uname
+ os.name = self.name
+ sys.platform = self.platform
+ sys.version = self.version
+ os.sep = self.sep
+ os.path.join = self.join
+ os.path.isabs = self.isabs
+ os.path.splitdrive = self.splitdrive
+ sysconfig._CONFIG_VARS = copy(self._config_vars)
+ for key, value in self.old_environ.items():
+ if os.environ.get(key) != value:
+ os.environ[key] = value
+
+ for key in os.environ.keys():
+ if key not in self.old_environ:
+ del os.environ[key]
+
super(TestSysConfig, self).tearDown()
+ def _set_uname(self, uname):
+ self._uname = uname
+
+ def _get_uname(self):
+ return self._uname
+
def _cleanup_testfn(self):
path = test.test_support.TESTFN
if os.path.isfile(path):
@@ -38,49 +86,125 @@
def test_get_paths(self):
# XXX make it os independant
scheme = get_paths()
- wanted = {'purelib': '/usr/local/lib/python',
- 'headers': '/usr/local/include/python/',
- 'platlib': '/usr/local/lib/python',
- 'data': '/usr/local',
- 'scripts': '/usr/local/bin'}
+ wanted = [('data', '/usr/local'),
+ ('include', '/Users/tarek/Dev/svn.python.org/tarek_sysconfig'),
+ ('platinclude', './Include'),
+ ('platlib', '/usr/local/lib/python'),
+ ('platstdlib', '/usr/local/lib/python'),
+ ('purelib', '/usr/local/lib/python'),
+ ('scripts', '/usr/local/bin'),
+ ('stdlib', '/usr/local/lib/python')]
- wanted = wanted.items()
- wanted.sort()
scheme = scheme.items()
scheme.sort()
self.assertEquals(scheme, wanted)
def test_get_path(self):
- for key in _INSTALL_SCHEMES:
- for name in _SCHEME_KEYS:
- res = get_path(key, name)
-
- def test_get_config_h_filename(self):
- config_h = get_config_h_filename()
- self.assertTrue(os.path.isfile(config_h), config_h)
-
- def test_get_python_lib(self):
- lib_dir = get_python_lib()
- # XXX doesn't work on Linux when Python was never installed before
- #self.assertTrue(os.path.isdir(lib_dir), lib_dir)
- # test for pythonxx.lib?
- self.assertNotEqual(get_python_lib(),
- get_python_lib(prefix=TESTFN))
-
- def test_get_python_inc(self):
- inc_dir = get_python_inc()
- # This is not much of a test. We make sure Python.h exists
- # in the directory returned by get_python_inc() but we don't know
- # it is the correct file.
- self.assertTrue(os.path.isdir(inc_dir), inc_dir)
- python_h = os.path.join(inc_dir, "Python.h")
- self.assertTrue(os.path.isfile(python_h), python_h)
+ # xxx make real tests here
+ for scheme in _INSTALL_SCHEMES:
+ for name in _INSTALL_SCHEMES[scheme]:
+ res = get_path(name, scheme)
def test_get_config_vars(self):
cvars = get_config_vars()
self.assertTrue(isinstance(cvars, dict))
self.assertTrue(cvars)
+ def test_get_platform(self):
+ # windows XP, 32bits
+ os.name = 'nt'
+ sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
+ '[MSC v.1310 32 bit (Intel)]')
+ sys.platform = 'win32'
+ self.assertEquals(get_platform(), 'win32')
+
+ # windows XP, amd64
+ os.name = 'nt'
+ sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
+ '[MSC v.1310 32 bit (Amd64)]')
+ sys.platform = 'win32'
+ self.assertEquals(get_platform(), 'win-amd64')
+
+ # windows XP, itanium
+ os.name = 'nt'
+ sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
+ '[MSC v.1310 32 bit (Itanium)]')
+ sys.platform = 'win32'
+ self.assertEquals(get_platform(), 'win-ia64')
+
+ # macbook
+ os.name = 'posix'
+ sys.version = ('2.5 (r25:51918, Sep 19 2006, 08:49:13) '
+ '\n[GCC 4.0.1 (Apple Computer, Inc. build 5341)]')
+ sys.platform = 'darwin'
+ self._set_uname(('Darwin', 'macziade', '8.11.1',
+ ('Darwin Kernel Version 8.11.1: '
+ 'Wed Oct 10 18:23:28 PDT 2007; '
+ 'root:xnu-792.25.20~1/RELEASE_I386'), 'i386'))
+ get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
+ os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
+
+ get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g '
+ '-fwrapv -O3 -Wall -Wstrict-prototypes')
+
+ self.assertEquals(get_platform(), 'macosx-10.3-i386')
+
+ # macbook with fat binaries (fat, universal or fat64)
+ os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.4'
+ get_config_vars()['CFLAGS'] = ('-arch ppc -arch i386 -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3')
+
+ self.assertEquals(get_platform(), 'macosx-10.4-fat')
+
+ get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch i386 -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3')
+
+ self.assertEquals(get_platform(), 'macosx-10.4-intel')
+
+ get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc -arch i386 -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3')
+ self.assertEquals(get_platform(), 'macosx-10.4-fat3')
+
+ get_config_vars()['CFLAGS'] = ('-arch ppc64 -arch x86_64 -arch ppc -arch i386 -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3')
+ self.assertEquals(get_platform(), 'macosx-10.4-universal')
+
+ get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc64 -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3')
+
+ self.assertEquals(get_platform(), 'macosx-10.4-fat64')
+
+ for arch in ('ppc', 'i386', 'x86_64', 'ppc64'):
+ get_config_vars()['CFLAGS'] = ('-arch %s -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk '
+ '-fno-strict-aliasing -fno-common '
+ '-dynamic -DNDEBUG -g -O3'%(arch,))
+
+ self.assertEquals(get_platform(), 'macosx-10.4-%s'%(arch,))
+
+ # linux debian sarge
+ os.name = 'posix'
+ sys.version = ('2.3.5 (#1, Jul 4 2007, 17:28:59) '
+ '\n[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)]')
+ sys.platform = 'linux2'
+ self._set_uname(('Linux', 'aglae', '2.6.21.1dedibox-r7',
+ '#1 Mon Apr 30 17:25:38 CEST 2007', 'i686'))
+
+ self.assertEquals(get_platform(), 'linux-i686')
+
+ # XXX more platforms to tests here
+
+
def test_main():
run_unittest(TestSysConfig)
More information about the Python-checkins
mailing list