GNURadioは、SDRツールキットとして他に代え難いものですが、さまざまな理由から環境が用意しにくいのです。Linuxであれば、標準的なインストーラでセットアップが完了するのですが、OSXではハードルが少し高いです。
以前にもOSXでGNURadioのセットアップしましたが、今回改めて環境を整備してみました。パッケージ管理は定番のHomebrewを使います。構成のポイントを整理しておきます。
最近のHomebrewでは、GNURadioのformulaが用意されています。しかもバイナリでインストール可能となっているのですぐに使えます。ところが残念ながら、バイナリインストールされるGNURadioは、GUIをサポートしていません。そして残念なことに、gnuradio-companionがディセーブルされていて使えないという問題があります。gnuradio-companionはGNURadioの主要な操作系ですので、これが使えないのは致命的とも言えます。オプションを追加して、gnuradio-companionを使えるよう試みたのですが、ビルドは成功するものの動作させることができませんでした。
以前にもGNURadioをHomebrewでビルドした手順を解説しましたがすでに内容が古くなっていますので、今回また改めてGNURadioの構築手順を整備することにしました。以下その解説です。
GNURadioのインストールには落とし穴が多く、なかなか成功しません。主な理由として、構築に必要なツールの選択肢がいくつもあり、それらを一貫性を持って合わせていく必要があるためです。大きく言語の問題と、GUIツールキットの問題があります。
GNURadioは、C++とPythonを使用しているのですが、まずはC++についてです。
- C++コンパイラに、gcc、またはclangという選択肢があります。後者はxcodeの一部として提供されているものです。
- C++には言語のバージョンがいくつもあり、一部のモジュールは特定のバージョンを要求します。C++11 を選びます。
- 標準ライブラリに、newlib, stdlibという選択肢があり、これの不一致はリンク失敗の原因となる。
一方Pythonについても、バージョン問題に加えて、どの実装を使うか問題があります。
- Python2とPython3があり、現行バージョンのGNURadioではPython2を使用する必要がある。
- Homebrewの場合には、Pythonバイナリを直接リンクするのではなく、dynamic lookupを指定をする。直接リンクしてしまうと、マイナーバージョンの変化にも追従できなくなるためと思われます。
OSXの場合、PythonはOSにもともとインストールされています。しかし、通常の利用ではHomebrewやpyenv、virtualenvなどの方法で後からインストールで追加したPythonを使うことが一般的です。GNURadioの構築でこれらのPythonを混ぜて使うと、実行時にエラーとなってしまいます。そのため、構築の途中で、どのPythonが使われるか留意が必要です。特にOSXにもともと入っているPythonが使用されることがないよう慎重に排除する必要があります。cmakeのモジュール、もしくはPATH変数など、Formulaや各モジュールに数多くのpythonの依存解決の場所があり、これらを一貫させる必要があります。
言語の他にも、GUIについても配慮する必要があります。
- WXとQTの2種類のGUIツールキットをサポートしている
- QTの現行バージョンは5だが、gnuradioが要求するのは4
QT4は、デフォルトのHomebrewではサポートされていませんが、有志がTapとして提供してくれているので、これを使います。
これらをえいやっと解決して、パッチをまとめてHomebrewのFormulaとして用意しました。https://github.com/ttrftech/homebrew-gnuradio に置いてありますので、tapとして利用することができます。
$ brew tap cartr/qt4
$ brew tap ttrftech/gnuradio
$ brew install ttrftech/gnuradio/gnuradio --with-qt
RTL-SDRなど多くのSDRフロントエンドで使うためには、gr-osmosdrが必要となります。同じtapの中に、いくつかのフロントエンドを追加したものを作成しました。
$ brew install ttrftech/gnuradio/gr-osmosdr
バージョンが少し古い(3.7.10.1、最新は3.7.11.2)のと、実行時にいくつかウォーニングが出るのがちょっと気になります。が使えてはいるようです。
今回Homebrewは、Formulaが正しいかチェック(audit)するコマンドがコマンドが用意されています。当初コンパイル成功して動くようになった後、brew auditしてみるとこんな感じでいくつか不具合を指摘されました。以下はpythonのリンクが正しくされていないという指摘の例です。
$ brew audit ttrftech/gnuradio/gnuradio
ttrftech/gnuradio/gnuradio:
* python modules have explicit framework links
These python extension modules were linked directly to a Python
framework binary. They should be linked with -undefined dynamic_lookup
instead of -lpython or -framework Python.
/usr/local/opt/gnuradio/lib/python2.7/site-packages/gnuradio/qtgui/_qtgui_swig.so
Error: 1 problem in 1 formula
これをログやソースから調べて問題を解消していきました。何も問題がなければ何も文句を言われなくなります。
$ brew audit ttrftech/gnuradio/gnuradio
$
とりあえずGNURadioがGUI付きで使えるようになりました。インストール手順はREADME.mdにも記載しています。もし間違いや動作しないなどの不具合があれば詳しくお知らせください。
いくつかフロントエンドを入手して、GNURadioで使えるよう整備していますので、引き続きこちらも紹介したいと思います。
参考
- 作成したFormula https://github.com/ttrftech/homebrew-gnuradio
- 元にしたFormula https://github.com/rixon/homebrew-gnuradio/
- 以前解説した手順 「 gnuradio 3.7をHomebrewでMac OSXにインストールする」
- GNURadio本家 https://gnuradio.org/