rthornton128/goncurses をインストールしようとして苦労した話

Abstract

表題のとおり、Go 言語で ncurses バインディングであるところの rthrnton128/goncurses を使おうとしてインストールに苦労した話し。 最後には(肯定的な理由で)nsf/termbox-go を使う事にしたのですが、ネタとして供養したいので書いてみます。

goncurses がインストールできない

環境は OS X + Homebew 0.9.5 + Go 1.4.2 です。 goncurses のインストールのためには、まず ncurses と、pkg-config をインストールする必要があるっぽい。 というわけでインストールします。

$ brew install ncurses pkg-config
...

続いて gonucurses をインストールしようとするも、これが通りません。 pkg-config でなんだかかんだか言われているみたいです。

$ go get github.com/rthornton128/goncurses
...
# pkg-config --cflags ncurses form menu ncurses ncurses panel
Package ncurses was not found in the pkg-config search path.
Perhaps you should add the directory containing `ncurses.pc'
to the PKG_CONFIG_PATH environment variable
No package 'ncurses' found
...

どうやら goncurses が想定している ncurses のインストール後の状態と、Homebrew によって作られた ncurses インストール後の状態がうまくかみ合わないみたいです。 具体的には goncurses が参照する pkg-config の .pc ファイルに相当するものが、Homebrew からは作られないみたいです。

Homebrew ncurses の .pc ファイルとして次のようなものを生成します。 見た感じ、w とプリフィックスされていて、マルチバイト対応されたバージョンをインストールしているのでしょうか? goncurses は w プリフィクス付きでないものを想定しているようで、ここで食い違いが発生しています。

  • /usr/local/opt/ncurses/lib/pkgconfig/formw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/menuw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/ncurses++w.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/ncursesw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/panelw.pc

解決策として

作っていたプログラムのリポジトリに、goncurses に対応するための .pc ファイルを用意しました。 用意したファイルは次のとおりです。

pkg-config がこれを参照できるように、環境変数 PKG_CONFIG_PATH を設定します。 シェルの設定ファイルに、こんな感じで追加することにしました。

export PKG_CONFIG_PATH=path/to/repo/pkg-config-files:$PKG_CONFIG_PATH

これで元の goncurses にむやみに手をいれたり、Homebrew の中身を荒らす事無く goncurses がインストールできるようになりました。 この対応を行うにあたり、次の記事が参考になりました(というかほぼそのままです)

なぜ nsf/termbox-go に乗り換えたの?

まず一つに、こんなことがあったので ncurses に依存するのは筋が悪いかなと思い、Pure Go termbox implementation をうたっている termbox-go を選びました。 移植性に優れるという Go の良さをスポイルする選択はしたくないよな、というところです。

二つ目に、作りたいツールが比較的シンプルなコンセプトだったというものがあります。 そもそも両者の目指す方向性は異なるのでしょうが、ncurses とくらべて termbox は良く言えばシンプル、悪く言えば貧弱な印象があります。 しかし、貧弱といえども、作りたいものに合うプリミティブさを持ったライブラリを選択するのが良いと考えた結果となります。