Tagbangers Blog

Windows Subsystem for Linux に Linuxbrew で brew install cask してしまった失敗談

こんにちは! 最近 Mac のキーボードに慣れてきて逆に Windows のキーボードが打てなくなり始めてる方の山﨑です。

Excel とかの操作は今でも Windows版の方が使いやすいと思うし、 Windows には Mac にはない良さがたくさんあると思っていて、
もちろん逆も然りで、明日から開発は Windows でやりますとか言われたら正直つらいなと思うくらいには Mac にも依存してます。

そんな感じで自宅では Mac と Win10 両方使ってるのですが、
ずっと気になっていた Windows Subsystem for Linux (WSL) を試してみようと思い立ったのでやってみました。

とりあえずインストールはこちらの記事の通りにやればOKです。
https://qiita.com/yukio_tokuyoshi/items/042546812c663ceeccf3

ちなみに今回使ったディストリビューションは Ubuntu 18.04

で、じゃあそれで何するのということで、まずは Mac なら Homebrew をインストールするのですが、
Linux にも似たようなものがあっていいんじゃないのってことでぐぐったらありました。

https://qiita.com/tikogr/items/e19c2a2cec41a8d4d85f

Linuxbrew というそうです。まんまやがな。ひねれ。ひねれよ。

インストール自体は記事の通りにそのまま進めればOKそうです。

で、ここからが本題なのですが、 brew を使うならついでに cask も入れてみるかと思ったけれどもまあ意味ないよねっていうお話です。

なので以下は何の価値も無い文章なのですが、せっかくやってみたので無駄な事をした失敗談として記事にしてみようと思います。

とりあえずまずは、

$ brew install cask

しました。そして無事インストールに失敗したときのエラーメッセージがこちらになります。↓

Updating Homebrew...
==> Installing dependencies for cask: patchelf, zlib, m4, gmp, mpfr, libmpc, isl@0.18, gcc, libtasn1, libunistring, nettle, libffi, p11-kit, openssl, libevent, libbsd, expat, unbound, bdw-gc, libtool, pkg-config, ncurses, readline, gperf, guile, gdbm, sqlite, xz, bzip2, python, libxml2, autogen, gnutls, jpeg and emacs
==> Installing cask dependency: patchelf
==> Downloading https://linuxbrew.bintray.com/bottles/patchelf-0.10.x86_64_linux.bottle.tar.gz
Already downloaded: /home/shige/.cache/Homebrew/downloads/405227c46362964d2bc2e9ff6428fe082dff4dbd3a4b0b29453743f71923304b--patchelf-0.10.x86_64_linux.bottle.tar.gz
==> Pouring patchelf-0.10.x86_64_linux.bottle.tar.gz
Error: patchelf must be installed: brew install patchelf
Warning: Bottle installation failed: building from source.
Error: The following formula
  patchelf
cannot be installed as binary package and must be built from source.
Install Clang or run `brew install gcc`.

人生うまくいかんもんです。

Tagbangers に入社してこの方、当然あっさり上手くいくだろうと思い込んでるもの程うまくいかないという事は山程あったので今更このくらいでは驚きません。

さて、何が気に食わないというのか。止せばいいのにエラーを見ていきます。


どうも、 cask をインストールするのには patchelf なるものが必要で、その patchelf をインストールしようとして、ソースからビルドしてインストールを試みて、
Clang なるものか、 gcc なるものが必要なのでインストールができないと。

仕事中は時間が惜しいので依存しているこれらについていちいち調べたりはしないのですが、今日はお休みで少し時間に余裕があるので軽く調べてみようと思います。

patchelf.... PatchELF の事だそう。 ELFってなんやねん。

ELF....  Executable and Linkable Format の略。 Linux や Unix で使われるファイルの実行形式の事だそう。で、patchelf はELF ファイルを実行するときのインタプリタを指定(変更)したりなどするものだそう。
(コンパイラじゃなくて?と思いましたがぐぐるとインタプリタと書いてありました。詳細は今回は追わず)
どうもそこを深く掘り下げる事に意味はなさそうなので、要は cask をインストールするのに使うつもりだったけどそれがないからソースが読めないぞと。

で、最後に Clang と gcc

Clang.... C系の言語に対応したコンパイラ

gcc.... GNU Compiler Collection の略。色々な言語に対応したコンパイラ。  Clang と違って Java や Go も読めるよう
ちなみに GNU の読み方には「ぐにゅー」派と「ぐぬー」派がいるそうで、この記事によると「ぐぬー」が正解だそう。どちらにせよ読み方がかわいい。
http://www.cam.hi-ho.ne.jp/mendoxi/bug/computerese.html#gnu


つまりまとめると、

gcc や Clang が入ってないので patchelf のソースがビルドできない → cask が patchelf に依存しているので cask がインスコロールできない

