「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



Linux Mintに、HSP3 for Linuxを入れてみた。参考にした
のは、昨日の

https://www.youtube.com/watch?v=9dAF2ZB93no

この動画。Ubuntuに、CLIでインストールしている様子を
解説した動画なんだけど、Linux Mintを使いつつ、せっかく
のGUI用開発言語なので、GUI環境メインでインストールする
手順を、まとめておきたいところ。


http://hsp.tv/make/hsp3linux_pi.html

公式ページに、ソースファイルが一式詰まったtgzファイルと、
インストールが必要な各種パッケージについて触れられて
いるものの、各OS環境でそれらのパッケージをどういう風に
インストールすればいいかが触れられて無いので、そのへん
をメインに、ハードコピーで流れを纏めていきます。


・HSP3のソースを含むアーカイブをダウンロード/解凍
・必要なパッケージ類をインストール
・ソースをmake(コンパイル)
  →各種HSP3のユティリティ(実行ファイル)生成
・HSP3のプログラムを書いてコンパイルして実行

という感じの流れになります。


ソースアーカイブファイルのダウンロードは後まわし
にしておいて、とりあえず先に、必要となる3つの
パッケージ、
 「OpenGLES2.0以降 / EGL」
 「SDL1.2」
 「gtk+-2」
をインストールしていきます。

MintのGUI環境なので、パッケージマネージャはsynaptic
を使って「楽をしていく」方向です。
なので、GUI画面でsynapticを開いて、それぞれ以下の
ようにキーワード検索使って、パッケージの一覧を表示
して、対象のパッケージにチェック入れてインストール
していってください。

(UbuntuとかDebianでも同じ感じだとおもうんだけど、
 synapticは標準で入ってないかもしれないので、
 その場合はsynaptic入れて楽するか、以下のハード
 コピーを参考に、各パッケージの名前を直接入力して
 ください)



まず、OpenGL関係。

てっきり、Openって付くし、いろんなソフトで使ってるわけ
だから、OpenGLなんて最初から入っているんじゃないの?
無償で使えるライブラリなんでしょ?とか思ってたら、
少し違うみたい。

http://www.robot.t.u-tokyo.ac.jp/~yamashita/html/gllinux.html
http://baker-street.jugem.jp/?eid=526

このあたりで説明されているように、グラフィックドライバ
周りって、ハード依存で、各社GPUベンダー系のオープンじゃ
ないドライバが絡むので、オープンソース版にあたる「mesa」
っていうのを使うみたい。

Raspberry Pi版だと、GPUはCPUチップ内蔵だったりするから、
その辺は少し違うみたいなんだけど、とりあえずPC Linux
なら、mesaがらみのOpenGLを入れておくとシアワセっぽい。
(OpenGLとほぼ互換の、似て非なるものというものらしい)

というわけで、synapticでこれをインストールしていきます。
検索窓で、「libgles2-mesa」って入力してみると、
「libgles2-mesa-dev」っていうパッケージがあるので、
これにチェック(インストール対象に選択)して
インストールます。



libgles2-mesaは、

https://packages.debian.org/ja/wheezy/libgles2-mesa

こういうパッケージ。

ちなみに、後ろに「dev」って入っているのは、開発用の
パッケージのことで、各種ヘッダファイルなどが入って
います。
後の手順で、「make」でコンパイルをするときに、この
パッケージとかに収録されているヘッダファイルを使って
コンパイルするので、そのときに必要になります。
(詳しくは後ほど)


つぎ。SDLを入れていきます。SDLは、

https://ja.wikipedia.org/wiki/SDL

こういうパッケージ。要は、グラフィックとかサウンド
とかを扱うための、マルチプラットホームの便利な
ライブラリ。

同様に、「libsdl」って入力すると、「libsdl1.2-dev」
ってパッケージが見つかるので、こいつをチェックして
インストールします。



あと、参考にした動画では、「libsdl-image1.2-dev」と
「libsdl-mixer1.2-dev」もインストールしないと動かな
かったとあったので、一覧から探してみると、Mint環境
もデフォルトではインストールされてないみたいなので、
一緒に入れておきます。





前者は画像フォーマットを扱う関係のライブラリ、後者は
オーディオミキサー関係のライブラリ。


つづいて、gtk2.0関係をインストールします。

https://ja.wikipedia.org/wiki/GTK%2B

gtk2.0は、gimpとかで使われている、マルチプラット
ホームのツールキットなので、モノ自体は標準で
インストールしてあるんだけど、devパッケージは
インストールされていないので、インストールします。

