Skip to content
Permalink
Browse files
build: remove dependency on distutils.spawn
Debian based packages of Python 3 do not include `distutils.spawn` and
require an additional apt package to be installed (`python3-distutils`).
Replace use of `distutils.spawn` with `shutil.which`, available in all
versions of Python currently allowed by our configure scripts.

For the `configure` script only, fall back to `distutils.spawn` to allow
friendlier error messages when run on older unsupported versions of
Python (e.g. 2.7).

`configure.py` also uses `distutils.version` -- this appears to be
available in Debian packaged Python 3 without installing
`python3-distutils` so has been left as-is.

PR-URL: #38600
Refs: #30189
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Christian Clauss <cclauss@me.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
richardlau authored and targos committed Jun 11, 2021
1 parent bac9ba4 commit 754aa384e0c686a4fac00900ef22b733b0533df0
Showing with 6 additions and 10 deletions.
  1. +0 −7 BUILDING.md
  2. +5 −2 configure
  3. +1 −1 configure.py
@@ -250,8 +250,6 @@ Installation via Linux package manager can be achieved with:

FreeBSD and OpenBSD users may also need to install `libexecinfo`.

Python 3 users may also need to install `python3-distutils`.

#### macOS prerequisites

* Xcode Command Line Tools >= 10 for macOS
@@ -277,11 +275,6 @@ $ ./configure
$ make -j4
```

If you run into a `No module named 'distutils.spawn'` error when executing
`./configure`, please try `python3 -m pip install --upgrade setuptools` or
`sudo apt install python3-distutils -y`.
For more information, see <https://github.com/nodejs/node/issues/30189>.

The `-j4` option will cause `make` to run 4 simultaneous compilation jobs which
may reduce build time. For more information, see the
[GNU Make Documentation](https://www.gnu.org/software/make/manual/html_node/Parallel.html).
@@ -18,7 +18,10 @@ exec python "$0" "$@"
del _

import sys
from distutils.spawn import find_executable
try:
from shutil import which
except ImportError:
from distutils.spawn import find_executable as which

print('Node.js configure: Found Python {0}.{1}.{2}...'.format(*sys.version_info))
acceptable_pythons = ((3, 9), (3, 8), (3, 7), (3, 6), (3, 5), (2, 7))
@@ -28,7 +31,7 @@ else:
python_cmds = ['python{0}.{1}'.format(*vers) for vers in acceptable_pythons]
sys.stderr.write('Please use {0}.\n'.format(' or '.join(python_cmds)))
for python_cmd in python_cmds:
python_cmd_path = find_executable(python_cmd)
python_cmd_path = which(python_cmd)
if python_cmd_path and 'pyenv/shims' not in python_cmd_path:
sys.stderr.write('\t{0} {1}\n'.format(python_cmd_path,
' '.join(sys.argv[:1])))
@@ -14,7 +14,7 @@
import bz2
import io

from distutils.spawn import find_executable as which
from shutil import which
from distutils.version import StrictVersion

# If not run from node/, cd to node/.

0 comments on commit 754aa38

Please sign in to comment.