という事らしく。そもそも cask をインストールしても意味がない事に気付いていない山﨑は、想像していたよりは単純な壁だなと一安心していました。

あとは実行あるのみです。やめときゃいいのに。

関係ありませんが趣味で壁にぶち当たるときは焦らなくていいからちゃんと調べられて楽しいですね。

コンパイラはどちらでも良いようなので、まずは gcc を試してみます。

$ brew install gcc
==> Installing dependencies for gcc: patchelf, zlib, gmp, mpfr, libmpc and isl@0.18
==> Installing gcc dependency: patchelf
==> Downloading https://linuxbrew.bintray.com/bottles/patchelf-0.10.x86_64_linux.bottle.tar.gz
Already downloaded: /home/shige/.cache/Homebrew/downloads/405227c46362964d2bc2e9ff6428fe082dff4dbd3a4b0b29453743f71923304b--patchelf-0.10.x86_64_linux.bottle.tar.gz
==> Pouring patchelf-0.10.x86_64_linux.bottle.tar.gz
Error: patchelf must be installed: brew install patchelf
Warning: Bottle installation failed: building from source.
Error: The following formula
  patchelf
cannot be installed as binary package and must be built from source.
Install Clang or run `brew install gcc`.

 

 

おお。。。。。

 

はい。無事失敗しました。いいぜとことんやってやんよです。

今度のエラーは、 gcc をインストールするには patchelf が要りますよって言われているように見えます。

で、 patchelf をインストールするには gcc が必要ですと。なるほど。

。。。。。。。。。。ええ?

 

ちなみに brew install clang や brew search clang ではデフォルトではそれらしいものが見つかりませんでした。

リポジトリを探してきて追加してもよいのかもしれませんがそれはなんか面倒だったのでやりませんでした。

代わりに、

$ sudo apt-get install gcc

そう、普段 Mac だと brew からしかアプリケーションをインストールしないのですが、 Ubuntu なら普通に apt-get してくりゃいいという話で。

でも失敗しました(ログは長かったので省略)

代わりに、

$ sudo apt update
$ sudo apt install clang

してあげたところ、

$ clang --version
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

来ました。これで勝ったも同然。

試しにこの状態で brew install gcc すると成功しました。

やはりコンパイラが無かったのと、デフォの状態では brew からコンパイラがインストールできないという事がわかりましたね。

で、 patchelf をインストールします。

$ brew install patchelf
Warning: patchelf 0.10 is already installed and up-to-date
To reinstall 0.10, run `brew reinstall patchelf`


        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄


そうですよね。 Clang や gcc のインストールにそもそも patchelf が必要ってことは、 apt install したタイミングで同時にインストールされてるはずなわけで。

気を取り直して brew install cask してみたところ、10分くらいなんやかんやと依存しているツールのインストールで待たされたあと、

$ brew list
autogen  cask   gcc   gnutls  isl@0.18  libevent  libtasn1      libxml2  nettle   patchelf    readline  xz
bdw-gc   emacs  gdbm  gperf   jpeg      libffi    libtool       mpfr     openssl  pkg-config  sqlite    zlib
bzip2    expat  gmp   guile   libbsd    libmpc    libunistring  ncurses  p11-kit  python      unbound


きてますね。

しかし cask インストールしたかっただけなのにむちゃくちゃ色々インストールされてます。


それはまあ良いとして、早速 cask を使ってなにかインストールしてみようと思います。

$ brew cask install google-chrome
Error: Installing casks is supported only on macOS

ん・・・?

$ brew install hello
$ hello
Hello, world!

うんうん


$ brew cask install google-japanese-imegoogle-japanese-ime
Error: Installing casks is supported only on macOS


んんんんー????


ざっとぐぐった感じ、 linuxbrew  のリポジトリは別に Linux 版専用のリポジトリを使ってるとかではなく、
普通に Mac 版と同じものを使ってる様子。

コマンドラインで動くようなアプリケーションは OS 関係なく動くけれども、
GUI がついてるようなものは Mac 用のアプリケーションをインストールしても無意味なのでサポートしてませんよって事と理解しました。

 

Linuxbrew っていうくらいだから Linux 用の GUI アプリケーションもインストールできるのかなと思ったら別にそんな事はなく。

バカ丸出しだったというオチでした。


ちなみに、 linuxbrew と似たような Linux 向けのパッケージ管理ツールに「snappy」 というのがありますが、

$ snap find hello-world
Interacting with snapd is not yet supported on Windows Subsystem for Linux.
This command has been left available for documentation purposes only.

という事で、 WSL が普及するにはちょっとまだ時間かかるんだろうなと。

ま、homebrew について少し理解が深まったという事でこれはこれで良しとしようと思いました。