検索窓で、libgtk2.0と入れると、「libgtk2.0-dev」が
あるので、これをインストールします。



パッケージのインストール関係はとりあえず終了。



で、ようやく、公式ページからソース一式が入った
アーカイブファイルをダウンロードして、コンパイル
していきます。

まず、ブラウザ(Mintだと標準でfirefox)で公式ページ
を開いて、tgzファイルをクリックしてダウンロードします。



ダウンロード先ディレクトリは、「Downloads」あたりで
いいでしょう。
(本当は、FHSに倣って/optに入れておくとかしたほうが
いいと思いますが)


今回ダウンロードしたファイルは、「hsplinux35.tgz」
でした。バージョンによって数値部分が変わるみたい
です。



これを、ファイルマネージャで開いて、右クリックして
「ここに展開」すると、「hsplinux35」っていう
ディレクトリが作られて、その中にソースなどファイル
一式が解凍されます。

解凍できたら、そのディレクトリに移って、余白部分
(ファイルのアイコンが無いところ)で右クリック
すると、「端末の中に開く」があるので、これを
選ぶと、この「hsplinux35」ディレクトリをワーキング
ディレクトリにした状態で、端末(黒い画面)が
開きます。

(makeの作業だけは、GUI環境だけで出来ないので、
 端末使います)



黒い画面で、「hsplinux35」ディレクトリが開きました。
おもむろに、「make」と打ってエンターを押すと、
アーカイブに入っていた「makefile」にしたがって、
ソースファイル一式のコンパイル作業が始まります。



makeについては、くわしい説明は端折りますが、
以下を眺めてみると良いでしょう。

http://www.atmarkit.co.jp/ait/articles/1106/07/news131.html
http://www.atmarkit.co.jp/ait/articles/1106/10/news115.html

ざっくり言うと、
・たくさんのソースファイルから成るプログラムを
 コンパイルして、それぞれのソースにプログラムに
 対するオブジェクトファイルを作る
・それらの各オブジェクトをリンクして、実行ファイル
 を作る
・その際、変更のあったソースファイルを見つけ出して、
 それだけをコンパイルしなおして、新しいオブジェクト
 を生成し、実行ファイルに反映させる
・逆に、変更の無いソースファイルやオブジェクトは、
 そのまま再利用されることで、コンパイル全体の時間
 を短くできる

という動作をします。
こういう作業は、意外なほど大変なので、コンパイル
~リンク~実行ファイル生成の手順を自動化するのが
makeとかmakefileの用途です。


「make」コマンドだけ打つと、「makefile」を探して、
そこに書かれた内容を元に、どのソースとどのソース
を使って、どんな風にコンパイルすれば良いかを解釈
して、最終的に実行ファイルを出力します。

「makefile」は、ダウンロードしたhsp3のtgzファイル
にも収録されていて、そのmakefileを元にコンパイル
が行われます。

なお、「make」は、パラメタを指定すると、「makefile」
内にその名前で書かれた処理(ターゲットという)を明示
されたとして、makefileのそのセクションの処理を
実行します。(このあたりは、次のエラーの話でちょっと
だけ必要)


さて、32ビット版のLinux OSなら、多分ここでコンパイル
は終了だったでしょう。
残念ながら、エラーが出て、makeが中断しました。

エラーメッセージを調べてみると、どうやら、32ビット
のオブジェクトファイルと64ビットのオブジェクトファイル
が混在しているようで、「変数の型が一致しないよ」と
いう内容のエラーが出ているようです。

調べてみると、

http://transitive.info/2013/01/15/gimp-djvu-plugin/

ここに似たような事例がありました。どうやら、ダウン
ロードしたtgzファイル内に、ソースだけではなく、
コンパイルが完了しているオブジェクトファイルが
一部混在しているようで、オイラの64ビット版Mint
でコンパイルして出力されたオブジェクトと、混在
していた32ビット版用のオブジェクトで、型が一致
しないことがエラーになっていたようです。

このページでは、「make distclean」を行えと書いて
あります。この「distclean」がさっきの「ターゲット」
というわけです。

やってみたところ、「distclean」というターゲット
が無いよ、とのことなので、一般的なmakefileで
記述される「clean」を指定してみると、うまいこと
古いオブジェクトファイルが一掃されたようです。

64ビット版のLinuxを使っていて、同様のエラーが
出た場合は、「make clean」とやってみてください。



