Skip to content

Commit

Permalink
Merge pull request #798 from Ivoz/python-config
Browse files Browse the repository at this point in the history
Add Python config
  • Loading branch information
Ivoz committed Sep 19, 2015
2 parents fb41d27 + 516d0f7 commit 013d880
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 13 deletions.
5 changes: 5 additions & 0 deletions docs/changes.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Release History
===============

13.2.0 (unreleased)
~~~~~~~~~~~~~~~~~~~

* Added support for ``python-config`` script

13.1.2 (2015-08-23)
~~~~~~~~~~~~~~~~~~~

Expand Down
64 changes: 51 additions & 13 deletions virtualenv.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
#!/usr/bin/env python
"""Create a "virtual" Python installation
"""

__version__ = "13.2.0.dev0"
virtualenv_version = __version__ # legacy
"""Create a "virtual" Python installation"""

import base64
import sys
Expand All @@ -13,15 +9,16 @@
import re
import shutil
import logging
import tempfile
import zlib
import errno
import glob
import distutils.sysconfig
from distutils.util import strtobool
import struct
import subprocess
import tarfile
from distutils.util import strtobool

__version__ = "13.2.0.dev0"
virtualenv_version = __version__ # legacy

if sys.version_info < (2, 6):
print('ERROR: %s' % sys.exc_info()[1])
Expand Down Expand Up @@ -76,7 +73,7 @@ def get_installed_pythons():
def get_installed_pythons():
try:
python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
"Software\\Python\\PythonCore")
"Software\\Python\\PythonCore")
except WindowsError:
# No registered Python installations
return {}
Expand Down Expand Up @@ -298,6 +295,7 @@ def get_installed_pythons():
# during the bootstrap
REQUIRED_MODULES.extend(['traceback', 'linecache'])


class Logger(object):

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

def debug(self, msg, *args, **kw):
self.log(self.DEBUG, msg, *args, **kw)

def info(self, msg, *args, **kw):
self.log(self.INFO, msg, *args, **kw)

def notify(self, msg, *args, **kw):
self.log(self.NOTIFY, msg, *args, **kw)

def warn(self, msg, *args, **kw):
self.log(self.WARN, msg, *args, **kw)

def error(self, msg, *args, **kw):
self.log(self.ERROR, msg, *args, **kw)

def fatal(self, msg, *args, **kw):
self.log(self.FATAL, msg, *args, **kw)

