rcmdnk's blog
Last update

20190208_homebrew_200_200

Homebrew 2.0.0がリリースされこれまで別途開発が進められていたLinux用のLinuxbrewが Homebrew本体に統合されました。

そこでこれまでLinux環境でローカルに自分でインストールしていたものを Homebrewで入れる様にしてみました。

また、パッケージ管理用のHomebrew-fileについてもLinuxに対応させました。

これまでのLinuxローカルパッケージ

共用マシンなどで自由にシステムにパッケージが入れられない環境で 自分のHOMEディレクトリに必要なパッケージをインストールして使うことがよくあります。

その際、それぞれ自分で毎回手動でコンパイルしてインストールするのは結構大変で また管理も面倒です。

そういったユーザー用の管理ツールはいくつかあってこれまで試してきました。

pacoはインストール自体は自分で行いますが、パッケージ管理がちょっと出来る様になるツール。

Stowもpco同様パッケージ管理ツールですがよりシンプルなものになっています。 これを使ってstow-getというツールを作って、所謂Homebrew的に 各パッケージのconfiguration fileをあらかじめ用意してそれに従って パッケージをインストール出来る様にしていました。

これはそれなりにきちんと動いていて、各パッケージの最新パッケージも自動で確認出来る様になっているので 結構便利だと思います。

ただ、余り広められなかったのでパッケージファイルは自分で必要なものしかないし、 そうであるので逆に他の人には使いづらいものになっていたかもしれません。

そんな中、HomebrewのLinux版、Linuxbrewの開発が進んでいて、 Linuxbrew自体は大分前からあるものですが、 以前一度Linuxbrewを使おうとしてエラーが出たところで使うのをやめていました。

が、今回Homebrewに統一されたということでもう一度試してみようということで色々見てみました。

Linuxbrew to Homebrew

Homebrew 2.0.0が今月リリースされこれまで別途開発が進められていたLinux版Homebrew、LinuxbrewがHomebrew本体に統一されました。

Linuxbrew The Homebrew package manager for Linux

Linuxbrewはシステム領域の/usr/binなどではなく、ユーザー権限でインストール出来る領域に ソフトウェアをインストールするツールです。

インストール領域

Macでは/usr/local/がデフォルト領域ですが、Linuxbrewでは/home/linuxbrew/.linuxbrewが デフォルト領域になります。 この領域は通常ユーザーでは作れないのでsudoで作れる権限を持っているかあらかじめ Homebrewを使うユーザー様にディレクトリを作って権限を変更したりする必要がありますが、 そうでない場合はユーザーのHome、$HOME/.linuxbrewにインストールすることになります。

ユーザーが自分のためだけに入れるのだから最初から$HOME/.linuxbrewの方が 良い様な気もしますが、 bottleを通して入れる際に$HOME/.linuxbrewだと問題が起こる場合があります。

というのもbottleはあらかじめコンパイルされているためすばやくインストールすることが可能ですが、 コンパイル環境は/home/linuxbrew/.linuxbrewを使っています。 パッケージによってはパスをハードコードして埋め込んでしまうものがあり、 その様なものは$HOME/.linuxbrewに入れると上手く動かないことがあるからです。

FAQ · Linuxbrew/brew Wiki

そのためそういったパッケージに関しては$HOME/.linuxbrewの場合には ソースからコンパイルするオプション(-s/--build-from-source)が自動で 有効にされる様になっています。

それでも対応が出来てないパッケージなどもある可能性があるので できれば/home/linuxbrewを使ったほうが安全ですしbottleを常に使える分インストールが速いです。

ただ、Linuxbrewを使いたいのはyum/apt-getなどで/usr/binに インストールすることが出来ない権限のユーザーが自分用にパッケージを入れたい、 という場合が多いと思います。 その場合は/home/linuxbrewを作れないことがほとんどだと思うので $HOME/.linuxbrewにインストールすることになります。

