Project Fx 2.0

怪文書と備忘録を書きます

グラフ電卓TI-Nspireのネイティブ開発環境「Ndless SDK」を導入した話

2021-03-13追記

本記事に書かれているSDKの導入手順をDocker化しました。 本記事の情報は古いので、こちらの新しい記事をご覧になることをおすすめします。

stepney141.hatenablog.com

はじめに:『Ndless SDK』とは

この記事は、関数電卓TI-NspireのC/C++開発環境『Ndless SDK』を、Ubuntu 17.04環境上で構築する際に私が踏んだ手順をまとめたものです。

Ndlessとは、TI社のグラフ関数電卓TI-Nspireシリーズを「脱獄」させ、ARMアセンブリ言語C言語で書かれたプログラムを動かせるようにするための、サードパーティ製ソフトウェアです。
専用の開発環境(Ndless SDK)を使えば、誰でも電卓用のソフトウェアをパソコン上で開発して、Ndlessが導入されている電卓本体に転送し、電卓上でソフトウェアを実行することができます。
Ndless SDKで開発したソフトウェアをネットで公開しているユーザーも多く、科学技術計算ソフト・ゲームソフト・便利系ソフトなど、たくさんのユーザーがたくさんのソフトウェアを公開しています。

参考資料

  1. https://hackspire.org/index.php/C_and_assembly_development_introduction(開発者による導入手順の解説)
  2. https://tiplanet.org/forum/viewtopic.php?t=20686&p=223523(開発者によるWindows Subsystem for Linuxでの導入手順の解説 ※フォーラム上の書き込み)
  3. https://github.com/ndless-nspire/Ndless.git(NdlessのGitHubリポジトリ

1. 必要なパッケージを導入する

上記の参考資料2.によれば、SDKの導入に必要なパッケージは以下のコマンド入力でまとめて導入できるようです:

sudo apt-get install git build-essential binutils libgmp-dev libmpfr-dev libmpc-dev zlib1g zlib1g-dev zlib1g-dbg libboost-dev libboost-program-options-dev libboost-program-options1.58-dev libboost-program-options1.58.0 libboost1.58-dev wget texinfo libpython2.7-dev bison flex php7.0-cli

厄介なのは、参考資料1.で指定されていないパッケージも導入する必要があるということ。
パッケージがひとつでも欠けていると正しくSDKを導入できないようなので注意が必要です。

2018年1月現在では、libboost-program-options1.58-devとlibboost-program-options1.58.0はapt-get経由での導入ができなくなっています(新規バージョンは導入可能)。
1.58をわざわざwgetで落としてくるのも面倒だったため、僕は1.62をapt-getで導入しましたが、バージョンの違いによるエラーは現状発生していません。

2. 本家リポジトリをcloneする

適当なディレクトリに本家リポジトリをgit cloneして導入します。ここではホームディレクトリ(/home/username)直下に導入します。
具体的には、コマンドラインで以下を実行します:

cd ~
git clone --recursive https://github.com/ndless-nspire/Ndless.git

※--recursiveをつけ忘れないよう注意、つけないと正しく導入できません!

3. build_toolchain.shを編集する

/Ndless/ndless-sdk/toolchainにあるbuild_toolchain.shをお手元のテキストエディタで開きます。
そして、以下の通りに編集します:
・31行目のOPTIONS_GDB="--target=${TARGET} --prefix=${PREFIX} --enable-interwork --enable-multilib --disable-werror --with-python"から、末尾の--with-pythonを削除
・51行目(if ! gcc -lpython2.7 test.c -o test; then error=1; echo 'libpython2.7 (python-devel/python2.7-dev) dependency seems to be missing!'; fiの部分)を丸ごとコメントアウト

要するにPython関連の記述を消せってことですね。
編集が済んだら保存してエディタを閉じましょう。

4. build_toolchain.shを実行する

再びターミナルに戻り、編集したbuild_toolchain.shを実行します:

cd ~/Ndless/ndless-sdk/toolchain
./build_toolchain.sh

このシェルスクリプトを実行すると、ARM開発用のツールチェーンが自動でダウンロード・導入されます。
処理が終わるまで待ちましょう。
完了までそこそこ時間がかかるので(回線速度やパソコンのスペックにもよるが僕の場合は40分ほどかかりました)、ターミナル画面がすごい勢いでスクロールしていくのを眺めて待ちましょう。

必要なパッケージがちゃんと入っていて、なおかつ処理が正常に終了したら、このような出力がされます:

Done! 
Don 't forget to add' / home / username / Ndless / Ndless-sdk / toolchain / install / bin 'to your $ PATH along with / home /  username / Ndless / Ndless-sdk / toolchain /../bin.

こんな感じの表示が出た人、おめでとう!一旦ターミナルを閉じて次のステップに進みましょう。
出なかった人、頑張れ!パッケージが足りないか、build_toolchain.shの編集をしくじったか、何かしらやらかしているはずなので、前に戻ってもっかいやり直しましょう。
「それでも───俺は、間違えてなどいなかった───」というそこのあなたは、本家リポジトリにIssueを投げて開発者に直接質問することをおすすめします。

5. パスを通す

ターミナルを閉じて、build_toolchain.sh実行後の表示にある通りにPATHを通します。
具体的には、~/.bashrcの末尾に以下を追加します:

export PATH="/home/username/Ndless/ndless-sdk/toolchain/install/bin:/home/username/Ndless/ndless-sdk/bin:${PATH}"

ここで、/home/username/の部分はgit cloneした場所に合わせて変えて下さい。
これはOS側の問題だと思いますが、「/home/username/Ndlessを~/Ndlessと書いたらうまくPATHが通らなかった」という報告が上がっているので、ホームディレクトリの場合は/home/username/Ndlessとしておくのが無難そうです。 参考資料1.には~/.bash_profileに追加するようにとの指定がありますが、僕の環境では~/.bash_profileだとうまくPATHを通せませんでした(~/.bashrcに追加したら通せた)。

6. makeする

再びターミナルを開いてNdlessディレクトリ直下に移動し、makeします:

cd Ndless
make

ここまで特にしくじっているところがなければ、makeは正常に完了し、こんな感じの出力をしてきます:

(前略)
make [ 3 ]: Leaving directory '/home/username/Ndless/ndless/src/installer-4.5'
make [ 2 ]: Leaving directory '/home/username/Ndless/ndless/src'
make [ 1 ]: Leaving directory '/home/username/Ndless/ndless'

PATHがちゃんと通っていないと正常にmakeが完了しません。

7. 動作確認

1.〜6.のステップが済んだら、コマンドラインnspire-gccと入力してみて下さい。
以下のように出力されたらSDK導入は完了です!:

arm-none-eabi-gcc: fatal error : no input files 
compilation terminated.

ここまで完了した皆様、お疲れ様でした!

8. 付属のテスト用コードをコンパイルする(おまけ)

【そのうち書きます】