ThinkPad X250にDebian12を入れてラズパイのクロスコンパイル環境作成

本稿はLinuxセットアップ記事である。とても今更感があるため、開発向けの細かいところに着目して記事にした。

今回は、Raspberry Piのクロスコンパイル環境を構築する話です。
本筋がクロスコンパイルの話でサーバー関連の話はないです。
暇なら読んでみて下さい。

# SSDを用意
まっさらなSSDにインストールをおすすめする。
120GBあれば十分そう。

参考までに一通りの開発環境を入れてこんなもん。
```
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             3.8G     0  3.8G    0% /dev
tmpfs            782M  1.5M  781M    1% /run
/dev/sda2        109G   24G   80G   23% /
tmpfs            3.9G     0  3.9G    0% /dev/shm
tmpfs            5.0M   12K  5.0M    1% /run/lock
/dev/sda1        511M  5.9M  506M    2% /boot/efi
tmpfs            782M  2.5M  780M    1% /run/user/1000
```

# Debian
https://www.debian.org/

Ubuntuでもいいが、あえて硬派なDebian。

# Debianインストールメディア作成
Live版だと3GBもあるので、ネットインストール版を持ってくる。仕事だとオフラインインストールだが、家ならネットにつないで横着してもよかろう。

ネットインストール版だとCD-Rに焼ける650MBサイズ。
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.9.0-amd64-netinst.iso

これをCD-Rに焼いて、まずはインストール。
最初に日本語指定するのとネットワークつないでおくくらいであとは放置。
GUIはシンプルなXfceにした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/d7253630-d531-4ee3-8360-b044c0b0e96c.png)

# Tips:スクリーンショットのとり方
別アプリのメニューを開いてスクリーンショットしたいケースがあると思う。
xfceの場合、単純にPrtScで取るとメニューが隠れてしまう。
なので、タイマーを使う。若干めんどくさい。

1. まず、何もせずPrtScを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/c152293d-50e9-4716-aba5-9d9e7965fcec.png)

2. 撮影するまでの遅延時間を5秒くらいにする。

3. OK押して別アプリのメニューを開く。5秒後にキャプチャされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/43081bde-c116-4ad6-8a1e-24565455016d.png)


# suduerに追加
まず、ユーザーがsudoできるようにする。
```
usermod -aG sudo airnanasi
```

## Tips:ログアウト時のビープ音消す
まず、いちばんうざいビープ音を消す。
ターミナルで下記を。※.bash_profileに追記されます。
```
echo "set bell-style none" >> ~/.bash_profile
```

## Tips:指紋認証
ツールを入れる。
```
sudo apt update
sudo apt install fprintd libpam-fprintd
```

指紋登録する。
```
fprintd-enroll
```

指紋認証を有効化する。
メニュー操作が分かりづらい。
・Spaceキーで選択・選択解除
・TabキーでOKを選んでEnter
```
sudo pam-auth-update
```
ログアウト、ログインして指紋認証できればOK。
ターミナルからsudo -iでも試してみる。

# VSCodeのインストール
```
sudo apt update
sudo apt install code
```
日本語化する。
拡張機能→Japaneseで検索→Ctrl+Shift+P→Language
で検索。メニュー名は「Configure Display Language」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/9c5bfb8d-8db5-47a6-992d-390479a1aeaa.png)

配色テーマはTokyo Night Stormだろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/10b7b272-9f20-489e-b3dd-c6c756cf3ed1.png)


# GIMPのインストール
カメラ画像閲覧、編集はこいつがないと。
```
sudo apt update
sudo apt install gimp
```

# Tips:Pythonについて
Debianの公式パッケージは2025/2/14時点で「3.11.2」であった。
Debianの場合、入っているバージョンは動作確認してある安定版なので、うかつにバージョンは上げないほうが良いかもしれない。

# Raspberry Pi2のクロスコンパイル環境を作る

#### ツールインストール
下記参考。
https://qiita.com/iwatake2222/items/5b20558f8ab3f27ca4a4

```
sudo apt-get update
sudo apt-get install build-essential libncurses-dev git git-core
mkdir ~/raspberry
cd ~/raspberry
git clone https://github.com/raspberrypi/tools
```

#### sshが通るか確認(piはラズパイのユーザー名、IPアドレスもラズパイの)
```
ssh pi@raspberrypi.local
または
ssh pi@192.168.xx.xx
```
注：
「raspberrypi.local」はRaspberry Pi のデフォルトのホスト名に付加される .local ドメイン名です。
この形式を使用することで、同一ネットワーク内の Raspberry Pi に対して、IP アドレスを直接指定せずに名前解決を行い、SSH 接続やウェブブラウザでのアクセスが可能になります。

# サンプルコード

```C
#include <stdio.h>

int main() {
    printf("Hello, Raspberry Pi!\n");
    return 0;
}
```

#### ビルド
クロスコンパイラを指定してビルド。
```sh
ARCH=arm ~/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ hello.c -o hello
```
成功してhelloファイルができればOK。
helloファイルをscpで転送します。

```bash
scp hello pi@raspberrypi.local:/home/pi/
```

ラズパイにsshログインして実行。

```bash
ssh pi@raspberrypi.local
./hello
$ Hello, Raspberry Pi!
```
実行権限はラズパイのルートなら問題ないはずだが、実行権限がなければchmod等でつける。

おすすめはVSCodeでターミナルを2つ開いておいて、片方をssh接続しっぱなしにしておく。
gdb debugは気が向いたらやろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/8028ceda-7543-4708-bf7a-90efcc86cd96.png)


構築方法をChatGPTに聞いたけどクロスコンパイル構築は全然だめだった。
Qiitaのほうが正確。この辺弱いなぁ。。。

# Raspberry Pi Pico 2のバイナリをビルドしてみた
以前作った環境をクローンしてそのままDebian上のVSCodeでビルドしてみる。

https://github.com/airnanasi/multicore_runner_demo

WindowsでのビルドよりPCスペックは落ちるのに明らかにコンパイルが速い。(1/3くらいの時間で終わる感じ)

ChatGPTに聞いてみたところ、
・ext4ファイルシステムが断片ファイルに強い
・elfをネイティブに扱える
・gccをネイティブに扱える(MingWなど介さない)
・ninjaの最適化
などで速い可能性があるとのこと。
結構びっくりな速さで最初コンパイルしてんのかと思ったくらい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/9e1f50c2-3dde-4644-bdb1-2c4bb33ff0a6.png)

－以上－