bpo-1294959: Add sys.platlibdir attribute (GH-18381)
Add --with-platlibdir option to the configure script: name of the platform-specific library directory, stored in the new sys.platlitdir attribute. It is used to build the path of platform-specific dynamic libraries and the path of the standard library. It is equal to "lib" on most platforms. On Fedora and SuSE, it is equal to "lib64" on 64-bit systems. Co-Authored-By: Jan Matějek <jmatejek@suse.com> Co-Authored-By: Matěj Cepl <mcepl@cepl.eu> Co-Authored-By: Charalampos Stratakis <cstratak@redhat.com>
This commit is contained in:
parent
700cb58730
commit
8510f43078
|
@ -1138,6 +1138,27 @@ always available.
|
||||||
system's identity.
|
system's identity.
|
||||||
|
|
||||||
|
|
||||||
|
.. data:: platlibdir
|
||||||
|
|
||||||
|
Name of the platform-specific library directory. It is used to build the
|
||||||
|
path of platform-specific dynamic libraries and the path of the standard
|
||||||
|
library.
|
||||||
|
|
||||||
|
It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is equal
|
||||||
|
to ``"lib64"`` on 64-bit platforms which gives the following ``sys.path``
|
||||||
|
paths (where ``X.Y`` is the Python ``major.minor`` version):
|
||||||
|
|
||||||
|
* ``/usr/lib64/pythonX.Y/``:
|
||||||
|
Standard library (like ``os.py`` of the :mod:`os` module)
|
||||||
|
* ``/usr/lib64/pythonX.Y/lib-dynload/``:
|
||||||
|
C extension modules of the standard library (like the :mod:`errno` module,
|
||||||
|
the exact filename is platform specific)
|
||||||
|
* ``/usr/lib/pythonX.Y/site-packages`` (always use ``lib``, not
|
||||||
|
:data:`sys.platlibdir`): Third-party modules
|
||||||
|
|
||||||
|
.. versionadded:: 3.9
|
||||||
|
|
||||||
|
|
||||||
.. data:: prefix
|
.. data:: prefix
|
||||||
|
|
||||||
A string giving the site-specific directory prefix where the platform
|
A string giving the site-specific directory prefix where the platform
|
||||||
|
|
|
@ -353,6 +353,17 @@ finalization crashed with a Python fatal error if a daemon thread was still
|
||||||
running.
|
running.
|
||||||
(Contributed by Victor Stinner in :issue:`37266`.)
|
(Contributed by Victor Stinner in :issue:`37266`.)
|
||||||
|
|
||||||
|
sys
|
||||||
|
---
|
||||||
|
|
||||||
|
Add a new :attr:`sys.platlitdir` attribute: name of the platform-specific
|
||||||
|
library directory. It is used to build the path of platform-specific dynamic
|
||||||
|
libraries and the path of the standard library. It is equal to ``"lib"`` on
|
||||||
|
most platforms. On Fedora and SuSE, it is equal to ``"lib64"`` on 64-bit
|
||||||
|
platforms.
|
||||||
|
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in :issue:`1294959`.)
|
||||||
|
|
||||||
|
|
||||||
typing
|
typing
|
||||||
------
|
------
|
||||||
|
|
||||||
|
@ -390,6 +401,11 @@ Optimizations
|
||||||
Build and C API Changes
|
Build and C API Changes
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
* Add ``--with-platlibdir`` option to the ``configure`` script: name of the
|
||||||
|
platform-specific library directory, stored in the new :attr:`sys.platlitdir`
|
||||||
|
attribute. See :attr:`sys.platlibdir` attribute for more information.
|
||||||
|
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in :issue:`1294959`.)
|
||||||
|
|
||||||
* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API, which
|
* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API, which
|
||||||
calls a callable Python object without any arguments. It is the most efficient
|
calls a callable Python object without any arguments. It is the most efficient
|
||||||
way to call a callable Python object without any argument.
|
way to call a callable Python object without any argument.
|
||||||
|
|
|
@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
||||||
INSTALL_SCHEMES = {
|
INSTALL_SCHEMES = {
|
||||||
'unix_prefix': {
|
'unix_prefix': {
|
||||||
'purelib': '$base/lib/python$py_version_short/site-packages',
|
'purelib': '$base/lib/python$py_version_short/site-packages',
|
||||||
'platlib': '$platbase/lib/python$py_version_short/site-packages',
|
'platlib': '$platbase/$platlibdir/python$py_version_short/site-packages',
|
||||||
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
|
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
|
||||||
'scripts': '$base/bin',
|
'scripts': '$base/bin',
|
||||||
'data' : '$base',
|
'data' : '$base',
|
||||||
},
|
},
|
||||||
'unix_home': {
|
'unix_home': {
|
||||||
'purelib': '$base/lib/python',
|
'purelib': '$base/lib/python',
|
||||||
'platlib': '$base/lib/python',
|
'platlib': '$base/$platlibdir/python',
|
||||||
'headers': '$base/include/python/$dist_name',
|
'headers': '$base/include/python/$dist_name',
|
||||||
'scripts': '$base/bin',
|
'scripts': '$base/bin',
|
||||||
'data' : '$base',
|
'data' : '$base',
|
||||||
|
@ -298,6 +298,7 @@ class install(Command):
|
||||||
'sys_exec_prefix': exec_prefix,
|
'sys_exec_prefix': exec_prefix,
|
||||||
'exec_prefix': exec_prefix,
|
'exec_prefix': exec_prefix,
|
||||||
'abiflags': abiflags,
|
'abiflags': abiflags,
|
||||||
|
'platlibdir': sys.platlibdir,
|
||||||
}
|
}
|
||||||
|
|
||||||
if HAS_USER_SITE:
|
if HAS_USER_SITE:
|
||||||
|
|
|
@ -146,8 +146,15 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||||
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
||||||
|
|
||||||
if os.name == "posix":
|
if os.name == "posix":
|
||||||
libpython = os.path.join(prefix,
|
if plat_specific or standard_lib:
|
||||||
"lib", "python" + get_python_version())
|
# Platform-specific modules (any module from a non-pure-Python
|
||||||
|
# module distribution) or standard Python library modules.
|
||||||
|
libdir = sys.platlibdir
|
||||||
|
else:
|
||||||
|
# Pure Python
|
||||||
|
libdir = "lib"
|
||||||
|
libpython = os.path.join(prefix, libdir,
|
||||||
|
"python" + get_python_version())
|
||||||
if standard_lib:
|
if standard_lib:
|
||||||
return libpython
|
return libpython
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -58,7 +58,8 @@ class InstallTestCase(support.TempdirManager,
|
||||||
|
|
||||||
libdir = os.path.join(destination, "lib", "python")
|
libdir = os.path.join(destination, "lib", "python")
|
||||||
check_path(cmd.install_lib, libdir)
|
check_path(cmd.install_lib, libdir)
|
||||||
check_path(cmd.install_platlib, libdir)
|
platlibdir = os.path.join(destination, sys.platlibdir, "python")
|
||||||
|
check_path(cmd.install_platlib, platlibdir)
|
||||||
check_path(cmd.install_purelib, libdir)
|
check_path(cmd.install_purelib, libdir)
|
||||||
check_path(cmd.install_headers,
|
check_path(cmd.install_headers,
|
||||||
os.path.join(destination, "include", "python", "foopkg"))
|
os.path.join(destination, "include", "python", "foopkg"))
|
||||||
|
|
17
Lib/site.py
17
Lib/site.py
|
@ -334,13 +334,22 @@ def getsitepackages(prefixes=None):
|
||||||
continue
|
continue
|
||||||
seen.add(prefix)
|
seen.add(prefix)
|
||||||
|
|
||||||
|
libdirs = [sys.platlibdir]
|
||||||
|
if sys.platlibdir != "lib":
|
||||||
|
libdirs.append("lib")
|
||||||
|
|
||||||
if os.sep == '/':
|
if os.sep == '/':
|
||||||
sitepackages.append(os.path.join(prefix, "lib",
|
for libdir in libdirs:
|
||||||
"python%d.%d" % sys.version_info[:2],
|
path = os.path.join(prefix, libdir,
|
||||||
"site-packages"))
|
"python%d.%d" % sys.version_info[:2],
|
||||||
|
"site-packages")
|
||||||
|
sitepackages.append(path)
|
||||||
else:
|
else:
|
||||||
sitepackages.append(prefix)
|
sitepackages.append(prefix)
|
||||||
sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
|
|
||||||
|
for libdir in libdirs:
|
||||||
|
path = os.path.join(prefix, libdir, "site-packages")
|
||||||
|
sitepackages.append(path)
|
||||||
return sitepackages
|
return sitepackages
|
||||||
|
|
||||||
def addsitepackages(known_paths, prefixes=None):
|
def addsitepackages(known_paths, prefixes=None):
|
||||||
|
|
|
@ -20,10 +20,10 @@ __all__ = [
|
||||||
|
|
||||||
_INSTALL_SCHEMES = {
|
_INSTALL_SCHEMES = {
|
||||||
'posix_prefix': {
|
'posix_prefix': {
|
||||||
'stdlib': '{installed_base}/lib/python{py_version_short}',
|
'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}',
|
||||||
'platstdlib': '{platbase}/lib/python{py_version_short}',
|
'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}',
|
||||||
'purelib': '{base}/lib/python{py_version_short}/site-packages',
|
'purelib': '{base}/lib/python{py_version_short}/site-packages',
|
||||||
'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
|
'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages',
|
||||||
'include':
|
'include':
|
||||||
'{installed_base}/include/python{py_version_short}{abiflags}',
|
'{installed_base}/include/python{py_version_short}{abiflags}',
|
||||||
'platinclude':
|
'platinclude':
|
||||||
|
@ -62,10 +62,10 @@ _INSTALL_SCHEMES = {
|
||||||
'data': '{userbase}',
|
'data': '{userbase}',
|
||||||
},
|
},
|
||||||
'posix_user': {
|
'posix_user': {
|
||||||
'stdlib': '{userbase}/lib/python{py_version_short}',
|
'stdlib': '{userbase}/{platlibdir}/python{py_version_short}',
|
||||||
'platstdlib': '{userbase}/lib/python{py_version_short}',
|
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}',
|
||||||
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
|
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
|
||||||
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
|
'platlib': '{userbase}/{platlibdir}/python{py_version_short}/site-packages',
|
||||||
'include': '{userbase}/include/python{py_version_short}',
|
'include': '{userbase}/include/python{py_version_short}',
|
||||||
'scripts': '{userbase}/bin',
|
'scripts': '{userbase}/bin',
|
||||||
'data': '{userbase}',
|
'data': '{userbase}',
|
||||||
|
@ -539,6 +539,7 @@ def get_config_vars(*args):
|
||||||
_CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX
|
_CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX
|
||||||
_CONFIG_VARS['platbase'] = _EXEC_PREFIX
|
_CONFIG_VARS['platbase'] = _EXEC_PREFIX
|
||||||
_CONFIG_VARS['projectbase'] = _PROJECT_BASE
|
_CONFIG_VARS['projectbase'] = _PROJECT_BASE
|
||||||
|
_CONFIG_VARS['platlibdir'] = sys.platlibdir
|
||||||
try:
|
try:
|
||||||
_CONFIG_VARS['abiflags'] = sys.abiflags
|
_CONFIG_VARS['abiflags'] = sys.abiflags
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
|
@ -1068,11 +1068,11 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
ver = sys.version_info
|
ver = sys.version_info
|
||||||
return [
|
return [
|
||||||
os.path.join(prefix, 'lib',
|
os.path.join(prefix, sys.platlibdir,
|
||||||
f'python{ver.major}{ver.minor}.zip'),
|
f'python{ver.major}{ver.minor}.zip'),
|
||||||
os.path.join(prefix, 'lib',
|
os.path.join(prefix, sys.platlibdir,
|
||||||
f'python{ver.major}.{ver.minor}'),
|
f'python{ver.major}.{ver.minor}'),
|
||||||
os.path.join(exec_prefix, 'lib',
|
os.path.join(exec_prefix, sys.platlibdir,
|
||||||
f'python{ver.major}.{ver.minor}', 'lib-dynload'),
|
f'python{ver.major}.{ver.minor}', 'lib-dynload'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1183,7 +1183,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
|
|
||||||
if not MS_WINDOWS:
|
if not MS_WINDOWS:
|
||||||
lib_dynload = os.path.join(pyvenv_home,
|
lib_dynload = os.path.join(pyvenv_home,
|
||||||
'lib',
|
sys.platlibdir,
|
||||||
f'python{ver.major}.{ver.minor}',
|
f'python{ver.major}.{ver.minor}',
|
||||||
'lib-dynload')
|
'lib-dynload')
|
||||||
os.makedirs(lib_dynload)
|
os.makedirs(lib_dynload)
|
||||||
|
|
|
@ -266,11 +266,18 @@ class HelperFunctionsTests(unittest.TestCase):
|
||||||
dirs = site.getsitepackages()
|
dirs = site.getsitepackages()
|
||||||
if os.sep == '/':
|
if os.sep == '/':
|
||||||
# OS X, Linux, FreeBSD, etc
|
# OS X, Linux, FreeBSD, etc
|
||||||
self.assertEqual(len(dirs), 1)
|
if sys.platlibdir != "lib":
|
||||||
|
self.assertEqual(len(dirs), 2)
|
||||||
|
wanted = os.path.join('xoxo', sys.platlibdir,
|
||||||
|
'python%d.%d' % sys.version_info[:2],
|
||||||
|
'site-packages')
|
||||||
|
self.assertEqual(dirs[0], wanted)
|
||||||
|
else:
|
||||||
|
self.assertEqual(len(dirs), 1)
|
||||||
wanted = os.path.join('xoxo', 'lib',
|
wanted = os.path.join('xoxo', 'lib',
|
||||||
'python%d.%d' % sys.version_info[:2],
|
'python%d.%d' % sys.version_info[:2],
|
||||||
'site-packages')
|
'site-packages')
|
||||||
self.assertEqual(dirs[0], wanted)
|
self.assertEqual(dirs[-1], wanted)
|
||||||
else:
|
else:
|
||||||
# other platforms
|
# other platforms
|
||||||
self.assertEqual(len(dirs), 2)
|
self.assertEqual(len(dirs), 2)
|
||||||
|
|
|
@ -143,7 +143,8 @@ LIBDIR= @libdir@
|
||||||
MANDIR= @mandir@
|
MANDIR= @mandir@
|
||||||
INCLUDEDIR= @includedir@
|
INCLUDEDIR= @includedir@
|
||||||
CONFINCLUDEDIR= $(exec_prefix)/include
|
CONFINCLUDEDIR= $(exec_prefix)/include
|
||||||
SCRIPTDIR= $(prefix)/lib
|
PLATLIBDIR= @PLATLIBDIR@
|
||||||
|
SCRIPTDIR= $(prefix)/$(PLATLIBDIR)
|
||||||
ABIFLAGS= @ABIFLAGS@
|
ABIFLAGS= @ABIFLAGS@
|
||||||
|
|
||||||
# Detailed destination directories
|
# Detailed destination directories
|
||||||
|
@ -754,6 +755,7 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
|
||||||
-DEXEC_PREFIX='"$(exec_prefix)"' \
|
-DEXEC_PREFIX='"$(exec_prefix)"' \
|
||||||
-DVERSION='"$(VERSION)"' \
|
-DVERSION='"$(VERSION)"' \
|
||||||
-DVPATH='"$(VPATH)"' \
|
-DVPATH='"$(VPATH)"' \
|
||||||
|
-DPLATLIBDIR='"$(PLATLIBDIR)"' \
|
||||||
-o $@ $(srcdir)/Modules/getpath.c
|
-o $@ $(srcdir)/Modules/getpath.c
|
||||||
|
|
||||||
Programs/python.o: $(srcdir)/Programs/python.c
|
Programs/python.o: $(srcdir)/Programs/python.c
|
||||||
|
@ -785,6 +787,7 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile
|
||||||
Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h
|
Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h
|
||||||
$(CC) -c $(PY_CORE_CFLAGS) \
|
$(CC) -c $(PY_CORE_CFLAGS) \
|
||||||
-DABIFLAGS='"$(ABIFLAGS)"' \
|
-DABIFLAGS='"$(ABIFLAGS)"' \
|
||||||
|
-DPLATLIBDIR='"$(PLATLIBDIR)"' \
|
||||||
$(MULTIARCH_CPPFLAGS) \
|
$(MULTIARCH_CPPFLAGS) \
|
||||||
-o $@ $(srcdir)/Python/sysmodule.c
|
-o $@ $(srcdir)/Python/sysmodule.c
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
Add ``--with-platlibdir`` option to the configure script: name of the
|
||||||
|
platform-specific library directory, stored in the new :attr:`sys.platlitdir`
|
||||||
|
attribute. It is used to build the path of platform-specific dynamic libraries
|
||||||
|
and the path of the standard library. It is equal to ``"lib"`` on most
|
||||||
|
platforms. On Fedora and SuSE, it is equal to ``"lib64"`` on 64-bit platforms.
|
||||||
|
Patch by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner.
|
|
@ -105,8 +105,9 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH)
|
#if (!defined(PREFIX) || !defined(EXEC_PREFIX) \
|
||||||
#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
|
|| !defined(VERSION) || !defined(VPATH) || !defined(PLATLIBDIR))
|
||||||
|
#error "PREFIX, EXEC_PREFIX, VERSION, VPATH and PLATLIBDIR macros must be defined"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LANDMARK
|
#ifndef LANDMARK
|
||||||
|
@ -128,6 +129,7 @@ typedef struct {
|
||||||
wchar_t *pythonpath_macro; /* PYTHONPATH macro */
|
wchar_t *pythonpath_macro; /* PYTHONPATH macro */
|
||||||
wchar_t *prefix_macro; /* PREFIX macro */
|
wchar_t *prefix_macro; /* PREFIX macro */
|
||||||
wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */
|
wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */
|
||||||
|
wchar_t *platlibdir_macro; /* PLATLIBDIR macro */
|
||||||
wchar_t *vpath_macro; /* VPATH macro */
|
wchar_t *vpath_macro; /* VPATH macro */
|
||||||
|
|
||||||
wchar_t *lib_python; /* "lib/pythonX.Y" */
|
wchar_t *lib_python; /* "lib/pythonX.Y" */
|
||||||
|
@ -809,8 +811,17 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig)
|
||||||
"Could not find platform dependent libraries <exec_prefix>\n");
|
"Could not find platform dependent libraries <exec_prefix>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* <PLATLIBDIR> / "lib-dynload" */
|
||||||
|
wchar_t *lib_dynload = joinpath2(calculate->platlibdir_macro,
|
||||||
|
L"lib-dynload");
|
||||||
|
if (lib_dynload == NULL) {
|
||||||
|
return _PyStatus_NO_MEMORY();
|
||||||
|
}
|
||||||
|
|
||||||
calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro,
|
calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro,
|
||||||
L"lib/lib-dynload");
|
lib_dynload);
|
||||||
|
PyMem_RawFree(lib_dynload);
|
||||||
|
|
||||||
if (calculate->exec_prefix == NULL) {
|
if (calculate->exec_prefix == NULL) {
|
||||||
return _PyStatus_NO_MEMORY();
|
return _PyStatus_NO_MEMORY();
|
||||||
}
|
}
|
||||||
|
@ -1284,27 +1295,35 @@ calculate_read_pyenv(PyCalculatePath *calculate)
|
||||||
static PyStatus
|
static PyStatus
|
||||||
calculate_zip_path(PyCalculatePath *calculate)
|
calculate_zip_path(PyCalculatePath *calculate)
|
||||||
{
|
{
|
||||||
const wchar_t *lib_python = L"lib/python00.zip";
|
PyStatus res;
|
||||||
|
|
||||||
|
/* Path: <PLATLIBDIR> / "python00.zip" */
|
||||||
|
wchar_t *path = joinpath2(calculate->platlibdir_macro, L"python00.zip");
|
||||||
|
if (path == NULL) {
|
||||||
|
return _PyStatus_NO_MEMORY();
|
||||||
|
}
|
||||||
|
|
||||||
if (calculate->prefix_found > 0) {
|
if (calculate->prefix_found > 0) {
|
||||||
/* Use the reduced prefix returned by Py_GetPrefix()
|
/* Use the reduced prefix returned by Py_GetPrefix()
|
||||||
|
|
||||||
Path: <basename(basename(prefix))> / <lib_python> */
|
Path: <basename(basename(prefix))> / <PLATLIBDIR> / "python00.zip" */
|
||||||
wchar_t *parent = _PyMem_RawWcsdup(calculate->prefix);
|
wchar_t *parent = _PyMem_RawWcsdup(calculate->prefix);
|
||||||
if (parent == NULL) {
|
if (parent == NULL) {
|
||||||
return _PyStatus_NO_MEMORY();
|
res = _PyStatus_NO_MEMORY();
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
reduce(parent);
|
reduce(parent);
|
||||||
reduce(parent);
|
reduce(parent);
|
||||||
calculate->zip_path = joinpath2(parent, lib_python);
|
calculate->zip_path = joinpath2(parent, path);
|
||||||
PyMem_RawFree(parent);
|
PyMem_RawFree(parent);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
calculate->zip_path = joinpath2(calculate->prefix_macro, lib_python);
|
calculate->zip_path = joinpath2(calculate->prefix_macro, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (calculate->zip_path == NULL) {
|
if (calculate->zip_path == NULL) {
|
||||||
return _PyStatus_NO_MEMORY();
|
res = _PyStatus_NO_MEMORY();
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace "00" with version */
|
/* Replace "00" with version */
|
||||||
|
@ -1312,7 +1331,11 @@ calculate_zip_path(PyCalculatePath *calculate)
|
||||||
calculate->zip_path[len - 6] = VERSION[0];
|
calculate->zip_path[len - 6] = VERSION[0];
|
||||||
calculate->zip_path[len - 5] = VERSION[2];
|
calculate->zip_path[len - 5] = VERSION[2];
|
||||||
|
|
||||||
return _PyStatus_OK();
|
res = _PyStatus_OK();
|
||||||
|
|
||||||
|
done:
|
||||||
|
PyMem_RawFree(path);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1434,10 +1457,14 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config)
|
||||||
if (!calculate->vpath_macro) {
|
if (!calculate->vpath_macro) {
|
||||||
return DECODE_LOCALE_ERR("VPATH macro", len);
|
return DECODE_LOCALE_ERR("VPATH macro", len);
|
||||||
}
|
}
|
||||||
|
calculate->platlibdir_macro = Py_DecodeLocale(PLATLIBDIR, &len);
|
||||||
|
if (!calculate->platlibdir_macro) {
|
||||||
|
return DECODE_LOCALE_ERR("PLATLIBDIR macro", len);
|
||||||
|
}
|
||||||
|
|
||||||
calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
calculate->lib_python = Py_DecodeLocale(PLATLIBDIR "/python" VERSION, &len);
|
||||||
if (!calculate->lib_python) {
|
if (!calculate->lib_python) {
|
||||||
return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len);
|
return DECODE_LOCALE_ERR("VERSION macro", len);
|
||||||
}
|
}
|
||||||
|
|
||||||
calculate->warnings = config->pathconfig_warnings;
|
calculate->warnings = config->pathconfig_warnings;
|
||||||
|
@ -1454,6 +1481,7 @@ calculate_free(PyCalculatePath *calculate)
|
||||||
PyMem_RawFree(calculate->prefix_macro);
|
PyMem_RawFree(calculate->prefix_macro);
|
||||||
PyMem_RawFree(calculate->exec_prefix_macro);
|
PyMem_RawFree(calculate->exec_prefix_macro);
|
||||||
PyMem_RawFree(calculate->vpath_macro);
|
PyMem_RawFree(calculate->vpath_macro);
|
||||||
|
PyMem_RawFree(calculate->platlibdir_macro);
|
||||||
PyMem_RawFree(calculate->lib_python);
|
PyMem_RawFree(calculate->lib_python);
|
||||||
PyMem_RawFree(calculate->path_env);
|
PyMem_RawFree(calculate->path_env);
|
||||||
PyMem_RawFree(calculate->zip_path);
|
PyMem_RawFree(calculate->zip_path);
|
||||||
|
|
|
@ -683,4 +683,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
|
||||||
/* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */
|
/* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */
|
||||||
#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1
|
#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1
|
||||||
|
|
||||||
|
#define PLATLIBDIR "lib"
|
||||||
|
|
||||||
#endif /* !Py_CONFIG_H */
|
#endif /* !Py_CONFIG_H */
|
||||||
|
|
|
@ -2739,8 +2739,6 @@ err_occurred:
|
||||||
return _PyStatus_ERR("can't initialize sys module");
|
return _PyStatus_ERR("can't initialize sys module");
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef SET_SYS_FROM_STRING
|
|
||||||
|
|
||||||
/* Updating the sys namespace, returning integer error codes */
|
/* Updating the sys namespace, returning integer error codes */
|
||||||
#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
|
#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -2844,6 +2842,13 @@ _PySys_InitMain(PyThreadState *tstate)
|
||||||
SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
|
SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
|
||||||
SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
|
SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
|
||||||
SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
|
SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
|
||||||
|
{
|
||||||
|
PyObject *str = PyUnicode_FromString(PLATLIBDIR);
|
||||||
|
if (str == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
SET_SYS_FROM_STRING("platlibdir", str);
|
||||||
|
}
|
||||||
|
|
||||||
if (config->pycache_prefix != NULL) {
|
if (config->pycache_prefix != NULL) {
|
||||||
SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
|
SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
|
||||||
|
@ -2864,6 +2869,7 @@ _PySys_InitMain(PyThreadState *tstate)
|
||||||
#undef COPY_LIST
|
#undef COPY_LIST
|
||||||
#undef SET_SYS_FROM_WSTR
|
#undef SET_SYS_FROM_WSTR
|
||||||
|
|
||||||
|
|
||||||
/* Set flags to their final values */
|
/* Set flags to their final values */
|
||||||
SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
|
SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
|
||||||
/* prevent user from creating new instances */
|
/* prevent user from creating new instances */
|
||||||
|
@ -2897,6 +2903,7 @@ err_occurred:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef SET_SYS_FROM_STRING
|
||||||
#undef SET_SYS_FROM_STRING_BORROW
|
#undef SET_SYS_FROM_STRING_BORROW
|
||||||
#undef SET_SYS_FROM_STRING_INT_RESULT
|
#undef SET_SYS_FROM_STRING_INT_RESULT
|
||||||
|
|
||||||
|
|
|
@ -631,6 +631,7 @@ SRCDIRS
|
||||||
THREADHEADERS
|
THREADHEADERS
|
||||||
LIBPL
|
LIBPL
|
||||||
PY_ENABLE_SHARED
|
PY_ENABLE_SHARED
|
||||||
|
PLATLIBDIR
|
||||||
LIBPYTHON
|
LIBPYTHON
|
||||||
EXT_SUFFIX
|
EXT_SUFFIX
|
||||||
ALT_SOABI
|
ALT_SOABI
|
||||||
|
@ -782,7 +783,6 @@ infodir
|
||||||
docdir
|
docdir
|
||||||
oldincludedir
|
oldincludedir
|
||||||
includedir
|
includedir
|
||||||
runstatedir
|
|
||||||
localstatedir
|
localstatedir
|
||||||
sharedstatedir
|
sharedstatedir
|
||||||
sysconfdir
|
sysconfdir
|
||||||
|
@ -840,6 +840,7 @@ with_dtrace
|
||||||
with_libm
|
with_libm
|
||||||
with_libc
|
with_libc
|
||||||
enable_big_digits
|
enable_big_digits
|
||||||
|
with_platlibdir
|
||||||
with_computed_gotos
|
with_computed_gotos
|
||||||
with_ensurepip
|
with_ensurepip
|
||||||
with_openssl
|
with_openssl
|
||||||
|
@ -897,7 +898,6 @@ datadir='${datarootdir}'
|
||||||
sysconfdir='${prefix}/etc'
|
sysconfdir='${prefix}/etc'
|
||||||
sharedstatedir='${prefix}/com'
|
sharedstatedir='${prefix}/com'
|
||||||
localstatedir='${prefix}/var'
|
localstatedir='${prefix}/var'
|
||||||
runstatedir='${localstatedir}/run'
|
|
||||||
includedir='${prefix}/include'
|
includedir='${prefix}/include'
|
||||||
oldincludedir='/usr/include'
|
oldincludedir='/usr/include'
|
||||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
||||||
|
@ -1150,15 +1150,6 @@ do
|
||||||
| -silent | --silent | --silen | --sile | --sil)
|
| -silent | --silent | --silen | --sile | --sil)
|
||||||
silent=yes ;;
|
silent=yes ;;
|
||||||
|
|
||||||
-runstatedir | --runstatedir | --runstatedi | --runstated \
|
|
||||||
| --runstate | --runstat | --runsta | --runst | --runs \
|
|
||||||
| --run | --ru | --r)
|
|
||||||
ac_prev=runstatedir ;;
|
|
||||||
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
|
|
||||||
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
|
|
||||||
| --run=* | --ru=* | --r=*)
|
|
||||||
runstatedir=$ac_optarg ;;
|
|
||||||
|
|
||||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||||
ac_prev=sbindir ;;
|
ac_prev=sbindir ;;
|
||||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||||
|
@ -1296,7 +1287,7 @@ fi
|
||||||
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
||||||
datadir sysconfdir sharedstatedir localstatedir includedir \
|
datadir sysconfdir sharedstatedir localstatedir includedir \
|
||||||
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
||||||
libdir localedir mandir runstatedir
|
libdir localedir mandir
|
||||||
do
|
do
|
||||||
eval ac_val=\$$ac_var
|
eval ac_val=\$$ac_var
|
||||||
# Remove trailing slashes.
|
# Remove trailing slashes.
|
||||||
|
@ -1449,7 +1440,6 @@ Fine tuning of the installation directories:
|
||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||||
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
|
|
||||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||||
--includedir=DIR C header files [PREFIX/include]
|
--includedir=DIR C header files [PREFIX/include]
|
||||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||||
|
@ -1571,6 +1561,8 @@ Optional Packages:
|
||||||
system-dependent)
|
system-dependent)
|
||||||
--with-libc=STRING override libc C library to STRING (default is
|
--with-libc=STRING override libc C library to STRING (default is
|
||||||
system-dependent)
|
system-dependent)
|
||||||
|
--with-platlibdir=DIRNAME
|
||||||
|
Python library directory name (default is "lib")
|
||||||
--with-computed-gotos enable computed gotos in evaluation loop (enabled by
|
--with-computed-gotos enable computed gotos in evaluation loop (enabled by
|
||||||
default on supported compilers)
|
default on supported compilers)
|
||||||
--with-ensurepip[=install|upgrade|no]
|
--with-ensurepip[=install|upgrade|no]
|
||||||
|
@ -15258,10 +15250,41 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test x$PLATFORM_TRIPLET = x; then
|
# Check for --with-libdir-name
|
||||||
LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
# /usr/$LIDIRNAME/python$VERSION
|
||||||
|
|
||||||
|
PLATLIBDIR="lib"
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-platlibdir" >&5
|
||||||
|
$as_echo_n "checking for --with-platlibdir... " >&6; }
|
||||||
|
|
||||||
|
# Check whether --with-platlibdir was given.
|
||||||
|
if test "${with_platlibdir+set}" = set; then :
|
||||||
|
withval=$with_platlibdir;
|
||||||
|
# ignore 3 options:
|
||||||
|
# --with-platlibdir
|
||||||
|
# --with-platlibdir=
|
||||||
|
# --without-platlibdir
|
||||||
|
if test -n "$withval" -a "$withval" != yes -a "$withval" != no
|
||||||
|
then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
PLATLIBDIR="$withval"
|
||||||
else
|
else
|
||||||
LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
28
configure.ac
28
configure.ac
|
@ -4723,12 +4723,36 @@ else
|
||||||
LIBPYTHON=''
|
LIBPYTHON=''
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check for --with-libdir-name
|
||||||
|
# /usr/$LIDIRNAME/python$VERSION
|
||||||
|
AC_SUBST(PLATLIBDIR)
|
||||||
|
PLATLIBDIR="lib"
|
||||||
|
AC_MSG_CHECKING(for --with-platlibdir)
|
||||||
|
AC_ARG_WITH(platlibdir,
|
||||||
|
AS_HELP_STRING([--with-platlibdir=DIRNAME],
|
||||||
|
[Python library directory name (default is "lib")]),
|
||||||
|
[
|
||||||
|
# ignore 3 options:
|
||||||
|
# --with-platlibdir
|
||||||
|
# --with-platlibdir=
|
||||||
|
# --without-platlibdir
|
||||||
|
if test -n "$withval" -a "$withval" != yes -a "$withval" != no
|
||||||
|
then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
PLATLIBDIR="$withval"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi],
|
||||||
|
[AC_MSG_RESULT(no)])
|
||||||
|
|
||||||
|
|
||||||
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
|
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
|
||||||
AC_SUBST(PY_ENABLE_SHARED)
|
AC_SUBST(PY_ENABLE_SHARED)
|
||||||
if test x$PLATFORM_TRIPLET = x; then
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}"
|
||||||
else
|
else
|
||||||
LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(LIBPL)
|
AC_SUBST(LIBPL)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue