Skip to content

Commit 013d880

Browse files
committed
Merge pull request pypa#798 from Ivoz/python-config
Add Python config
2 parents fb41d27 + 516d0f7 commit 013d880

File tree

3 files changed

+133
-13
lines changed

3 files changed

+133
-13
lines changed

docs/changes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Release History
22
===============
33

4+
13.2.0 (unreleased)
5+
~~~~~~~~~~~~~~~~~~~
6+
7+
* Added support for ``python-config`` script
8+
49
13.1.2 (2015-08-23)
510
~~~~~~~~~~~~~~~~~~~
611

virtualenv.py

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
#!/usr/bin/env python
2-
"""Create a "virtual" Python installation
3-
"""
4-
5-
__version__ = "13.2.0.dev0"
6-
virtualenv_version = __version__ # legacy
2+
"""Create a "virtual" Python installation"""
73

84
import base64
95
import sys
@@ -13,15 +9,16 @@
139
import re
1410
import shutil
1511
import logging
16-
import tempfile
1712
import zlib
1813
import errno
1914
import glob
2015
import distutils.sysconfig
21-
from distutils.util import strtobool
2216
import struct
2317
import subprocess
24-
import tarfile
18+
from distutils.util import strtobool
19+
20+
__version__ = "13.2.0.dev0"
21+
virtualenv_version = __version__ # legacy
2522

2623
if sys.version_info < (2, 6):
2724
print('ERROR: %s' % sys.exc_info()[1])
@@ -76,7 +73,7 @@ def get_installed_pythons():
7673
def get_installed_pythons():
7774
try:
7875
python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
79-
"Software\\Python\\PythonCore")
76+
"Software\\Python\\PythonCore")
8077
except WindowsError:
8178
# No registered Python installations
8279
return {}
@@ -298,6 +295,7 @@ def get_installed_pythons():
298295
# during the bootstrap
299296
REQUIRED_MODULES.extend(['traceback', 'linecache'])
300297

298+
301299
class Logger(object):
302300

303301
"""
@@ -322,16 +320,22 @@ def __init__(self, consumers):
322320

323321
def debug(self, msg, *args, **kw):
324322
self.log(self.DEBUG, msg, *args, **kw)
323+
325324
def info(self, msg, *args, **kw):
326325
self.log(self.INFO, msg, *args, **kw)
326+
327327
def notify(self, msg, *args, **kw):
328328
self.log(self.NOTIFY, msg, *args, **kw)
329+
329330
def warn(self, msg, *args, **kw):
330331
self.log(self.WARN, msg, *args, **kw)
332+
331333
def error(self, msg, *args, **kw):
332334
self.log(self.ERROR, msg, *args, **kw)
335+
333336
def fatal(self, msg, *args, **kw):
334337
self.log(self.FATAL, msg, *args, **kw)
338+
335339
def log(self, level, msg, *args, **kw):
336340
if args:
337341
if kw:
@@ -1005,12 +1009,15 @@ def create_environment(home_dir, site_packages=False, clear=False,
10051009

10061010
install_activate(home_dir, bin_dir, prompt)
10071011

1012+
install_python_config(home_dir, bin_dir, prompt)
1013+
10081014
def is_executable_file(fpath):
10091015
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
10101016

10111017
def path_locations(home_dir):
10121018
"""Return the path locations for the environment (where libraries are,
10131019
where scripts go, etc)"""
1020+
home_dir = os.path.abspath(home_dir)
10141021
# XXX: We'd use distutils.sysconfig.get_python_inc/lib but its
10151022
# prefix arg is broken: http://bugs.python.org/issue3386
10161023
if is_win:
@@ -1490,7 +1497,6 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
14901497

14911498

14921499
def install_activate(home_dir, bin_dir, prompt=None):
1493-
home_dir = os.path.abspath(home_dir)
14941500
if is_win or is_jython and os._name == 'nt':
14951501
files = {
14961502
'activate.bat': ACTIVATE_BAT,
@@ -1518,6 +1524,10 @@ def install_activate(home_dir, bin_dir, prompt=None):
15181524
files['activate.csh'] = ACTIVATE_CSH
15191525

15201526
files['activate_this.py'] = ACTIVATE_THIS
1527+
1528+
install_files(home_dir, bin_dir, prompt, files)
1529+
1530+
def install_files(home_dir, bin_dir, prompt, files):
15211531
if hasattr(home_dir, 'decode'):
15221532
home_dir = home_dir.decode(sys.getfilesystemencoding())
15231533
vname = os.path.basename(home_dir)
@@ -1529,6 +1539,15 @@ def install_activate(home_dir, bin_dir, prompt=None):
15291539
content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
15301540
writefile(os.path.join(bin_dir, name), content)
15311541

1542+
def install_python_config(home_dir, bin_dir, prompt=None):
1543+
if sys.platform == 'win32' or is_jython and os._name == 'nt':
1544+
files = {}
1545+
else:
1546+
files = {'python-config': PYTHON_CONFIG}
1547+
install_files(home_dir, bin_dir, prompt, files)
1548+
for name, content in files.items():
1549+
make_exe(os.path.join(bin_dir, name))
1550+
15321551
def install_distutils(home_dir):
15331552
distutils_path = change_prefix(distutils.__path__[0], home_dir)
15341553
mkdir(distutils_path)
@@ -2220,6 +2239,25 @@ def convert(s):
22202239
VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
22212240
""")
22222241

