CMake/Ninja/gcc/clang/Poetryをビルドしてインストールする手順メモ


1. [目的](#目的)
2. [おことわり](#おことわり)
3. [手順補足](#手順補足)
4. [検証環境](#検証環境)
5. [cmake](#cmake)
6. [ninja](#ninja)
7. [gcc](#gcc)
8. [clang, clang-format, clang-tidy](#clang-clang-format-clang-tidy)
9. [Python (Poetry インストールまで)](#python-poetry-インストールまで)
   1. [python3](#python3)
   2. [pip](#pip)
   3. [pipx](#pipx)
   4. [pyenv](#pyenv)
   5. [poetry](#poetry)

## 目的

C++/Python 開発に必要なツールのローカルインストール（ここではソースをビルドしてホームディレクトリ下にインストールすること）手順をまとめる予定です。

:::note warn
全ての依存関係をローカルインストールで済ませることは目指していません。
例えば CMake の依存ライブラリ OpenSSL (libssl-dev) は予めルート権限でシステムインストールされていることを前提としています。
:::

## おことわり

- この記事では修正提案を歓迎します。ただし、全ての提案を即座に記事へ反映できるとは限りません。
- 本記事の内容は特定の環境でのみ検証されています。

## 手順補足

- インストール先は以下の環境変数で指定しています。

```bash
export LOCAL_DIR=$HOME/.local
export LOCAL_BIN_DIR=${LOCAL_DIR}/bin
```

- カレントディレクトリは特に明記しない場合 `cd $LOCAL_DIR` であるとします。
  （影響するのはソースのダウンロード・解凍先で、インストール先に影響はないため不問。）

- インストールするバージョンは適宜変更してください。

:::note warn
ダウンロードしたソースは `make uninstall` でツールをアンインストールできるように残しておきます。
:::

## 検証環境

<details><summary>cat /etc/os-release</summary>

```console:cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

</details>

<details><summary>gcc -v</summary>

```console:gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
```

</details>

<details><summary>make -v</summary>

```console:make -v
GNU Make 4.3
このプログラムは x86_64-pc-linux-gnu 用にビルドされました
Copyright (C) 1988-2020 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです: 自由に変更および配布できます.
法律の許す限り、　無保証　です.
```

</details>

## cmake

Reference: https://gitlab.kitware.com/cmake/cmake

```bash
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz
tar xvf cmake-3.28.3.tar.gz
cd cmake-3.28.3
./bootstrap --prefix=${LOCAL_DIR}
make && make install
```

## ninja

Reference: https://github.com/ninja-build/ninja?tab=readme-ov-file#building-ninja-itself

```bash
git clone https://github.com/ninja-build/ninja.git
cd ninja
cmake -Bbuild-cmake
cmake --build build-cmake
./build-cmake/ninja_test # run unit tests
cp build-cmake/ninja ${LOCAL_BIN_DIR}
```

## gcc

gcc のビルドに必要な `texinfo` を先にインストールする。
Reference: https://www.gnu.org/software/texinfo/

```bash
tar xvzf texinfo-7.1.tar.gz
cd texinfo-7.1
./configure --prefix=${LOCAL_DIR}
make && make install
```

Reference (gcc): https://gcc.gnu.org/install/

- 参考記事：http://real-c.info/envUnix.html
- 64bit 環境では gcc のビルド時に `libc6-dev-i386` (apt) が必要になる。
  - `--disable-multilib` オプションを付けると 32bit 環境ターゲットにできなくなるが、上記ライブラリは不要になる。

```bash
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-11.2.0/gcc-11.2.0.tar.gz
tar xzf gcc-11.2.0.tar.gz
cd gcc-11.2.0/
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix=${LOCAL_DIR}
make && make install
```

`${LOCAL_DIR}/bin` にパスを通す他、以下の環境変数を設定する。

```bash
# GCC
export LD_LIBRARY_PATH=$HOME/.local/lib64:$HOME/.local/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$HOME/.local/lib64:$HOME/.local/lib:$LIBRARY_PATH
```

## clang, clang-format, clang-tidy

Reference: https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm

- 先にローカルインストールした gcc, ninja でビルドする。
- `LLVM_ENABLE_PROJECTS` オプションに：
  - `clang` を指定することで clang が、
  - `clang-tools-extra` で clang-format, clang-tidy がビルドされる。

```bash
git clone --depth 1 https://github.com/llvm/llvm-project.git
cd llvm-project/
cmake -S llvm -B build -G Ninja -DCMAKE_INSTALL_PREFIX=${LOCAL_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=${LOCAL_BIN_DIR}/g++ -DCMAKE_C_COMPILER=${LOCAL_BIN_DIR}/gcc -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra"
cmake --build build
cmake --install build
```

## Python (Poetry インストールまで)

:::note warn
Python 系のツールをインストール際は、`$LOCAL_DIR` を参照していない。
そのため `$HOME/.local` 以外にインストールする場合は要検証。
:::

### python3

(検証環境では既に python3 が導入済みだが記録としてメモ)

```bash
wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
tar xvzf Python-3.12.2.tar.xz
./configure --prefix=${LOCAL_DIR}
make
make install
```

### pip

Reference: https://pip.pypa.io/en/stable/installation

```bash
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
```

### pipx

Reference: https://github.com/pypa/pipx?tab=readme-ov-file#install-pipx

```bash
python3 -m pip install --user pipx
```

### pyenv

Reference: https://github.com/pyenv/pyenv?tab=readme-ov-file#automatic-installer

```bash
curl https://pyenv.run | bash
```

### poetry

Reference: https://python-poetry.org/docs/#installing-with-the-official-installer

```bash
curl -sSL https://install.python-poetry.org | python3 -
```