summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTarek Ziad? <tarek@ziade.org>2010-02-23 16:54:32 -0500
committerTarek Ziad? <tarek@ziade.org>2010-02-23 16:54:32 -0500
commita8a74f9731b52d6dde434feec991cdf7524a24a3 (patch)
tree9d57c4fdd07691071d73842254747c356ab31769 /src
parente46c08c3af77789a30c5a871d05942e0407aed1d (diff)
downloaddisutils2-a8a74f9731b52d6dde434feec991cdf7524a24a3.tar.gz
now sysconfig uses a sysconfig.cfg file
Diffstat (limited to 'src')
-rw-r--r--src/distutils2/_backport/sysconfig.cfg95
-rw-r--r--src/distutils2/_backport/sysconfig.py135
-rw-r--r--src/distutils2/_backport/tests/test_sysconfig.py11
-rw-r--r--src/distutils2/command/install.py102
-rw-r--r--src/distutils2/tests/test_install.py44
-rw-r--r--src/distutils2/util.py5
6 files changed, 166 insertions, 226 deletions
diff --git a/src/distutils2/_backport/sysconfig.cfg b/src/distutils2/_backport/sysconfig.cfg
new file mode 100644
index 0000000..42b0873
--- /dev/null
+++ b/src/distutils2/_backport/sysconfig.cfg
@@ -0,0 +1,95 @@
+[globals]
+# These are the useful categories that are sometimes referenced at runtime
+# and are referenced from pkgutils.open()
+config = {confdir}/{distribution.name} # Configuration files
+appdata = {datadir}/{distribution.name} # Non-writable data that is independent of architecture (images, many xml/text files)
+appdata.arch = {libdir}/{distribution.name} # Non-writable data that is different depending on architecture (some binary data formats)
+appdata.persistent = {statedir}/lib/{distribution.name} # Data that the app writes and keeps data that can't just be thrown out (databases)
+appdata.disposable = {statedir}/cache/{distribution.name} # Data that the app writes but can be thrown out and the app will keep working (cache)
+help = {datadir}/{distribution.name} # Note, these help files are used at runtime
+icon = {datadir}/pixmaps
+scripts = {base}/bin
+
+# Non runtime files. These are valid categories for markingfiles for
+# install but they should not be referenced by the app at runtime.
+doc = {datadir}/doc/{distribution.name} # These type of files are only viewed if the user explicitly opens them with another program
+info = {datadir}/info # GNU info documentation files
+man = {datadir}/man # Man page location
+
+[posix_prefix]
+# Configuration directories. Some of these come straight out of the
+# configure script. They are for implementing the other variables, not to
+# be used directly in resource_locations
+confdir = /etc
+datadir = /usr/share
+libdir = /usr/lib # or /usr/lib64 on a multilib system
+statedir = /var
+local = ~/.local/{distribution.name} # User resource directory
+
+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
+include = {base}/include/python{py_version_short}
+platinclude = {platbase}/include/python{py_version_short}
+data = {base}
+
+
+[posix_home]
+stdlib = {base}/lib/python
+platstdlib = {base}/lib/python
+purelib = {base}/lib/python
+platlib = {base}/lib/python
+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
+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
+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
+include = {userbase}/Python{py_version_nodot}/Include
+scripts = {userbase}/Scripts
+data = {userbase}
+
+[posix_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
+include = {userbase}/include/python{py_version_short}
+scripts = {userbase}/bin
+data = {userbase}
+
+
diff --git a/src/distutils2/_backport/sysconfig.py b/src/distutils2/_backport/sysconfig.py
index fd362b1..00ef5cc 100644
--- a/src/distutils2/_backport/sysconfig.py
+++ b/src/distutils2/_backport/sysconfig.py
@@ -3,85 +3,37 @@
"""
import sys
import os
+import re
from os.path import pardir, abspath
+from ConfigParser import ConfigParser
+
+_PREFIX = os.path.normpath(sys.prefix)
+_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+
+# let's read the configuration file
+# XXX _CONFIG_DIR will be set by the Makefile later
+_CONFIG_DIR = os.path.normpath(os.path.dirname(__file__))
+_CONFIG_FILE = os.path.join(_CONFIG_DIR, 'sysconfig.cfg')
+_SCHEMES = ConfigParser()
+_SCHEMES.read(_CONFIG_FILE)
+
+def _expand_globals():
+ globals = _SCHEMES.items('globals')
+ sections = _SCHEMES.sections()
+ for section in sections:
+ if section == 'globals':
+ continue
+ for option, value in globals:
+ if _SCHEMES.has_option(section, option):
+ continue
+ _SCHEMES.set(section, option, value)
+ _SCHEMES.remove_section('globals')
+
+_expand_globals()
-_INSTALL_SCHEMES = {
- 'posix_prefix': {
- 'stdlib': '%(base)s/lib/python%(py_version_short)s',
- 'platstdlib': '%(platbase)s/lib/python%(py_version_short)s',
- 'purelib': '%(base)s/lib/python%(py_version_short)s/site-packages',
- 'platlib': '%(platbase)s/lib/python%(py_version_short)s/site-packages',
- 'include': '%(base)s/include/python%(py_version_short)s',
- 'platinclude': '%(platbase)s/include/python%(py_version_short)s',
- 'scripts': '%(base)s/bin',
- 'data': '%(base)s',
- },
- 'posix_home': {
- 'stdlib': '%(base)s/lib/python',
- 'platstdlib': '%(base)s/lib/python',
- 'purelib': '%(base)s/lib/python',
- 'platlib': '%(base)s/lib/python',
- 'include': '%(base)s/include/python',
- 'platinclude': '%(base)s/include/python',
- 'scripts': '%(base)s/bin',
- 'data' : '%(base)s',
- },
- 'nt': {
- 'stdlib': '%(base)s/Lib',
- 'platstdlib': '%(base)s/Lib',
- 'purelib': '%(base)s/Lib/site-packages',
- 'platlib': '%(base)s/Lib/site-packages',
- 'include': '%(base)s/Include',
- 'platinclude': '%(base)s/Include',
- 'scripts': '%(base)s/Scripts',
- 'data' : '%(base)s',
- },
- 'os2': {
- 'stdlib': '%(base)s/Lib',
- 'platstdlib': '%(base)s/Lib',
- 'purelib': '%(base)s/Lib/site-packages',
- 'platlib': '%(base)s/Lib/site-packages',
- 'include': '%(base)s/Include',
- 'platinclude': '%(base)s/Include',
- 'scripts': '%(base)s/Scripts',
- 'data' : '%(base)s',
- },
- 'os2_home': {
- 'stdlib': '%(userbase)s/lib/python/%(py_version_short)s',
- 'platstdlib': '%(userbase)s/lib/python/%(py_version_short)s',
- 'purelib': '%(userbase)s/lib/python/%(py_version_short)s/site-packages',
- 'platlib': '%(userbase)s/lib/python/%(py_version_short)s/site-packages',
- 'include': '%(userbase)s/include/python%(py_version_short)s',
- 'scripts': '%(userbase)s/bin',
- 'data' : '%(userbase)s',
- },
- 'nt_user': {
- 'stdlib': '%(userbase)s/Python%(py_version_nodot)s',
- 'platstdlib': '%(userbase)s/Python%(py_version_nodot)s',
- 'purelib': '%(userbase)s/Python%(py_version_nodot)s/site-packages',
- 'platlib': '%(userbase)s/Python%(py_version_nodot)s/site-packages',
- 'include': '%(userbase)s/Python%(py_version_nodot)s/Include',
- 'scripts': '%(userbase)s/Scripts',
- 'data' : '%(userbase)s',
- },
- 'posix_user': {
- 'stdlib': '%(userbase)s/lib/python/%(py_version_short)s',
- 'platstdlib': '%(userbase)s/lib/python/%(py_version_short)s',
- 'purelib': '%(userbase)s/lib/python/%(py_version_short)s/site-packages',
- 'platlib': '%(userbase)s/lib/python/%(py_version_short)s/site-packages',
- 'include': '%(userbase)s/include/python%(py_version_short)s',
- 'scripts': '%(userbase)s/bin',
- 'data' : '%(userbase)s',
- },
- }
-
-_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
- '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
_USER_BASE = None
_PROJECT_BASE = abspath(os.path.dirname(sys.executable))
@@ -105,17 +57,21 @@ _PYTHON_BUILD = is_python_build()
if _PYTHON_BUILD:
for scheme in ('posix_prefix', 'posix_home'):
- _INSTALL_SCHEMES[scheme]['include'] = '{projectbase}/Include'
- _INSTALL_SCHEMES[scheme]['platinclude'] = '{srcdir}'
-
-def _subst_vars(s, local_vars):
- try:
- return s % local_vars
- except KeyError:
- try:
- return s % os.environ
- except KeyError, var:
- raise AttributeError('%s' % var)
+ _SCHEMES.set(scheme, 'include', '{projectbase}/Include')
+ _SCHEMES.set(scheme, 'platinclude', '{srcdir}')
+
+_VAR_REPL = re.compile(r'\{(.*?)\}')
+
+def _subst_vars(path, local_vars):
+ # simple curly-braces replacement
+ def _replacer(matchobj):
+ name = matchobj.group(1)
+ if name in local_vars:
+ return local_vars[name]
+ elif name in os.environ:
+ return os.environ[name]
+ return matchobj.group(0)
+ return _VAR_REPL.sub(_replacer, path)
def _extend_dict(target_dict, other_dict):
target_keys = target_dict.keys()
@@ -130,7 +86,7 @@ def _expand_vars(scheme, vars):
vars = {}
_extend_dict(vars, get_config_vars())
- for key, value in _INSTALL_SCHEMES[scheme].items():
+ for key, value in _SCHEMES.items(scheme):
if os.name in ('posix', 'nt'):
value = os.path.expanduser(value)
res[key] = os.path.normpath(_subst_vars(value, vars))
@@ -352,13 +308,14 @@ def get_config_h_filename():
def get_scheme_names():
"""Returns a tuple containing the schemes names."""
- schemes = _INSTALL_SCHEMES.keys()
+ schemes = _SCHEMES.sections()
schemes.sort()
return tuple(schemes)
def get_path_names():
"""Returns a tuple containing the paths names."""
- return _SCHEME_KEYS
+ # xxx see if we want a static list
+ return _SCHEMES.options('posix_prefix')
def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
"""Returns a mapping containing an install scheme.
@@ -369,7 +326,7 @@ def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
if expand:
return _expand_vars(scheme, vars)
else:
- return _INSTALL_SCHEMES[scheme]
+ return dict(_SCHEMES.items(scheme))
def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
"""Returns a path corresponding to the scheme.
diff --git a/src/distutils2/_backport/tests/test_sysconfig.py b/src/distutils2/_backport/tests/test_sysconfig.py
index 3236cc4..1961991 100644
--- a/src/distutils2/_backport/tests/test_sysconfig.py
+++ b/src/distutils2/_backport/tests/test_sysconfig.py
@@ -14,7 +14,7 @@ from test.test_support import run_unittest, TESTFN
import distutils2._backport.sysconfig
from distutils2._backport.sysconfig import (get_paths, get_platform, get_config_vars,
- get_path, get_path_names, _INSTALL_SCHEMES,
+ get_path, get_path_names,
_get_default_scheme, _expand_vars,
get_scheme_names)
@@ -85,9 +85,6 @@ class TestSysConfig(unittest2.TestCase):
elif os.path.isdir(path):
shutil.rmtree(path)
- def test_get_path_names(self):
- self.assertEquals(get_path_names(), distutils2._backport.sysconfig._SCHEME_KEYS)
-
def test_get_paths(self):
scheme = get_paths()
default_scheme = _get_default_scheme()
@@ -98,12 +95,6 @@ class TestSysConfig(unittest2.TestCase):
scheme.sort()
self.assertEquals(scheme, wanted)
- def test_get_path(self):
- # 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.assertIsInstance(cvars, dict)
diff --git a/src/distutils2/command/install.py b/src/distutils2/command/install.py
index 94c1d1c..004dca8 100644
--- a/src/distutils2/command/install.py
+++ b/src/distutils2/command/install.py
@@ -6,11 +6,10 @@ __revision__ = "$Id: install.py 77949 2010-02-03 15:38:12Z tarek.ziade $"
import sys
import os
-try:
- from sysconfig import get_config_vars, get_paths, get_path, get_config_var
-except ImportError:
- from distutils2._backport.sysconfig import (get_config_vars, get_paths,
- get_path, get_config_var)
+
+from distutils2._backport import sysconfig
+from distutils2._backport.sysconfig import (get_config_vars, get_paths,
+ get_path, get_config_var)
from distutils2 import log
from distutils2.core import Command
@@ -20,96 +19,6 @@ from distutils2.util import write_file
from distutils2.util import convert_path, change_root, get_platform
from distutils2.errors import DistutilsOptionError
-# kept for backward compat, will be removed in 3.2
-if sys.version < "2.2":
- WINDOWS_SCHEME = {
- 'purelib': '$base',
- 'platlib': '$base',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- }
-else:
- WINDOWS_SCHEME = {
- 'purelib': '$base/Lib/site-packages',
- 'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- }
-
-INSTALL_SCHEMES = {
- 'unix_prefix': {
- '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',
- 'scripts': '$base/bin',
- 'data' : '$base',
- },
- 'unix_home': {
- 'purelib': '$base/lib/python',
- 'platlib': '$base/lib/python',
- 'headers': '$base/include/python/$dist_name',
- 'scripts': '$base/bin',
- 'data' : '$base',
- },
- 'unix_user': {
- 'purelib': '$usersite',
- 'platlib': '$usersite',
- 'headers': '$userbase/include/python$py_version_short/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- },
- 'nt': WINDOWS_SCHEME,
- 'nt_user': {
- 'purelib': '$usersite',
- 'platlib': '$usersite',
- 'headers': '$userbase/Python$py_version_nodot/Include/$dist_name',
- 'scripts': '$userbase/Scripts',
- 'data' : '$userbase',
- },
- 'mac': {
- 'purelib': '$base/Lib/site-packages',
- 'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- },
- 'mac_user': {
- 'purelib': '$usersite',
- 'platlib': '$usersite',
- 'headers': '$userbase/$py_version_short/include/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- },
- 'os2': {
- 'purelib': '$base/Lib/site-packages',
- 'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- },
- 'os2_home': {
- 'purelib': '$usersite',
- 'platlib': '$usersite',
- 'headers': '$userbase/include/python$py_version_short/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- },
- }
-
-SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data')
-# end of backward compat
-
-def _subst_vars(s, local_vars):
- try:
- return s % local_vars
- except KeyError:
- try:
- return s % os.environ
- except KeyError, var:
- raise AttributeError('%s' % var)
-
class install(Command):
description = "install everything from build directory"
@@ -502,7 +411,8 @@ class install(Command):
if val is not None:
if os.name == 'posix' or os.name == 'nt':
val = os.path.expanduser(val)
- val = _subst_vars(val, self.config_vars)
+ # see if we want to push this work in sysconfig XXX
+ val = sysconfig._subst_vars(val, self.config_vars)
setattr(self, attr, val)
def expand_basedirs(self):
diff --git a/src/distutils2/tests/test_install.py b/src/distutils2/tests/test_install.py
index 1e726d2..9f63abc 100644
--- a/src/distutils2/tests/test_install.py
+++ b/src/distutils2/tests/test_install.py
@@ -6,18 +6,13 @@ import sys
import unittest2
import site
-try:
- import sysconfig
- from sysconfig import (get_scheme_names, _CONFIG_VARS, _INSTALL_SCHEMES,
- get_config_var, get_path)
-except ImportError:
- from distutils2._backport import sysconfig
- from distutils2._backport.sysconfig import (get_scheme_names,
- get_config_vars,
- _INSTALL_SCHEMES,
- get_config_var, get_path)
-
- _CONFIG_VARS=get_config_vars()
+from distutils2._backport import sysconfig
+from distutils2._backport.sysconfig import (get_scheme_names,
+ get_config_vars,
+ _SCHEMES,
+ get_config_var, get_path)
+
+_CONFIG_VARS = get_config_vars()
from distutils2.tests import captured_stdout
@@ -48,23 +43,20 @@ class InstallTestCase(support.TempdirManager,
build_lib=os.path.join(builddir, "lib"),
)
+ old_posix_prefix = _SCHEMES.get('posix_prefix', 'platinclude')
+ old_posix_home = _SCHEMES.get('posix_home', 'platinclude')
+ new_path = '{platbase}/include/python{py_version_short}'
+ _SCHEMES.set('posix_prefix', 'platinclude', new_path)
+ _SCHEMES.set('posix_home', 'platinclude', '{platbase}/include/python')
- posix_prefix = _INSTALL_SCHEMES['posix_prefix']
- old_posix_prefix = posix_prefix['platinclude']
- posix_prefix['platinclude'] = \
- '%(platbase)s/include/python{py_version_short}'
-
- posix_home = _INSTALL_SCHEMES['posix_home']
- old_posix_home = posix_home['platinclude']
- posix_home['platinclude'] = '%(base)s/include/python'
try:
cmd = install(dist)
cmd.home = destination
cmd.ensure_finalized()
finally:
- posix_home['platinclude'] = old_posix_home
- posix_prefix['platinclude'] = old_posix_prefix
+ _SCHEMES.set('posix_prefix', 'platinclude', old_posix_prefix)
+ _SCHEMES.set('posix_home', 'platinclude', old_posix_home)
self.assertEqual(cmd.install_base, destination)
self.assertEqual(cmd.install_platbase, destination)
@@ -95,9 +87,8 @@ class InstallTestCase(support.TempdirManager,
self.user_base = os.path.join(self.tmpdir, 'B')
self.user_site = os.path.join(self.tmpdir, 'S')
_CONFIG_VARS['userbase'] = self.user_base
- scheme = _INSTALL_SCHEMES['%s_user' % os.name]
- scheme['purelib'] = self.user_site
-
+ scheme = '%s_user' % os.name
+ _SCHEMES.set(scheme, 'purelib', self.user_site)
def _expanduser(path):
if path[0] == '~':
path = os.path.normpath(self.tmpdir) + path[1:]
@@ -110,7 +101,7 @@ class InstallTestCase(support.TempdirManager,
self._test_user_site()
finally:
_CONFIG_VARS['userbase'] = self.old_user_base
- scheme['purelib'] = self.old_user_site
+ _SCHEMES.set(scheme, 'purelib', self.old_user_site)
os.path.expanduser = self.old_expand
def _test_user_site(self):
@@ -202,7 +193,6 @@ class InstallTestCase(support.TempdirManager,
cmd.root = install_dir
cmd.record = os.path.join(pkgdir, 'RECORD')
cmd.ensure_finalized()
-
cmd.run()
# let's check the RECORD file was created with one
diff --git a/src/distutils2/util.py b/src/distutils2/util.py
index 17f3881..5110697 100644
--- a/src/distutils2/util.py
+++ b/src/distutils2/util.py
@@ -14,10 +14,7 @@ from distutils2 import log
from distutils2.version import LooseVersion
from distutils2.errors import DistutilsByteCompileError
-try:
- _sysconfig = __import__('sysconfig') # from the standard lib
-except ImportError:
- from distutils2._backport import sysconfig as _sysconfig
+from distutils2._backport import sysconfig as _sysconfig
_PLATFORM = None