2242+
##file python-config
2243+
PYTHON_CONFIG = convert("""
2244+
eJyNVV1v2jAUfc+v8NoHJwJSur4hMYlusKIyqIB2rTpkpcQBT2kSOYaCuv73+dpJcDLSlZcY2/fc
2245+
c8/98OknQu6G0/ltb0T64ztCzgi5HI7JuPejL/8ke7GOI8tiz0nMBUr3ab5cUREnwjhYxlHAVpa1
2246+
9ULmE3mWoi56xAmnAdvhJsJ0R5etw18WLcONT1NYh+xJfZdB6K3kykKlHw797ADhNQ0TvJCMAnDq
2247+
bilPWRwRFgUx+tJF9kUTfXY6CsBg0gAqdCdoBLdb6SbIWHhPTEMv3kO8qEHUMfuMAyPLpwGiOybI
2248+
CxNrskm9FbWXsU+755k5wKfCp5y7L5wJap/cwqUOem2/ocfX87fFr+jEDWL+7Am70ACsPL7aPrYX
2249+
kvAf7P6OWWTjVgs3JBMkryP4ssig5zhO4REoKR6OZQm+11TgUhNJWMiSzqWrP3bh77wDDqVKBq5F
2250+
d0ua5Ol3ZSgx14jVyB2VoygWylftnWQvBZccigoCGkQvydbjNr7rT2fDyRg7ljyRO+9ctizpi6iE
2251+
QvHBQuljw0rF4YBOQEiXkFRRFVS2q02Pc1WZbEvGhuAVEwkIB90u4GaV3inymHAWKXVr4swMZOa0
2252+
/7AEZ3bPxzHBitQBywCgjMxGbLWyFnQOPgo5cWuIUaMifuKJtZ03M3aqrQvdW2+WhJ4oTBeFaSnw
2253+
jFCnBKz2XNXQvq3LwsZfB6Pe9xl23DQJZclnLXCQCaOsd5R1nRz5LJIr/x8t8nGhm8YTgoP45hyB
2254+
jjk4BjAtXahHKSihS75RgC3K1xsKW0U0Gl4a8dRemz3Mam6eIs/3kVhTpIvgTJpmQ/3efTjTCUFy
2255+
gDXR00Z2ahTuQX1pwCliqWxfAypde5z64J17fA96GaDu8ezlGpbTlw2GnP/NXr49vctRn8yuetP+
2256+
N1NxM2aXRSnlwm5DekYgpSHUzQgbGT/m5WF+NRkPpvJl+zmZXtc6qVTVaDi+HkymObP/Fhdg1PZw
2257+
5QE6MJBHRG++Owv793Myux0MhvdGkbHANJdZG8cRLQf3QfjZBFfjOlgej6ko/I7JJ9P9eIMAPafK
2258+
r/owlFmoNylDOM7j8BR/fDoWVfMXV3K1WQ==
2259+
""")
2260+
22232261
MH_MAGIC = 0xfeedface
22242262
MH_CIGAM = 0xcefaedfe
22252263
MH_MAGIC_64 = 0xfeedfacf
@@ -2362,6 +2400,6 @@ def do_file(file, offset=0, size=maxint):
23622400
if __name__ == '__main__':
23632401
main()
23642402