def log(self, level, msg, *args, **kw):
if args:
if kw:
Expand Down Expand Up @@ -1005,12 +1009,15 @@ def create_environment(home_dir, site_packages=False, clear=False,

install_activate(home_dir, bin_dir, prompt)

install_python_config(home_dir, bin_dir, prompt)

def is_executable_file(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

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


def install_activate(home_dir, bin_dir, prompt=None):
home_dir = os.path.abspath(home_dir)
if is_win or is_jython and os._name == 'nt':
files = {
'activate.bat': ACTIVATE_BAT,
Expand Down Expand Up @@ -1518,6 +1524,10 @@ def install_activate(home_dir, bin_dir, prompt=None):
files['activate.csh'] = ACTIVATE_CSH

files['activate_this.py'] = ACTIVATE_THIS

install_files(home_dir, bin_dir, prompt, files)

def install_files(home_dir, bin_dir, prompt, files):
if hasattr(home_dir, 'decode'):
home_dir = home_dir.decode(sys.getfilesystemencoding())
vname = os.path.basename(home_dir)
Expand All @@ -1529,6 +1539,15 @@ def install_activate(home_dir, bin_dir, prompt=None):
content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
writefile(os.path.join(bin_dir, name), content)

def install_python_config(home_dir, bin_dir, prompt=None):
if sys.platform == 'win32' or is_jython and os._name == 'nt':
files = {}
else:
files = {'python-config': PYTHON_CONFIG}
install_files(home_dir, bin_dir, prompt, files)
for name, content in files.items():
make_exe(os.path.join(bin_dir, name))

def install_distutils(home_dir):
distutils_path = change_prefix(distutils.__path__[0], home_dir)
mkdir(distutils_path)
Expand Down Expand Up @@ -2220,6 +2239,25 @@ def convert(s):
VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
""")

##file python-config
PYTHON_CONFIG = convert("""
eJyNVV1v2jAUfc+v8NoHJwJSur4hMYlusKIyqIB2rTpkpcQBT2kSOYaCuv73+dpJcDLSlZcY2/fc
c8/98OknQu6G0/ltb0T64ztCzgi5HI7JuPejL/8ke7GOI8tiz0nMBUr3ab5cUREnwjhYxlHAVpa1
9ULmE3mWoi56xAmnAdvhJsJ0R5etw18WLcONT1NYh+xJfZdB6K3kykKlHw797ADhNQ0TvJCMAnDq
bilPWRwRFgUx+tJF9kUTfXY6CsBg0gAqdCdoBLdb6SbIWHhPTEMv3kO8qEHUMfuMAyPLpwGiOybI
CxNrskm9FbWXsU+755k5wKfCp5y7L5wJap/cwqUOem2/ocfX87fFr+jEDWL+7Am70ACsPL7aPrYX
kvAf7P6OWWTjVgs3JBMkryP4ssig5zhO4REoKR6OZQm+11TgUhNJWMiSzqWrP3bh77wDDqVKBq5F
d0ua5Ol3ZSgx14jVyB2VoygWylftnWQvBZccigoCGkQvydbjNr7rT2fDyRg7ljyRO+9ctizpi6iE
QvHBQuljw0rF4YBOQEiXkFRRFVS2q02Pc1WZbEvGhuAVEwkIB90u4GaV3inymHAWKXVr4swMZOa0
/7AEZ3bPxzHBitQBywCgjMxGbLWyFnQOPgo5cWuIUaMifuKJtZ03M3aqrQvdW2+WhJ4oTBeFaSnw
jFCnBKz2XNXQvq3LwsZfB6Pe9xl23DQJZclnLXCQCaOsd5R1nRz5LJIr/x8t8nGhm8YTgoP45hyB
jjk4BjAtXahHKSihS75RgC3K1xsKW0U0Gl4a8dRemz3Mam6eIs/3kVhTpIvgTJpmQ/3efTjTCUFy
gDXR00Z2ahTuQX1pwCliqWxfAypde5z64J17fA96GaDu8ezlGpbTlw2GnP/NXr49vctRn8yuetP+
N1NxM2aXRSnlwm5DekYgpSHUzQgbGT/m5WF+NRkPpvJl+zmZXtc6qVTVaDi+HkymObP/Fhdg1PZw
5QE6MJBHRG++Owv793Myux0MhvdGkbHANJdZG8cRLQf3QfjZBFfjOlgej6ko/I7JJ9P9eIMAPafK
r/owlFmoNylDOM7j8BR/fDoWVfMXV3K1WQ==
""")

MH_MAGIC = 0xfeedface
MH_CIGAM = 0xcefaedfe
MH_MAGIC_64 = 0xfeedfacf
Expand Down Expand Up @@ -2362,6 +2400,6 @@ def do_file(file, offset=0, size=maxint):
if __name__ == '__main__':
main()

## TODO:
## Copy python.exe.manifest
## Monkeypatch distutils.sysconfig
# TODO:
# Copy python.exe.manifest
# Monkeypatch distutils.sysconfig
77 changes: 77 additions & 0 deletions virtualenv_embedded/python-config
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!__VIRTUAL_ENV__/__BIN_NAME__/python

import sys
import getopt
import sysconfig

valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
'ldflags', 'help']

if sys.version_info >= (3, 2):
valid_opts += ['extension-suffix', 'abiflags']
if sys.version_info >= (3, 3):
valid_opts += ['configdir']


def exit_with_usage(code=1):
sys.stderr.write("Usage: {0} [{1}]\n".format(
sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
sys.exit(code)

try:
opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
except getopt.error:
exit_with_usage()

if not opts:
exit_with_usage()

pyver = sysconfig.get_config_var('VERSION')
getvar = sysconfig.get_config_var

opt_flags = [flag for (flag, val) in opts]

if '--help' in opt_flags:
exit_with_usage(code=0)

for opt in opt_flags:
if opt == '--prefix':
print(sysconfig.get_config_var('prefix'))

elif opt == '--exec-prefix':
print(sysconfig.get_config_var('exec_prefix'))

elif opt in ('--includes', '--cflags'):
flags = ['-I' + sysconfig.get_path('include'),
'-I' + sysconfig.get_path('platinclude')]
if opt == '--cflags':
flags.extend(getvar('CFLAGS').split())
print(' '.join(flags))

elif opt in ('--libs', '--ldflags'):
abiflags = getattr(sys, 'abiflags', '')
libs = ['-lpython' + pyver + abiflags]
libs += getvar('LIBS').split()
libs += getvar('SYSLIBS').split()
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
libs.insert(0, '-L' + getvar('LIBPL'))
if not getvar('PYTHONFRAMEWORK'):
libs.extend(getvar('LINKFORSHARED').split())
print(' '.join(libs))

elif opt == '--extension-suffix':
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
if ext_suffix is None:
ext_suffix = sysconfig.get_config_var('SO')
print(ext_suffix)

elif opt == '--abiflags':
if not getattr(sys, 'abiflags', None):
exit_with_usage()
print(sys.abiflags)

elif opt == '--configdir':
print(sysconfig.get_config_var('LIBPL'))

0 comments on commit 013d880

Please sign in to comment.