Macの場合と違い、LinuxではOSからして色々あり 環境によっては上手く動かない場合もまだあるみたいですが、 この辺りもHomebrewに統合されてユーザーが増えればどんどん改善されていくと思います。

Homebrew@Linuxのインストール

準備として最低限curlが入っていることが必要です。

また、/home/linuxbrewを作れず$HOME/.linuxbrewにインストールする場合には gccもあらかじめインストールされている必要があります。

公式ページには

Debian or Ubuntu:

$ sudo apt-get install build-essential curl file git

Fedora, CentOS, or Red Hat

$ sudo yum groupinstall 'Development Tools' && sudo yum install curl file git

の各インストールが要請されていますが、 gitなどはインストール過程でHomebrew版がインストールされます。 (Homebrewのインストール過程で/usr/bin/which: no git in…みたいなwarningが出て 通常最初にインストールされるものがインストールされなかったりしますが取り敢えずそのまま続けて大丈夫です。)

gcc/home/linuxbrewにインストールする場合はbottleからインストールされるので 別途必要ありません。

HOMEにインストールする場合、Homebrewのインストール自体は出来ますが、 その後なにかインストールしようとすると

$ brew install go
Error: The following formula
  curl
cannot be installed as binary package and must be built from source.
Install Clang or brew install gcc
Error: The following formula
  git
cannot be installed as binary package and must be built from source.
Install Clang or brew install gcc
Error: Git must be installed and in your PATH!
Error: The following formula
  go
cannot be installed as binary package and must be built from source.
Install Clang or brew install gcc

みたいなエラーが出ます。curlはシステムにあってもHomebrewのものを別途インストールしようとするのですが、 その際、HOMEに入れる場合はbottleからでなくコンパイルが必要なのでgccが必要になりエラーが出ます。

とりあえずcurlgccなどはなんとかシステムレベルでインストールするか なんとかする必要があります。

準備が出来たら Linuxでは以下のコマンドでHomebrewをインストールします。

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

インストールスクリプトに関してはMac版のForkですがちょっと手を加えてあり まだ統合されておらず別のものになっています。

https://raw.githubusercontent.com/Linuxbrew/install/master/install.shhttps://raw.githubusercontent.com/Linuxbrew/install/master/install のラッパースクリプトになっていて、このinstallの方は Mac版(https://raw.githubusercontent.com/Homebrew/install/master/install)のForkです。

install.shの中ではRubyが入ってない場合に別途インストールするスクリプトが最初に走る様になっています。

installスクリプトの中では/home/linuxbrewを作ったり書き込みができればそこへ、 そうでない場合には$HOMEにインストールするようなチェックが入っています。

この際、ちょっと特殊な場合で、sudoがNOPASSWDで許可された上で許可されたコマンドがない、 という設定になっている場合/home/linuxbrewを使おうとしてしまい結果使えずにエラー終了します。

これに関してはPull Requestを出しています。

fixed sudo checks by rcmdnk · Pull Request #47 · Linuxbrew/install

ちょっとごちゃごちゃしてしまいましたが一応レビューは終わった状態ですが、 そのタイミングで止まってしまっています。が、多分そのうちMergeされると思います。

追記: 2019/03/07

Mergeされたので本家のほうを使ってインストールできます。

追記ここまで

もしこの問題に当たってる人がいたら、

を取ってきて直接走らせればインストール出来るかと思います。

インストール時に起こった他の問題として、 上に書いたstow-getで自分の環境下に別途OpenSSLをインストールしていたところ、

==> Installing curl dependency: openssl
...
Warning: The post-install step did not complete successfully
You can try again using `brew postinstall openssl`
==> Caveats
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /home/user/.linuxbrew/etc/openssl/certs

and run
  /home/user/.linuxbrew/opt/openssl/bin/c_rehash