2365-
## TODO:
2366-
## Copy python.exe.manifest
2367-
## Monkeypatch distutils.sysconfig
2403+
# TODO:
2404+
# Copy python.exe.manifest
2405+
# Monkeypatch distutils.sysconfig

virtualenv_embedded/python-config

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!__VIRTUAL_ENV__/__BIN_NAME__/python
2+
3+
import sys
4+
import getopt
5+
import sysconfig
6+
7+
valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
8+
'ldflags', 'help']
9+
10+
if sys.version_info >= (3, 2):
11+
valid_opts += ['extension-suffix', 'abiflags']
12+
if sys.version_info >= (3, 3):
13+
valid_opts += ['configdir']
14+
15+
16+
def exit_with_usage(code=1):
17+
sys.stderr.write("Usage: {0} [{1}]\n".format(
18+
sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
19+
sys.exit(code)
20+
21+
try:
22+
opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
23+
except getopt.error:
24+
exit_with_usage()
25+
26+
if not opts:
27+
exit_with_usage()
28+
29+
pyver = sysconfig.get_config_var('VERSION')
30+
getvar = sysconfig.get_config_var
31+
32+
opt_flags = [flag for (flag, val) in opts]
33+
34+
if '--help' in opt_flags:
35+
exit_with_usage(code=0)
36+
37+
for opt in opt_flags:
38+
if opt == '--prefix':
39+
print(sysconfig.get_config_var('prefix'))
40+
41+
elif opt == '--exec-prefix':
42+
print(sysconfig.get_config_var('exec_prefix'))
43+
44+
elif opt in ('--includes', '--cflags'):
45+
flags = ['-I' + sysconfig.get_path('include'),
46+
'-I' + sysconfig.get_path('platinclude')]
47+
if opt == '--cflags':
48+
flags.extend(getvar('CFLAGS').split())
49+
print(' '.join(flags))
50+
51+
elif opt in ('--libs', '--ldflags'):
52+
abiflags = getattr(sys, 'abiflags', '')
53+
libs = ['-lpython' + pyver + abiflags]
54+
libs += getvar('LIBS').split()
55+
libs += getvar('SYSLIBS').split()
56+
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
57+
# shared library in prefix/lib/.
58+
if opt == '--ldflags':
59+
if not getvar('Py_ENABLE_SHARED'):
60+
libs.insert(0, '-L' + getvar('LIBPL'))
61+
if not getvar('PYTHONFRAMEWORK'):
62+
libs.extend(getvar('LINKFORSHARED').split())
63+
print(' '.join(libs))
64+
65+
elif opt == '--extension-suffix':
66+
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
67+
if ext_suffix is None:
68+
ext_suffix = sysconfig.get_config_var('SO')
69+
print(ext_suffix)
70+
71+
elif opt == '--abiflags':
72+
if not getattr(sys, 'abiflags', None):
73+
exit_with_usage()
74+
print(sys.abiflags)
75+
76+
elif opt == '--configdir':
77+
print(sysconfig.get_config_var('LIBPL'))

0 commit comments

Comments
 (0)