Python
Ubuntu
GCC
clang
pyenv

新しもの好きのためのpyenv&clangでpython3をソースからインストールする方法

読まなくてもよいまえがき

私のような新しもの好きは何かと最新バージョンを使いたがります。
chromeもcannaryを使います。
もちろんバグを踏むこともありますが笑い飛ばします。

少し前まではArchLinuxで様々なソフトウェアの新しいバージョンを手軽に楽しく使ってきましたが、
実際これから例えば仕事でArchLinuxを使うことなんて普通に考えてありません。
せいぜいUbuntuとかCentOSとかDebianでしょう。

するとpython2 とかいう負の遺産がまだまだ現役な環境でpython3を使わなくちゃいけなくなります。
新しもの好きには苦行でしかありません。

”私は普段ArchLinuxなんでUbuntu不慣れです”とか口が裂けても言えるわけはないし、そもそもArchLinux使う人ならほかのLinuxディストリビューションにも造詣があるのが普通

pyenv

pythonのバージョンを切り替える(パスを乗っ取る)ためのツールです。
詳しくは他の記事を参照

pythonの最新バージョンがでたら前のバージョンを残した状態でそのままサクッと乗り換えられますし、Cコンパイラを変えたりもできます。
新しもの好きには必須ツールでしょう。

clang

私のような新しもの好きはただのclangでは満足できません。
最新のclangがいいのです。

大体の有名どころのソフトウェアは公式に(たまに有志が)debとかrpmのパッケージを公開していたりします。
Ubuntuなら鍵を登録して/etc/apt/sources.list.d/に追加のリポジトリを登録するためのファイルを追加すると思います。
鍵の登録は自己責任で

nginxのmainlineをインストールしようとしたことのある人ならだいたいわかるでしょう。

gcc

gccが好きな人は

sudo add-apt-repository ppa:jonathonf/gcc-8.0

で追加すればgcc-8が使えます。
他に色々入れているともしかしたら依存関係が壊れるかもしれないので

sudo add-apt-repository ppa:jonathonf/gcc-7.3

でgcc-7.3で我慢する必要があるかもしれません

鍵登録

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -

リポジトリの追加

echo -e "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main \ndeb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic main" > /etc/apt/sources.list.d/llvm.list

新しもの好きはUbuntu16.04なんて使いません。
beta版の18.04(bionic beaver)を使います。
コードネームのところは16.04なら適宜xenialとかで読み替えてください。

これで最新のclangがaptでインストールできます。

2018/04/10現在のclang

clang-5.xがstableでclang-6.xがqualificationです。(qualificationってなんて訳せばいいんでしょうか 認定とか?)
clang-7が現在進行形のunstableと呼ばれるブランチです。
好きなのをインストールしましょう。

apt install clang-XXX

sudo apt updateを実行すると大体毎日新しいのが降ってきます。

pythonをソースからインストール

環境変数でCコンパイラを差し替えておきます。

export CC="hoge" # gcc-7 とかclang-6.0とか
pyenv install XXX

pyenv install-vオプションをつけて実行するとビルドがどんな感じで進んでいるか確認できます

ビルドがこけたら素直にバージョンを変えましょう

終わりに

私は別にそこまでディープな開発者でもないので最新版の恩恵にあずかることはほぼありません

私は英語は得意ではないですし知識もないただのコミュ障なので、OSSの怖い人たちに絡んだこともありません。

ちなみに試しにWSLのUbuntu16.04上でclang-7でpython3.8-devをビルドしようとしましたが当たり前のようにこけました。

こういうのは動かなくても文句言ってはいけません。なにか起こっても自己責任です。
そもそもこのバージョンのコンパイラってサポートされてないんじゃないのか
原因の切り分けなどができる人向けです。

私は端末で動かす小さなネットワークモニタリングツールの開発を行っていますが、(https://github.com/johejo/ppping コメントがいただけるとうれしいです)
WSL上でpythonをソースからビルドするとutf-8の記号がうまく出なくなったりしちゃって困っています。