==> Summary
...
==> Installing git dependency: patchelf
...
curl: (77) error setting certificate verify locations:
  CAfile: /home/user/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/user/.linuxbrew/etc/openssl/certs
Error: Failed to download resource "patchelf"

と言ったエラーが出てしまいました。 これに関することは

FAQ · Linuxbrew/brew Wiki

にもありますが、ちょっと状況が違うようで、 どうもローカルにインストールしてあったcurlおよびopensslが変に作用して途中で きちんとしたインストールが出来てないようでした。

一旦brewがインストールされてしまえば、無理やりなんとかできそうですが、 最初の時点でコケるので面倒。

今回は環境の作り直しということで、一旦stow-getでインストールしたものは退避させた状態で Homebrewをインストールしたところ上手く行きました。

Formulaについて

Formulaは基本Macと同じものです。

いくつかのLinux Specificなものは別途用意されていてこのレポジトリもあらかじめタップしてあるので 中にあるFormulaは最初から使えます。

Formulaが基本的に同じなので自作のFormulaとかもそのまま使えます。 次に出てくるHomebrew-fileなんかも同じ様に入れられます。

LinuxでHomebrew-file

HomebrewではHomebrew-fileを使ってパッケージリストの管理を行っています。

Homebrew自体にもbundleというBrewfileへのdump、及びファイルを読み込みリストにあるものをインストール する機能はありますが、 Homebrew-fileではBrewfileをパッケージをインストールするごとに更新したり GitHubのレポジトリを用いてBrewfileをバージョン管理したりする機能もあります。

これをそのままLinuxで使おうとしたところ、caskmasなどMacでしか使わないものの関連で おかしくなってしまう部分があったのでちょっと手を加えました。

$ brew install rcmdnk/file/brew-file

でインストールでき、brew fileコマンドが使える様になります。

MacとLinuxではアプリのインストールの部分でどうしても違いが出てしまうので 現状ではそれぞれ別のレポジトリやファイルを使った管理をするべきです。

今はMac用とLinux様に分けて管理しています。

Linuxに関しては環境ごとに色々必要なものが変わってくることもあるので あまりに差が出るようならLinuxの中でも分けたほうが良いかもしれません。 (Macでも色々用途が違うものを複数使ってるならあれですが。。。)

とりあえず今の所特に問題なくLinuxでも動いていることを確認していますが、 もし使ってみて問題があればIssuesとかに出してもらえるとありがたいです。

現状起こっている問題

完全に環境依存で、他の環境で試したら問題なかったりするものなのですが、1つは LD_LIBRARY_PATH$HOME/.linuxbrew/libを加えると

$ ls
ls: 0s": ELF: x: Error 1325453653
$ ls
ls: a: ELF: x: Error 18446744072590418261

の様にいくつかの基本的なコマンドがバグる状態。 真面目にライブラリの依存性を考えればよいのでしょうが、まだ何が悪いかまではわかってないです。

もう1つは関連してgoをインストールしたところ、

$ go
go: relocation error: /usr/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

というエラーが出て使えない状態です。 この必要なlibcは$HOME/.linuxbrew/lib/libc.so.6にもインストールされていて、これを使えば問題なく動きます。

ただ、これを使うために

$ export LD_LIBRARY_PATH=$HOME/.linuxbrew/lib:$LD_LIBRARY_PATH

をすると上のエラーが置きてしまうわけです。

この問題は他のパッケージでも起こることなのでやはりLD_LIBRARY_PATHの問題は解決しないといけないのですが、 差し当たりどうしても必要なvimscreenpythonpython@2などは問題なく入れられたので また時間を見てちゃんとみたいと思っています。。。

追記: 2019/05/08

とりあえず現状の解決法。

追記ここまで

Sponsored Links
Sponsored Links

« Mac Homebrewでgccのインストールに時間がかかる場合はXcode Command Line Tool (CLT)をインストールしておけば良い GitHubのレポジトリについたスターを可視化する »

}