読者です 読者をやめる 読者になる 読者になる

Homebrew 使った Ricty インストールエラー で分からなかった事 in Yosemite

tech macos settings

OSX Yosemite リプレイスにて、メモ。

作業環境の構築は、自前の shellscript を用意していて、そいつを流すだけ、な感じにすることで負担軽減をしている。

が、何やらエラーで止まってしまっているご様子。

見ると、Ricty のトコらしく。

しかも、それは 1 つのみならずと、さらに 2 つ立て続け、と来たもんだ。

一気に気が滅入る。

ErrorError / Nick J Webb

よく見られる xquartz のエラーに関しては、随分前に遭遇していたので認識はしており、既に対策をしていたのですが。

何よ。

automake が無いとか、

==> Installing ricty dependency: fontforge
Error: /usr/local/opt/automake not present or broken
Please reinstall automake. Sorry :(

pkg-config が無いとかって。

==> Installing ricty dependency: fontforge
Error: /usr/local/opt/pkg-config not present or broken
Please reinstall pkg-config. Sorry :(

こんなの前からあったっけ? ...何か納得できない。

と何を血迷ったか、formula 何それ?、ってモードになってしまった。

今更に。素人なのに。ruby 何も知らないのに。

ricty のインストールには、sanemat/homebrew-font を利用させて頂いております。
今回はここが迷宮の入り口となるわけです。

brew cask で "xquartz" をインストールし、depends_on で automake と pkg-config を謳えば良い

長くなりそうな感じがするので、先に結論。

やることは 2 つ。
残念ながら、ricty の formula 内だけで解決する方法は分かりませんでした。

まず、ricty インストールのプロセス前に cask で xquartz をインストール

幸いなことに、homebrew-cask に xquartz があります。
なので、;

% brew cask install xquartz

試してませんが、ricty の formula が走る前に、これを入れておいた方が良いと思います。

次に、ricty.rb に depends_on automakedepends_on pkg-config 追加

今度は ricty の formula での話です。

automake と pkg-config が無い、と怒られるので、
ricty の formula 内に、この依存関係を指定します。

該当部分辺りだけ示しますと、こんな感じになるかと。;

  depends_on "automake"   => :build     # 追加
  depends_on "pkg-config" => :build     # 追加
  depends_on 'fontforge'  => 'with-python'
 :

ちなみに、この 2 つのツールの導入は、勿論直接 brew install してしまっても良いとは思います。
ricty インストールの前のタイミングに、まとめてこうでも。;

% brew cask install xquartz
% brew install automake
% brew install pkg-config

と言うことで一応、sanemat/homebrew-font を clone させて頂いて、
自分の formula としてこんな感じにしました、と。*1

さて。
以下、こうなるまでの試行錯誤。

恐縮ではありますが、たぶんそんなに重要な事を書いていないかもしません。
ご存知の方には、当然の事ばかりかと。

また、もしかしたら本当に分かってない故、間違ったことを書いているかもしれません。
そんな誤記、誤解がございましたら、遠慮なくご指摘頂けると助かります。

すみません。

brew install してないけど、入ってくるもの。depends_on のたぶん。

経験的に、brew install ... していないアイテムが入ってきているのは横目に捉えていたので、恐らくこう言う事なのだろうと。

この仕組みをもって、"必要なのに無いアイテム" を入れてもらうようにすればよい、と察する。

ドキュメント みてみると、こういうのは "依存 dependency" とか言うらしく、depends_on を使うというのはすぐ把握できた。

xquartz も、automake も pkg-config もこの depens_on によって入れてもらえるようにすればいーじゃん?、と。
如何にも素人じみた稚拙な思考回路(笑

ちなみに、homebrew の世界で xquartz は "x11" とな。
例えば、xquartz を指定するのならば depends_on :x11 とかと書くみたいなのだけど、気になるの記述があって。

x11 とかみたいんは "特殊な関係 special conditional dependency" 言ってますが、これ、どういうこと?

xquartz (x11) は? depends_on :x11 -> 味しない

と、考えてばかりいてもしょうがないので、ricty.rb を clone し、実際に動かしながらやってみることに。

しかし全力で全開に分からない prz

まず、xquartz について。

ricty.rbを見てみると、depends_on 'fontforge' => 'with-python'

fontforge
でしょうね、とは思うものの、あー、って感じ。またお前か、と。

改めて出力されているエラーに目をやると、cairopango と言うアイテム上で怒られている様子。;

$ brew install ricty
==> Installing ricty from woowee/homebrew-font
cairo: Unsatisfied dependency: XQuartz 0.0.0
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
pango: Unsatisfied dependency: XQuartz 0.0.0
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
Error: Unsatisified requirements failed this build.

fontforgeの formula 覗いてみると、確かに cairopango が。
どうやら、そういうことみたい、だと。

でも見ると、fontforge.rb内でも、x11 に関する指定があるけどな、とは思ったものの、
とりあえず、ricty.rbにも depends_on :x11 って追記してみる。

結果。変化ナーシ。

とここで、エラーの内容が変わっていることに気付いた。具体的に引用。;

$ brew install ricty
==> Installing ricty from woowee/homebrew-font
ricty: Unsatisfied dependency: XQuartz 0.0.0
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
cairo: Unsatisfied dependency: XQuartz 0.0.0
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
pango: Unsatisfied dependency: XQuartz 0.0.0
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
Error: Unsatisified requirements failed this build.

ricty: Unsatisfied dependency: XQuartz 0.0.0 が加わっている。
そういうことですなのですね。

xquartz (x11) は? depends_on "fontforge" => ["with-x"] -> 味しない

じゃなくて、fontforge に対してしなくてはならなかったり?

と言うことで、文字列や配列を使った指定方法の記述が気になりだす。

なので、今度はこんな感じを depends_on "fontforge" => ["with-x"] 書いてみる。

ちなみにこの参照先は、コレ

結果。
勿論、変化ナーシ。勘違いだし。

ちなみに後でわかったのですが、fontforge がなぜ Unsatisfied dependency: XQuartz 0.0.0 と謳わないかは、
depends_on :x11 if build.with? "x" の "if" のせいっぽい。

cario と pango 側では、depends_on :x11 => :recommended となっている。

xquartz (x11) を指定する意味って?

結果、xquartz に関しては元に戻しました。
ricty のインストール処理前に brew cask install "xquartz"

xquartz (x11) に関しては、依存関係を指定しても、他のツールみたく "必要なのに無いんだったら獲ってきてインストールしてやる" な事はしない、と言うことで良い?

先のエラーの内容が変わった、で触れたように、
エラーとしてユーザーへ伝えるための仕組みとして存在する、という理解でよいのかな。
導入まではやらない(やれない?)けど。

とは言え、
なぜ、他のアイテムと同じように扱わない/扱われない、この "同じにしないこと" の理由が自分の想像力を超えていて、今いちスッキリしないところ。

それがドキュメントにあるような特別な依存関係 special conditional dependency 、ということなのでしょうか?

確かに brew deps ricty で見た時、x11 って無くて「?」と思ったけど。

$ brew deps ricty
autoconf
automake
cairo
fontconfig
fontforge
freetype
gettext
glib
gobject-introspection
harfbuzz
icu4c
jpeg
libffi
libpng
libtiff
libtool
pango
pixman
pkg-config
python
xz

automake と pkg-config については、素直に depends_on

こちらはすんなりと、ricty の formula 内に、当該ツールの依存関係を記述することで行けるようになった。

fontforge 等の formula を覗いて、参考にさせていただきながら、以下の 2 行を、fontforge の依存を指定している行の前へ追加。;

  depends_on "automake"   => :build     # コレ追加
  depends_on "pkg-config" => :build     # コレ追加
  depends_on 'fontforge'  => 'with-python'
  :

:build シンボル symbol を指定した理由は、深い意味はなく、参照元とした fontforge でそうだったから。

見ての通り、ビルドの時だけその依存関係 dependency を見る、というな感じらしいのですが。

fontforge の formula にも、キチンとあるわけで。;

# Autotools are required to build from source in all releases.
# I have upstreamed a request to change this, so keep monitoring the situation.
depends_on "autoconf" => :build
depends_on "automake" => :build
depends_on "pkg-config" => :build
: *snip*
depends_on :python if MacOS.version <= :snow_leopard
via. [homebrew/fontforge.rb at master · Homebrew/homebrew][20]

なぜ? と。

depends_on によるインストールでは、:build じゃない?

ってこと?

ちなみに、以前は確かこんなエラーに遭遇しなかったよな、と言うのを確かめたくて、辿ってみることにした。

すると。

やはり以前 :build シンボルは指定されてなかった様子。

「じゃいつ、どんな背景をもって :build を付けることになった?」というのも気になるわけで。

この :build シンボルの追加修正が入ったのは、今年 2014/06/02 のこと。
"fontforge: modernize autotools deps" なコメントのもとに対応されているようなのだけど、その背景の把握の方法が分からず、理由がわからない。*2

いずれにせよ、具体的な内容は分からないのですが、ある意図をもってなされた事であるの間違いない様子。

さらに、ソース内に気になるコメントが。

# Autotools are required to build from source in all releases.
# I have upstreamed a request to change this, so keep monitoring the situation.

様子見、って?

ちなみにこのコメント入れられたのは、2014/10/14。割と最近。

ところで

xquartz の depends_on を検討している中で、depends_on "fontforge" => ["with-x"] な指定方法を考えている時思ったことがあるのですが。

depends_on 'fontforge' => 'with-python'python って必要なのでしょうか。

この辺りは、この辺りで議論されていたようで、
fontforge.rb には、今年の夏ごろに手が入れられたようですが。

と言うことで、駄文うえに長文、恥ずかしい限りで。失礼しました。
で、おしまいです。

*1:fork して..なんてできませんwww

*2:こういうことの調べ方ってどうやると良いのでしょう。。。