UbuntuのEmacs上でラズパイの開発ができるようにした


ラズパイはネットワーク環境とセルフコンパイル環境があるので、gitかなんかでファイル共有して、キーボード繋いでmakeすればいいじゃんと思ってました。この前、開発チームの同僚に話を聞いてみるとクロスコンパイルしてますと言われて、せっかくなので僕もクロスコンパイル+Emacsで閉じる環境を作ってみました。

ラズパイはRaspberry Pi 3 Model B+、ホスト環境はUbuntu VERSION="18.04.2 LTS (Bionic Beaver)"です。

クロスコンパイル環境の作成

こちらの記事をそのまま実行すれば開発環境ができます。

!x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ

Ubuntu上でapt install一発です。

sudo apt install g++-arm-linux-gnueabihf

記事のとおりに作業をして hello_arm (ARM用バイナリファイル)を作りました。
ホスト環境でmakeflieを作っておけば、EmacsからM-x compileでコンパイルできます。

ラズパイの設定

sshで入れるようにして、新しいユーザーを作ります。
ターミナルからsshコマンドでログインできることを確認してください。

Emacsの設定

trampで入れるようにする。

init.elにラズパイのipアドレスとユーザー名、開始ディレクトリを指定してssh接続をする関数を書きます。

(defun raspi ()
  (interactive)
  (find-file "/ssh:[email protected]:/home/natu"))

これで、M-x raspiでsshログインできます。

diredでファイルを転送する。

diredのコピー先を、もう一つ開いているdiredのディレクトリに設定します。これもinit.elに書いておきましょう。

(setq dired-dwim-target t)

これで、ssh接続したローカルと、ホストの両方をdiredで開き、ホスト側で上で作ったhello_arm(ARM用実行バイナリ)を選んでCを押すと、ファイルがラズパイに転送されます。

eshellでファイルを実行する

これ、知らない人多いんですけど、trampでsshし接続先のディレクトリを開いた状態でeshell実行すると、接続先のシェルとして実行できます。仕組みはよく分かっていません。


eshellからラズパイ上の実行ファイルを実行しています。

最後に

UbuntuのEmacs上でコーディング、コンパイル、ファイル転送、ラズパイ上での実行まで行えるようになりました。やりました。