macOS上のRaspbianクロス環境(付け足し) [Raspberry Pi]
こないだのRaspbianクロスコンパイル環境の話のちょっとした付け足し。僕は年寄りなせいでEclpiseを使いこなせない。そこで無理やりXcodeを使うという話、ちょっとしたオマケ付き....
clang+LLVMとbintoolsとEclipseでmacOS上のネイティブなクロスコンパイル環境を作ることができた。ところがEclipseに慣れていないせいで使いづらい。Eclipseは機能が豊富で使うのが僕には難しい。例えばポップアップメニューを開いてやりたいことを探すのに、メニューが長いので順に見てるうちに何をやろうと思っていたのか忘れて、ぼー、っとしてしまうことがよくある。
単に慣れの問題なんだけど、年寄りなもんでXcodeから頭の切り替えができない。Eclipseと同じことがXcodeでできればいいんだけど、どうやらAppleはXcodeをAppleのプラットフォーム(macOS、iOS、tvOS、watchOS)以外へのビルドやデバグ作業ができないようにかなりがんじがらめに制限しているようである。こういうところになぜかAppleは厳しい。
最も大きな問題は長時間使うエディタで、Xcodeのエディタが使えるだけでもずいぶんマシになる。それは簡単でXcodeとEclipseの両方でそれぞれプロジェクトを作って(当然、Xcode側ではmacOS用のコマンドラインがターゲットでEclipseではRaspbian向けのクロス)、XcodeかEclipseかどちらかでファイルを作ったとき、それをもう一方のプロジェクトにもインポートすればいい。つまり両方のプロジェクトで同じファイルを参照させるようにする。
例えばXcodeではProject Navigatorのファイルの名前が並んでる上でポップアップメニューを開いて 「Add files to "project"...」でファイルを読み込んで、「Copy files if needed」のチェックを外せばいい。Eclipseではポップアップの「Import...」から「File system」を選んで、ダイアログの左下にある「advanced >>」を開いて「Create links in workspace」にチェックを入れるとファイルはコピーされずにシンボリックリンクが作られる。
これで、Xcodeでの編集がEclipseでも反映される。ついでにXcodeの「Build Settings」で「Header Search Path」にsysrootの/usr/local/includeなんかを指定しておけば、POSIXの範囲であればXcodeでコンパイルすることができるので、コンパイルを試してlintの代わりぐらいのことはできる。もちろんビルドできてもmacOS用のコマンドアプリができるだけだし、実行できたとしても意味はない。
Xcodeの上で一通りソースが編集できでコンパイルエラーが出なくなればEclipseへ移ってクロスコンパイルしてリモートデバグ、という手順を続ければいい。これだとエディタだけでなくコード補完や検索置き換えリファクタリングにバージョン管理、その後のコンパイルリンクエラーの特定もEclipseではなくXcode側でできるので、ちょっとはマシになる。
うまくいかないのはmacOSになくてRaspbianにある機能を使おうとした場合。Linux特有のPOSIXにない機能、たとえばsysfsとか、macOSにあっても微妙に引数が違ったりするライブラリの一部とかでは当然コンパイルに失敗してしまう。これはどのみち大したことではないんだけど、すごく鬱陶しい。しょうがないのでそのたびごとにスタブを作ってコンパイルだけは通るようにしていた。
一番鬱陶しかったのはpigpioライブラリを使う場合。そもそも僕がRaspbianを使いたいのはGPIOやSPIやI2Cを使いたいからで、それを使わないなら僕にとってはmacOSで十分なわけで、そしてそういうのを使うときはほとんどの場合pigpioライブラリを経由している。つまり、Raspbian向けのコードを書くときはほとんどpigpioライブラリを使うことになって、そうするとXcodeでコンパイルリンクチェックができない。
コンパイルチェックぐらいと思うんだけど、Raspbian向けのプロジェクトはそれほど大きなものにはならなくて、ソースファイルはせいぜい10〜20個、中身もそれほど難しくないのでソースを書く前に構造を絵に描いてそれを眺めて悩む、なんてことは少ない。そのせいでちょっと書いてはコンパイルを試してみる、というのが癖になっていて、そのたびにEclipseに切り替えるのは作業のリズムとして悪くなってしまった。
ということでpigpioライブラリのスタブを作った。macOS用のMach-O形式のx86_64シェアドライブラリ。もちろんリンクまで通したいだけなので中身は何もないし何もしないんだけど、pigpioライブラリのヘッダにある全関数が入ってるので、これをリンクするとコンパイルは通る。これのおかげでほんのちょっとだけ作業性が増した。
ということでこのmacOS用pigpioスタブライブラリを公開(リンク先はDropboxの共有ファイル)します。これを解凍するとlibpigpio.dylibができるのでそれを適当なところ(例えば/usr/local/libとか。もちろんpigpio.hへのパスも通した上で)にコピーして、Xcodeの「Link Binary with Libraries」に追加するとpigpioライブラリを呼んでいるコードがXcode上でリンクまで通ります。実行も可能ですが、全ての関数(gpioVersion()以外)はなにもせず、void以外を返す関数は成功したコード(intを返す関数の多くは0)を返します。
macOSネイティブのクロス環境を使っていて、かつpigpioライブラリをリンクして、かつ僕みたいなXcodeで編集してるひとは使ってみてください。いったい全世界に何人いるんだろうか、という疑問はないでもないけど。
clang+LLVMとbintoolsとEclipseでmacOS上のネイティブなクロスコンパイル環境を作ることができた。ところがEclipseに慣れていないせいで使いづらい。Eclipseは機能が豊富で使うのが僕には難しい。例えばポップアップメニューを開いてやりたいことを探すのに、メニューが長いので順に見てるうちに何をやろうと思っていたのか忘れて、ぼー、っとしてしまうことがよくある。
単に慣れの問題なんだけど、年寄りなもんでXcodeから頭の切り替えができない。Eclipseと同じことがXcodeでできればいいんだけど、どうやらAppleはXcodeをAppleのプラットフォーム(macOS、iOS、tvOS、watchOS)以外へのビルドやデバグ作業ができないようにかなりがんじがらめに制限しているようである。こういうところになぜかAppleは厳しい。
最も大きな問題は長時間使うエディタで、Xcodeのエディタが使えるだけでもずいぶんマシになる。それは簡単でXcodeとEclipseの両方でそれぞれプロジェクトを作って(当然、Xcode側ではmacOS用のコマンドラインがターゲットでEclipseではRaspbian向けのクロス)、XcodeかEclipseかどちらかでファイルを作ったとき、それをもう一方のプロジェクトにもインポートすればいい。つまり両方のプロジェクトで同じファイルを参照させるようにする。
例えばXcodeではProject Navigatorのファイルの名前が並んでる上でポップアップメニューを開いて 「Add files to "project"...」でファイルを読み込んで、「Copy files if needed」のチェックを外せばいい。Eclipseではポップアップの「Import...」から「File system」を選んで、ダイアログの左下にある「advanced >>」を開いて「Create links in workspace」にチェックを入れるとファイルはコピーされずにシンボリックリンクが作られる。
これで、Xcodeでの編集がEclipseでも反映される。ついでにXcodeの「Build Settings」で「Header Search Path」にsysrootの/usr/local/includeなんかを指定しておけば、POSIXの範囲であればXcodeでコンパイルすることができるので、コンパイルを試してlintの代わりぐらいのことはできる。もちろんビルドできてもmacOS用のコマンドアプリができるだけだし、実行できたとしても意味はない。
Xcodeの上で一通りソースが編集できでコンパイルエラーが出なくなればEclipseへ移ってクロスコンパイルしてリモートデバグ、という手順を続ければいい。これだとエディタだけでなくコード補完や検索置き換えリファクタリングにバージョン管理、その後のコンパイルリンクエラーの特定もEclipseではなくXcode側でできるので、ちょっとはマシになる。
うまくいかないのはmacOSになくてRaspbianにある機能を使おうとした場合。Linux特有のPOSIXにない機能、たとえばsysfsとか、macOSにあっても微妙に引数が違ったりするライブラリの一部とかでは当然コンパイルに失敗してしまう。これはどのみち大したことではないんだけど、すごく鬱陶しい。しょうがないのでそのたびごとにスタブを作ってコンパイルだけは通るようにしていた。
一番鬱陶しかったのはpigpioライブラリを使う場合。そもそも僕がRaspbianを使いたいのはGPIOやSPIやI2Cを使いたいからで、それを使わないなら僕にとってはmacOSで十分なわけで、そしてそういうのを使うときはほとんどの場合pigpioライブラリを経由している。つまり、Raspbian向けのコードを書くときはほとんどpigpioライブラリを使うことになって、そうするとXcodeでコンパイルリンクチェックができない。
コンパイルチェックぐらいと思うんだけど、Raspbian向けのプロジェクトはそれほど大きなものにはならなくて、ソースファイルはせいぜい10〜20個、中身もそれほど難しくないのでソースを書く前に構造を絵に描いてそれを眺めて悩む、なんてことは少ない。そのせいでちょっと書いてはコンパイルを試してみる、というのが癖になっていて、そのたびにEclipseに切り替えるのは作業のリズムとして悪くなってしまった。
ということでpigpioライブラリのスタブを作った。macOS用のMach-O形式のx86_64シェアドライブラリ。もちろんリンクまで通したいだけなので中身は何もないし何もしないんだけど、pigpioライブラリのヘッダにある全関数が入ってるので、これをリンクするとコンパイルは通る。これのおかげでほんのちょっとだけ作業性が増した。
ということでこのmacOS用pigpioスタブライブラリを公開(リンク先はDropboxの共有ファイル)します。これを解凍するとlibpigpio.dylibができるのでそれを適当なところ(例えば/usr/local/libとか。もちろんpigpio.hへのパスも通した上で)にコピーして、Xcodeの「Link Binary with Libraries」に追加するとpigpioライブラリを呼んでいるコードがXcode上でリンクまで通ります。実行も可能ですが、全ての関数(gpioVersion()以外)はなにもせず、void以外を返す関数は成功したコード(intを返す関数の多くは0)を返します。
macOSネイティブのクロス環境を使っていて、かつpigpioライブラリをリンクして、かつ僕みたいなXcodeで編集してるひとは使ってみてください。いったい全世界に何人いるんだろうか、という疑問はないでもないけど。
2018-08-29 21:32
nice!(0)
コメント(0)
コメント 0