2021-12-07 10:28:47 +00:00
|
|
|
# Compile Python
|
|
|
|
|
|
|
|
This is a small bash script to compile one or multiple Python versions.
|
|
|
|
|
|
|
|
I use it on my laptop, using Debian, but it may work on other distribs.
|
|
|
|
|
|
|
|
On Debian (and Debian-based distribs) it needs the following
|
|
|
|
dependencies:
|
|
|
|
|
|
|
|
```
|
|
|
|
apt install make build-essential libssl-dev zlib1g-dev libbz2-dev \
|
2022-02-10 10:24:57 +00:00
|
|
|
libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev \
|
2021-12-07 10:28:47 +00:00
|
|
|
xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2022-09-02 08:46:06 +00:00
|
|
|
## Installation
|
2021-12-07 10:28:47 +00:00
|
|
|
|
|
|
|
Clone the repo anywhere, then in your `~/.bashrc` add:
|
|
|
|
|
|
|
|
source PATH/To/THE/REPO/compile-python.sh
|
|
|
|
|
2022-09-02 08:46:06 +00:00
|
|
|
And for the compiled Python to be found in your PATH:
|
|
|
|
|
|
|
|
PATH="$PATH:$HOME/.local/bin"
|
2021-12-07 10:28:47 +00:00
|
|
|
|
2022-09-02 08:46:06 +00:00
|
|
|
|
|
|
|
## Usage
|
2021-12-07 10:28:47 +00:00
|
|
|
|
|
|
|
```bash
|
|
|
|
$ compile-pythons
|
|
|
|
$ python3.6 --version
|
|
|
|
Python 3.6.15
|
|
|
|
$ python3.7 --version
|
|
|
|
Python 3.7.12
|
|
|
|
$ python3.8 --version
|
|
|
|
Python 3.8.12
|
|
|
|
$ python3.9 --version
|
|
|
|
Python 3.9.9
|
|
|
|
$ python3.10 --version
|
|
|
|
Python 3.10.1
|
|
|
|
$ python3.11 --version
|
|
|
|
Python 3.11.0a2
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## How it works
|
|
|
|
|
|
|
|
It downloads official Python sources (from
|
|
|
|
[https://www.python.org/ftp/python/](https://www.python.org/ftp/python/)),
|
|
|
|
then compiles them using `--with-pydebug` (it's a dev tool, don't use
|
|
|
|
it in production! Rely on your distrib in production!), and
|
|
|
|
`--prefix=~/.local`, and finally installs it using `make altinstall`.
|
|
|
|
|
|
|
|
Anyway it's ~67 lines of code, maybe just read it.
|
|
|
|
|
|
|
|
|
|
|
|
## Be nice with distrib' provided Python
|
|
|
|
|
|
|
|
`compile-python` only produces binaries on the form `pythonX.Y` (like
|
|
|
|
`python3.8`), so `python3` and `python` will always point to your
|
|
|
|
distrib' Python.
|
|
|
|
|
2022-09-02 08:49:20 +00:00
|
|
|
But beware, depending on how you setup your `PATH`, `pythonY.X` may
|
|
|
|
point to your distrib' Python, or to your manually compiled one.
|
|
|
|
|
|
|
|
On Debian, don't hesitate to `apt install python-is-python3` if you want `python`
|
2021-12-07 10:28:47 +00:00
|
|
|
to be `python3`.
|
|
|
|
|
|
|
|
|
|
|
|
## Functions
|
|
|
|
|
|
|
|
The file declares 3 functions:
|
|
|
|
|
|
|
|
- `compile-pythons`: To compile a set of usefull Python versions.
|
|
|
|
- `compile-python`: To compile a given Python version (has autocompletion).
|
|
|
|
- `venv`: Just a wrapper to `python -m venv` that I like to use daily.
|
|
|
|
|
|
|
|
Using a function don't force you to use the others, they are **not** related.
|
|
|
|
|
|
|
|
|
|
|
|
### `compile-pythons`
|
|
|
|
|
|
|
|
This is probably the one you're seeking, it compiles a bunch of
|
|
|
|
usefull Python verisons, typically usefull if you use
|
|
|
|
[tox](https://tox.wiki/en/latest/) and need multiple Python versions
|
|
|
|
to test your project.
|
|
|
|
|
|
|
|
|
|
|
|
### `compile-python`
|
|
|
|
|
|
|
|
This one is used by `compile-python` but you can use it manually, like:
|
|
|
|
|
|
|
|
compile-python 3.10.1
|
|
|
|
|
|
|
|
|
|
|
|
### `venv`
|
|
|
|
|
|
|
|
A bit unrelated to the two others, here for historical reasons, this
|
|
|
|
is how I create venvs. I use it like:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ venv
|
|
|
|
```
|
|
|
|
|
|
|
|
If the venv does not exists it's created, if it exist it's just activated.
|
|
|
|
|
|
|
|
It takes an optional parameter: the Python version to use, like `venv
|
|
|
|
3.10` or `venv 3.6`.
|
|
|
|
|
|
|
|
The venv prompt takes the name of the current directory plus the
|
|
|
|
version, like:
|
|
|
|
|
|
|
|
(compile-python)(py3.10.0) mdk@seaph:~/ $
|
|
|
|
|
|
|
|
which I find usefull, but feel free to not use it.
|
|
|
|
|
|
|
|
|
|
|
|
## Why not using `pyenv`?
|
|
|
|
|
|
|
|
I know `pyenv` exists, I even used it back in the time. I did not
|
|
|
|
appreciated the `shims` part (I'm not saying it's bad), so I tried
|
|
|
|
myself as something more simple: just build Python and that's it.
|