Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Python config #798

Merged
merged 6 commits into from
Sep 19, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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'))