[New-bugs-announce] [issue31114] 'make install' fails when exec_prefix is '/' and DESTDIR not empty
Xavier de Gaye
report at bugs.python.org
Thu Aug 3 13:40:40 EDT 2017
New submission from Xavier de Gaye:
The error messages:
error: could not create '/lib/python3.7': Permission denied
make: *** [Makefile:1449: sharedinstall] Error 1
The command that triggers this failure:
_PYTHON_PROJECT_BASE=/tmp/android-makesetup/build/python3.7-android-21-armv7 _PYTHON_HOST_PLATFORM=linux-arm PYTHONPATH=/tmp/android-makesetup/build/python3.7-android-21-armv7/build/lib.linux-arm-3.7:/src/python/master/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_m_linux_ python /src/python/master/setup.py install \
Note how some paths in the setup.py options start with two slashes.
The problem is that change_root() in Lib/distutils/util.py cannot concatenate 'root' with 'pathname' as 'pathname' starts with two slashes and therefore cannot be made relative by just removing one slash. The behavior of change_root() is correct (although it could be made more robust by calling os.path.normpath() first before removing the first slash) because according to POSIX a pathname starting with two slashes is implementation defined (but not when starting with three or more slashes). And normpath respects this rule:
>>> from os.path import normpath
However for most posix systems (possibly except Cygwin ?), a path starting with two slashes is the same path as the path starting with one slash.
The problem lies with the Makefile. A workaround for the user is to set the --exec-prefix option to '/./' instead of '/' when running configure and this fixes the problem, the installation is successfull. So a fix could be to swap '/' for '/./' in configure itself.
Maybe there is a better solution.
The changes made by this issue have excluded the case of '/' as there was a concern at that time that the sys.prefix value would be wrong. I have checked that sys.prefix is correct when '/' is changed to '/./' (on configure command line). This is because the determination of sys.prefix made by Lib/site.py is quite different now from what it was 10 years ago.
This is exactly the same issue as this one. I have preferred to open a new issue here because the discussion on issue 9674 is focused on making changes to distutils while the problem is actually in the posixly incorrect use of paths starting with double slashes in the Makefile.
title: 'make install' fails when exec_prefix is '/' and DESTDIR not empty
versions: Python 2.7, Python 3.5, Python 3.6, Python 3.7
Python tracker <report at bugs.python.org>
More information about the New-bugs-announce