CPython Internals
Compiling Cpython
git clone -b v3.9.0b1 --depth=1 https://github.com/python/cpython.git
sudo apt install build-essential
sudo apt install libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev libffi-dev
cd cpython
# configure 是一个可执行 shell 脚本, 它是由 autoconf 工具(命令)生成的, 其更原始的文件可能是代码库中的 configure.ac 这种文件通过 autoconf 命令得到的, 但是通过其他文件得到 configure 脚本的过程似乎是由 Python 开发者手工执行 autoconf 命令后上传至代码仓库并且被 git 所管理的, 因此 configure 脚本本身是怎么得到的这一细节暂时不太清楚
# ./configure 的执行结果主要是得到 Makefile 文件(以及一些其他文件, 具体有哪些不太确定, 按理是 make 命令执行时所需的配置文件), 注意这个 Makefile 文件并不由 git 所管理
# 目前的一些观察: git 会管理 configure 和 Makefile.pre 文件, 而后者似乎是最终生成的 Makefile 的模板, 猜测在执行 ./configure 脚本时, 应该是使用到了 Makefile.pre 文件的
# 总之: 就目前来说, ./configure 命令只需要执行一次, 后续即使改动了 Cpython 源代码, 需要重新编译时, 也只需要执行 make 命令, 而不需要执行 ./configure 命令. 因此研究和探索 Cpython 的起点可以定在 Makefile 已经得到了.
./configure --with-pydebug
# 使用下面的命令得到的二进制文件 python 只会在当前路径下, 不会被复制进 /bin, /usr/bin, /usr/local/bin 这类路径, 因此不用担心对全局的 python 有任何污染
make -j2 -s
# make install 会将编译好的 python 复制进 /bin, /usr/bin, /usr/local/bin 这类路径, 并且会修改 python 命令的指向, 例如: 首先将编译好的 python 复制进 /usr/bin/python3.9, 然后构建 /usr/bin/python -> /usr/bin/python3.9 这种软链接, 因此不推荐这种做法, 而是推荐用 make altinstall
# make install
# make altinstall 不会修改 python 命令的软链接, 因此是推荐的安装方式
# make altinstall
# 注意: 我们不想对全局的 python 或 python3 或 python3.x 有任何污染, 因此我们既不执行
# 使用如下方式运行编译好的 python
./pythonThe Python Language and Grammar (TODO)
Configuration and Input
Last updated