2012年6月18日月曜日

QUCSのバイナリインストールでエラーなく動かす

前回のエントリは、MacPortsと混在した場合にQUCSでデジタルシミュレーションを行う際のごたごたを書いた。

MacPortsを使っていない場合は、バイナリインストールをしたあと、2箇所の修正で済むことを確認したので報告する。

まず、QUCS本体のバイナリは、先のエントリにもリンクしたが、こちら。QUCSをLion環境でビルドするのはかなりしんどそうなので、これを利用するのが賢明だと思う。

デジタルシミュレーションするためのVHDLコンパイル環境、FreeHDLのバイナリはこちら。なお、このバイナリは10.5(Leopard)環境でコンパイルされているので、32bitバイナリだ。

Lionは完全64bitに移行しているので、g++も特に指定しなければx86_64アーキテクチャとしてコンパイルしてしまう。しかし、FreeHDLのバイナリがi386アーキテクチャでコンパイルされているのでリンクできない。

そこで、FreeHDLのコンパイルがi386であることを明示しておく。これは、
/usr/local/lib/pkgconfig/freehdl.pc
に書かれている。これを編集して、9行目の

cxxflags=-g -O2

となっているところを、

cxxflags=-g -O2 -arch i386

と追記する。これで、QUCSが自動生成するVHDLファイルから作られるC++ソースがi386でコンパイルされるので、FreeHDLのライブラリとリンクできるようになる。

ただし、リンクの際にGNU libtoolが「tagを指定しろ」といってエラーを出してくるはずなので、
/usr/local/bin/qucsdigi
の85行目

$LIBTOOL --quiet --mode=link $CXX $NAME._main_.o $NAME.o $LIBS $IEEELIBS -o $NAME

を、

$LIBTOOL --quiet --mode=link --tag=CXX $CXX -arch i386 $NAME._main_.o $NAME.o $LIBS $IEEELIBS -o $NAME

のように、--tag=CXXとしてg++だということとi386でリンクすることを明示してやればエラーは出なくなり、シミュレーションは完了するはずだ。

なお、GNU libtoolが使われているので、単にXcodeを入れているだけではQUCSは使えない。少なくともGNU libtoolとGuileが/usr/local/binにインストールされている必要がある。簡単なのは、Homebrew
$ brew install libtool guile
とやっておくことではないかと思う。なお、Homebrewでは/usr/local以下はroot権限ではなくなるので、QUCSとFreeHDLがroot権限でインストールするのとは違ってしまう。例えば、これらをインストールしたあと、
$ sudo chown -R 自分のユーザ名 /usr/local
などとしておくと、上のファイル書き換えもsudoする必要がなく、楽なのではないかと思う。

ついでに、デジタルシミュレーションはFreeHDLに完全に渡してしまい、QUCSは実行結果をビジュアライズするだけなので、QUCSがどのようにコンパイルされているかとは無関係だ。 最新版のFreeHDL 0.0.8のソースは、現在sourceforge上にある。これをダウンロードして、単純に./configure && make installすれば、x86_64でライブラリがコンパイルされるので、freehdl.pcの編集は不要となるし、qucsdigiでも-arch i386の記述は不要にある。コマンドラインに慣れている人は、こちらのほうが簡単でいいかもしれない。

さらに、QUCSはデジタルシミュレーションの際にVHDLとVerilogを選択できるようになっているが、Verilogコンパイラとして期待されているのはIcarus Verilogだ。しかし、これはMacPortsでもHomebrewでもコンパイルが通らない。ところが、上記ページで示されているGitリポジトリからheadをとってきたところ、難なくコンパイルが通り、QUCSでも動いた。関心のある向きは試してみてもよいと思う。なお、bisonを使うので、予めbisonのインストールをしておくことと、autogenしなければならないので、autoconf, autogen, automakeも入れておくことをお忘れなく。