32ビット版の混在したオブジェクトが消えたので、
改めて「make」でコンパイルしなおします。

Windows10機の「VMware」環境上(1コア、1GB RAM)の
環境で、およそ5分でコンパイルが終わりました。
ネイティブ環境なら、もっと早いでしょう。



正常にコンパイルが通ると、先ほどのディレクトリに、
「hsed」とか「hspcmp」とか、「hsp3dish」といった
ファイルが増えているはずです。




「hsed」は、hsp用の簡易テキストエディタで、ファイル
を開いたり、実行したりできます。
(インタプリタなのか、JITコンパイラなのか不明ですが、
「F5」キーを押すだけで実行可能)




「hspcmp」は、実行用のオブジェクトを生成するコマンド
で、これを使って実行ファイルを作ります。ただし、
この実行ファイルは単体では動かず、「hsp3dish」と
いうランタイムに引き渡して実行します。

具体的には、
「./hspcmp -d -i -u test.hsp」でコンパイルして、
「test.ax」というオブジェクトが生成されたら、
「./hsp3disp test.ax」とすると、hsp3dishランタイム
を使って実行されるようです。「hsp3dish」のほかにも、
コマンドライン用の「hsp3cl」や、HGIMG4ランタイム用
の「hsp3gp」などがあるようです。詳しくは公式ページ
を参照のこと。


まぁ、とりあえず動作できる環境を作るというのが
目的だったので、コンパイルはまだやってません。
hsed上に、サンプルプログラムを読み込んで、直接実行
してみました。

先ほどmakeで生成された「hsed」を右クリックして
「開く」でテキストエディタの画面が開きます。

そうしたら、「file」メニューから「open」で、
「sample」ディレクトリから適当なプログラムファイル
を開いてみます。(ダイアログに[save」って書いて
ありますが、多分バグでしょう)


ここでは、「test1.hsp」を開いてみました。




「hsp→run」か、「F5キー」で実行します。




こんな感じの画面が出て、マウスを動かすと、その座標
が数値表示されて、ビットマップ画像がぐるぐると
回転しています。




とりあえず、HSPのソースを入力すると、実行できる
環境が整ったと思います。

(とりあえず、全然読み直して無いので、もしかしたら
 内容がおかしいところいっぱいあるかも)



ただ、いくつかのdevパッケージ入れたせいなのか、
なんかVMware上のMint、OS起動中にXサーバーの起動で
失敗しちゃう状態に。ただいま格闘中。
なんか、セグメントフォールト起きてるみたいなんだよな。
なにやら、開発中の変なパッケージとか入っちゃった
のかなぁ?


(追記)
Xサーバー起動、復活できた。

「エラーログ見る?」みたいなダイアログ出てきたんだけど、
見ても意味わかんないので、exitでそっと閉じていくと、
コマンドラインに戻るので、こういうときはあわてず騒がず、
ひとまず
 「sudo apt-get update」して「sudo apt-get upgrade」
だろうと。

やってみたら、立ち上がるようになった。
よかった。よかった。





その他、色々いじってみて、ちょっと知らなかったことなどを
少し整理してまとめておきたいと思います。


(1)Ubuntuのパッケージマネージャ

UbuntuのGUIデスクトップ(Unity)がなじまなかった
ので、最近はMintばかり使っているので、最新のUbuntu
はGUIのパッケージマネージャ、何使ってるんだろう?
と思ったら、

https://ja.wikipedia.org/wiki/Snappy
https://kledgeb.blogspot.jp/2016/06/ubuntu-1604-71-snaplinux.html

snappyってうやつなの?なんか先進的な感じがするねぇ。
Debian系も、Redhat系も、ほかのディストリビューション
でも、なんでもカバーできそう。いずれはこれに集約
されていったりするの?




(2)apt-fileでパッケージの検索

今回みたいに、なにかソースのアーカイブファイルを
ダウンロードして来て、コンパイルして使うっていう
場合に、特定のパッケージが入ってなかったりした
場合、必要なパッケージをどうやって探せばいいの?
と思ったので、ちょっと調べてみた。

https://qiita.com/Yuichirou/items/38165af29ab1e2d307f6

http://blog.amedama.jp/entry/2016/05/29/160545

ほほう。なんか、こんな感じに、「apt-file」を使って、
どのパッケージにどんなファイルが収録されているかが
検索できるってわけなのね。

とりあえず、apt-fileをインストールしておくかな。



コメント ( 0 )