Linuxbrew 若しくは Homebrew を用いた野良ビルドパッケージの管理手法

  • 7
    Like
  • 0
    Comment

追記とお断り

2017/11/16 現在の追記とお断り

Linuxbrew を用いた野良ビルドパッケージの管理手法について、パッケージのバージョンの切り替えを行う為のコマンドである brew switch コマンドに関する内容の追記を行い、本稿を改稿致しました。どうか御了承下さい。

はじめに

Homebrew とは、 Mac OS X 上における、ソースコードの取得及びビルドに基づいたパッケージ管理システムです。そして、 Homebrew を Linux の各ディストリビューション向けに移植したものが Linuxbrew です。
Homebrew 及び Linuxbrew の使用により、ソースコードからのビルドに基づいたソフトウェアの導入を単純かつ容易に行うことが出来ます。

現在、 Homebrew 及び Linuxbrew には多くのパッケージが含まれており、多様なパッケージを容易にインストールすることが可能ですが、幾つかのソフトウェアに関しては Homebrew 及び Linuxbrew のパッケージに含まれず、また、システム側のパッケージに含まれないものが存在します。

このような場合、パッケージとして提供されていないソフトウェアのソースコードを手動でダウンロードした上でビルドし、 /usr/local のような適当なディレクトリにインストールする手法が取られますが、そのまま適当なディレクトリにソフトウェアをインストールすると、ソフトウェアをアップグレードしたりアンインストールする場合に作業が非常に煩雑になる問題が発生します。

そこで、パッケージとして提供されていないソフトウェアをパッケージとしてインストールし、パッケージのアップグレード及びアンインストールを容易にするための手法として xstow 及び porg なるソフトウェアを用いる手法があります。

しかし、ここで Mac OS X 及び Linux の各ディストリビューションに Homebrew 及び Linuxbrew が導入されている場合は、 brew diy, brew --cellar , brew link, brew unlink 及び brew switch コマンドを用いることにより、 Homebrew 及び Linuxbrew と統合的に各種パッケージとして提供されていないソフトウェアをパッケージとして管理することが可能になります。

本稿では、 Homebrew 及び Linuxbrew を用いて、システム及び Homebrew, Linuxbrew のパッケージとして提供されていないソフトウェアをソースコードからビルドしてインストールし、パッケージとして管理する手法について述べます。

本稿では最初に、 "各種 brew コマンドの概要" の章において、 Homebrew 及び Linuxbrew においてソースコードからビルドされたソフトウェアをパッケージとしてインストールし管理するために有用なコマンドである各種 brew コマンドの概要について述べます。
次に、"実際のパッケージの管理手法" の章において、 Homebrew 及び Linuxbrew 上でソースコードからビルドしたソフトウェアをパッケージとして管理する手法について述べます。
最後に、"結論" の章において、本稿の結論について述べます。

なお、以降においては特に断りのない限り、パッケージのインストール環境は Linux の各ディストリビューションに Linuxbrew をディレクトリ /home/user/.linuxbrew 以下に導入した環境を前提とし、 Homebrew に関しては本稿での言及を省略します。
また、パッケージとしてインストールするためのソフトウェアのソースコードが foobar-0.0.1 ディレクトリ以下に展開されているものとして、本稿を記述します。

各種 brew コマンドの概要

本章では、 Linuxbrew においてソースコードからビルドされたソフトウェアをパッケージとしてインストールし管理するために有用なコマンドである brew diy, brew --cellar , brew link 及び brew unlink コマンドの概要について述べます。

最初に、 "brew diy コマンド" の節において、ソフトウェアをソースコードからビルドする際に使用する configure スクリプト及び cmake コマンドにソフトウェアのインストール先を示す引数を渡すための適切なオプションを標準出力に返すコマンドである brew diy コマンドの概要について述べます。
次に、 "brew --cellar コマンド" の節において、 Linuxbrew が管理するパッケージの実体が置かれるディレクトリを標準出力に返すコマンドである brew --cellar コマンドの概要について述べ、"brew link, brew unlink コマンド" の節において、 Linuxbrew が管理するパッケージの実体から Linuxbrew の導入先のディレクトリ以下へのシンボリックリンクを作成するコマンドである brew link コマンド及び brew link によって作成されたシンボリックリンクを削除するコマンドである brew unlink コマンドの概要について述べます。
最後に、"brew switch コマンド" の節において、 Linuxbrew が管理するパッケージの実体から Linuxbrew の導入先のディレクトリ以下へのシンボリックリンクを特定のバージョンの実体からのシンボリックリンクに切り替えるコマンドである brew switch コマンドについて述べます。

brew diy コマンド

brew diy コマンドとは、カレントディレクトリにソフトウェアのビルドで使用する configure スクリプト若しくは cmake コマンドで使用する CMakeLists.txt ファイルが存在し、かつ、カレントディレクトリの basename が name-x.y.z (ここで、 x, y, z はバージョン番号を表す整数) のような形式である場合に、 configure スクリプト及び cmake コマンドにソフトウェアのインストール先を示す引数を渡すのに適切なオプションを標準出力に返すコマンドです。

例えば、 foobar-0.0.1 ディレクトリ以下に configure スクリプトファイルが存在する場合に、カレントディレクトリを foobar-0.0.1 に移動して brew diy コマンドを実行すると、以下のように configure スクリプトに渡す --prefix オプションを標準出力に返します。

 $ cd foobar-0.0.1
 $ ls
 ...(略)...
 configure
 ...(略)...
 $ brew diy
 --prefix=/home/user/.linuxbrew/Cellar/foobar/0.0.1
 $

また、 foobar-0.0.1 ディレクトリ以下に CMakeLists.txt ファイルが存在する場合に、カレントディレクトリを foobar-0.0.1 に移動して brew diy コマンドを実行すると、以下のように cmake コマンドに渡す -DCMAKE_INSTALL_PREFIX オプションを標準出力に返します。

 $ cd foobar-0.0.1
 $ ls
 ...(略)...
 CMakeLists.txt
 ...(略)...
 $ brew diy
 -DCMAKE_INSTALL_PREFIX=/home/user/.linuxbrew/Cellar/foobar/0.0.1
 $

ここで、ソフトウェアのソースコードが展開されているディレクトリが name-x.y.z の形式ではない場合は、 brew diy はエラーを返します。

このような場合や、パッケージのバージョン番号を明示的に指定したい場合は brew diy のオプションに --version を指定します。また、パッケージ名を明示的に指定したい場合は、 brew diy のオプションに --name を指定します。

以下では、ソフトウェアのソースコードが foobar 以下に展開されている場合を例に示します。

 $ cd foobar
 $ ls
 ...(略)...
 configure
 ...(略)... 
 $ brew diy
 Error: Couldn't determine version, set it with --version=<version>
 # バージョン番号に 0.0.0.1 を明示的に指定する場合。
 $ brew diy --version=0.0.0.1
 --prefix=/home/user/.linuxbrew/Cellar/foobar/0.0.0.1
 # 更にパッケージ名に barbaz を明示的に指定する場合。
 $ brew diy --name=barbaz --version=0.0.0.1
 --prefix=/home/user/.linuxbrew/Cellar/barbaz/0.0.0.1
 $

brew --cellar コマンド

brew --cellar コマンドとは、 brew install コマンドを用いてインストールされたパッケージ等、 Linuxbrew によって管理されるパッケージの実体が置かれるディレクトリを標準出力に返すコマンドです。

例えば、 Linuxbrew の導入先のディレクトリが /home/user/.linuxbrew である場合は、通常では brew --cellar コマンドの標準出力の結果は以下の通りとなります。

 $ brew --cellar
 /home/user/.linuxbrew/Cellar
 $

brew link, brew unlink コマンド

brew link とは、 brew install コマンドを用いてインストールされたパッケージ等、 Linuxbrew によって管理されるパッケージの実体が置かれているディレクトリ以下の各ファイルから、 Linuxbrew の導入先のディレクトリ以下にシンボリックリンクを作成するためのコマンドです。

brew link コマンドに続く引数には、シンボリックリンクを作成するパッケージ名を指定します。 brew link コマンドの実行により、引数で指定したパッケージがインストールされているディレクトリ以下の各ファイルを対象にしてシンボリックリンクを作成します。

 $ brew link foobar
 Linking /home/user/.linuxbrew/Cellar/foobar/0.0.1... 30 symlinks created
 $

また、 brew unlink とは、 brew link によって作成された Linuxbrew の導入先のディレクトリ以下のシンボリックリンクを削除するコマンドです。

brew unlink コマンドに続く引数には、シンボリックリンクを削除するパッケージ名を指定します。 brew unlink コマンドの実行により、引数で指定したパッケージから Linuxbrew の導入先のディレクトリ以下に作成されたシンボリックリンクを削除します。

 $ brew unlink foobar
 Unlinking /home/user/.linuxbrew/Cellar/foobar/0.0.1... 30 symlinks removed
 $

brew switch コマンド

brew switch コマンドとは、 brew link コマンド及び brew install コマンド等によってインストールされたパッケージにおいて、これらのパッケージの新たなバージョンをインストールした場合に、これらのパッケージの Linuxbrew の導入先のディレクトリ以下のシンボリックリンクを完全に削除し、 brew switch コマンドによって指定したパッケージ及びバージョンの実体が置かれているディレクトリ以下の各ファイルから、 Linuxbrew の導入先のディレクトリ以下にシンボリックリンクを作成し直すためのコマンドです。

brew link コマンドによってインストールされたパッケージに対して、新たなバージョンへのアップグレードを行う場合は、 brew unlink && brew link コマンドでは無く brew switch を使用する必要があります。

例えば、既に brew link コマンドによって、バージョン番号が 0.0.1 であるパッケージ foobar がインストールされており、その後パッケージ foobar のバージョン番号を 0.0.2 にアップグレードする場合、新しいバージョンのパッケージの実体を /home/user/.linuxbrew/Cellar/foobar/0.0.2 に置き、 brew switch コマンドの第1引数にパッケージ名 foobar を、第2引数にバージョン番号 0.0.2 を指定して以下のように実行します。

 $ brew switch foobar 0.0.2
 Cleaning /home/user/.linuxbrew/Cellar/foobar/0.0.1
 Cleaning /home/user/.linuxbrew/Cellar/foobar/0.0.2
 30 links created for /home/user/.linuxbrew/Cellar/0.0.2
 $

brew switch コマンドの実行により、引数で指定したパッケージのバージョンを任意の新しいものに切り替えることが出来ます。

実際のパッケージの管理手法

本章では、 Linuxbrew 上において、 brew diy, brew --cellar, brew link, brew unlink コマンド及び brew switch コマンドを用いて、実際にソースコードからビルドしたソフトウェアをパッケージとしてインストールし管理する手法について具体的に述べます。

最初に、 "configure スクリプトによるインストールが可能である場合" の節において、ソースコードからのソフトウェアのビルドの際に configure スクリプトを使用する場合におけるパッケージの管理の手法について述べます。
次に、 "cmake によるインストールが可能である場合" の節において、ソースコードからのソフトウェアのビルドの際に cmake コマンドを使用する場合におけるパッケージの管理の手法について述べます。
最後に、 "その他の場合" の節において、 configure スクリプト及び cmake コマンドの何れの手法にもよらずにソースコードからのソフトウェアのビルドを行う場合におけるパッケージの管理の手法について述べます。

なお以降においては、ソースコードからビルドするソフトウェアと依存関係にある各種ライブラリ等は事前に brew install コマンド及びシステム側のパッケージ管理コマンド等によって依存関係の解決が完了している事を前提として本章を記述します。

configure スクリプトによるインストールが可能である場合

本節では、 brew diy , brew link, brew unlink コマンド及び brew switch コマンドを用いて、configure スクリプトによるインストールが可能なソフトウェアのビルド及びパッケージの管理の手法について述べます。

最初に、 configure スクリプトを起動する際に、 configure スクリプトの引数として brew diy コマンドをバッククォートで括ったものを渡します。これにより、 configure スクリプトに brew diy コマンドの標準出力の結果である --prefix=/home/user/.linuxbrew/Cellar/foobar/0.0.1 が引数として渡ります。

 $ cd foobar-0.0.1
 $ ./configure `brew diy`

また、ソースコードからのソフトウェアのビルドにおいて他に必要なオプションがあれば、以下のように configure スクリプトに適切なオプションを追加します。

 $ ./confiure --enable-ssl --enable-static `brew diy`

configure スクリプトが正常に終了した後は、通常のソフトウェアのビルドと同様に make 及び make install コマンドを実行し、ソフトウェアをディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.1 以下にインストールします。

 $ make
 $ make install

最後に、 make 及び make install コマンドが正常に終了した後は、 brew link コマンドを用いて、ディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.1 以下にあるパッケージの各ファイルをディレクトリ /home/user/.linuxbrew 以下にシンボリックリンクを張り、 Linuxbrew にパッケージをインストールします。

 $ brew link foobar

なお、ここで、 brew link コマンドによってパッケージ foobar が既にインストールされており、その後パッケージ foobar のバージョン番号を 0.0.2 にアップグレードするような場合は、 brew link コマンドの代わりに brew switch コマンドを用いて、ディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.2 以下にあるパッケージの各ファイルをディレクトリ /home/user/.linuxbrew 以下にシンボリックリンクを作成し直します。

 $ brew switch foobar 0.0.2

そして、以上の手法によって Linuxbrew にインストールしたパッケージをアンインストールする場合は、 brew unlink コマンドを用いて、パッケージからディレクトリ /home/user/.linuxbrew 以下に張られたシンボリックリンクを削除した後に、パッケージの実体が置かれるディレクトリを削除します。

 $ brew unlink foobar
 $ rm -rf `brew --cellar`/foobar/0.0.1

cmake によるインストールが可能である場合

本節では、 brew diy , brew link, brew unlink コマンド及び brew switch コマンドを用いて、cmake コマンドによるインストールが可能なソフトウェアのビルド及びパッケージの管理の手法について述べます。

最初に、前節の場合と同様に cmake コマンドを起動する際に、 cmake コマンドの引数として、 brew diy コマンドをバッククォートで括ったものを渡します。これにより、 cmake コマンドには brew diy コマンドの標準出力の結果である -DCMAKE_INSTALL_PREFIX=/home/user/.linuxbrew/Cellar/foobar/0.0.1cmake コマンドの引数として渡ります。

しかし、 CMakeLists.txt ファイルが置かれたディレクトリ上において、 cmake コマンドを実行すると、ソースコードが置かれているディレクトリに cmake コマンドが生成する中間ファイルが大量に置かれることになり、ソースコードのビルド完了後の中間ファイルの削除作業が非常に煩雑になります。

そこで、 cmake コマンドによるビルドを実行する際は、 CMakeLists.txt ファイルが存在するディレクトリの直下に適当なワークディレクトリを作成して、カレントディレクトリをワークディレクトリに移動した後に cmake コマンドを実行するようにします。この場合は、 cmake コマンドの引数には cd ..; brew diy をバッククォートで括って渡すようにします。

 $ cd foobar-0.0.1
 $ mkdir build
 $ cd build
 $ cmake .. `cd ..; brew diy`

また、ソースコードからのソフトウェアのビルドにおいて他に必要な引数があれば、以下のように cmake コマンドに適切な引数を追加します。

 $ cmake .. -DENABLE_SHARED_LIBS=OFF `cd ..; brew diy`

cmake コマンドが正常に終了した後は、通常のソフトウェアのビルドと同様に make 及び make install コマンドを実行し、ソフトウェアをディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.1 以下にインストールします。

 $ make
 $ make install

最後に、 make 及び make install コマンドが正常に終了した後は、前節の手法と同様に brew link コマンドを実行してパッケージを Linuxbrew にインストールします。

 $ brew link foobar

なお、ここで、 brew link コマンドによってパッケージ foobar が既にインストールされており、その後パッケージ foobar のバージョン番号を 0.0.2 にアップグレードするような場合は、前節の手法と同様に brew link コマンドの代わりに brew switch コマンドを実行して、ディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.2 以下にあるパッケージの各ファイルをディレクトリ /home/user/.linuxbrew 以下にシンボリックリンクを作成し直します。

 $ brew switch foobar 0.0.2

以上の手法によって Linuxbrew にインストールしたパッケージをアンインストールする場合は、前節の手法と同様に brew unlink コマンドを実行した後に、パッケージの実体が置かれるディレクトリを削除します。

 $ brew unlink foobar
 $ rm -rf `brew --cellar`/foobar/0.0.1

その他の場合

本節では、 brew --cellar, brew link 及び brew unlink コマンドを用いて、 configure スクリプト及び cmake コマンドの何れの手法にもよらずにソースコードからソフトウェアのビルドを行う場合におけるパッケージの管理の手法について述べます。

ソースコードが展開されているディレクトリに configure スクリプト及び CMakeLists.txt が存在しない場合は、 configure スクリプトや cmake コマンドによるソースコードからのソフトウェアのビルドが行えないため、前々節及び前節で述べた brew diy コマンドを使用することが出来ません。

しかし、ソースコードからビルドしたソフトウェアのインストール先のディレクトリを {brew --cellar コマンドの標準出力の結果}/name/x.y.z (ここに、 name はパッケージ名、 x, y, z はバージョン番号を表す整数) とすることにより、 Linuxbrew によるパッケージ管理が可能になります。

ここでは一例として、ディレクトリ foobar-0.0.1 以下に展開されたソースコードにファイル Makefile が存在し、ソフトウェアのインストール先が Makefile ファイル内の変数 PREFIX によって指定される場合について考えます。
また、以降においては brew --cellar コマンドの出力結果は /home/user/.linuxbrew/Cellar であり、インストールするパッケージ名は foobar で、バージョン番号は 0.0.1 である事を前提として本節を記述します。

まず、カレントディレクトリを foobar-0.0.1 に移動します。

 $ cd foobar-0.0.1

そして、ファイル Makefile 内の変数 PREFIX の値を以下のように変更します。これにより、ソフトウェアのインストール先を /home/user/.linuxbrew/Cellar/foobar/0.0.1 に指定することが出来ます。

Makefile
...
# Edit PREFIX etc.
# PREFIX=/usr/local
PREFIX=$(shell brew --cellar)/foobar/0.0.1
CC=gcc
LD=ld
...

ファイル Makefile の修正後は make 及び make install コマンドの実行により、ソフトウェアをディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.1 以下にインストールします。

 $ make
 $ make install

最後に、 make 及び make install コマンドが正常に終了した後は、前々節の手法と同様に brew link コマンドを実行してパッケージを Linuxbrew にインストールします。

 $ brew link foobar

なお、ここで、 brew link コマンドによってパッケージ foobar が既にインストールされており、その後パッケージ foobar のバージョン番号を 0.0.2 にアップグレードするような場合は、前々節の手法と同様に brew link コマンドの代わりに brew switch コマンドを用いて、ディレクトリ /home/user/.linuxbrew/Cellar/foobar/0.0.2 以下にあるパッケージの各ファイルをディレクトリ /home/user/.linuxbrew 以下にシンボリックリンクを作成し直します。

 $ brew switch foobar 0.0.2

以上の手法によって Linuxbrew にインストールしたパッケージをアンインストールする場合は、前々節の手法と同様に brew unlink コマンドを実行した後に、パッケージの実体が置かれるディレクトリを削除します。

 $ brew unlink foobar
 $ rm -rf `brew --cellar`/foobar/0.0.1

結論

本稿では、前々章において、システム及び Linuxbrew, Homebrew においてパッケージが提供されていないソフトウェアを Linuxbrew 及び Homebrew のパッケージとして管理するために有用な brew diy , brew link, brew unlink コマンド及び brew switch コマンドの概要について述べました。

次に、前章において、 configure スクリプト及び cmake コマンドを用いてソースコードからのビルドが可能であるソフトウェアにおいて、 brew diy コマンドの標準出力の結果を configure スクリプト及び cmake コマンドに渡してソースコードをビルドし、 brew link コマンドによってソフトウェアのインストール先を Linuxbrew の導入先にシンボリックリンクを作成することによって、ソフトウェアを Linuxbrew にインストールする事が可能である事を述べました。

また、 configure スクリプト及び cmake コマンドの何れの手法にもよらずにソースコードからビルドを行うソフトウェアにおいても、ソフトウェアのインストール先のディレクトリを brew --cellar コマンドの標準出力の結果に基づき適切に設定した上でソースコードをビルドし、 brew link コマンドによってソフトウェアのインストール先を Linuxbrew の導入先にシンボリックリンクを作成することによって、ソフトウェアを Linuxbrew にインストールする事が可能であることを述べました。

以上より、 brew diy , brew link, brew unlink コマンド及び brew switch コマンドを用いることにより、システム及び Linuxbrew, Homebrew においてパッケージが提供されていないソフトウェアを Linuxbrew 及び Homebrew と統合的に管理することが可能であることを示しました。

しかし、システム及び Linuxbrew, Homebrew においてパッケージが提供されていないソフトウェアを Linuxbrew 及び Homebrew にパッケージとしてインストールする手法は、飽くまでも暫定的な手法として留めておくべきです。

もし、インストールしたパッケージを今後継続的にアップデートする予定が有り、 Ruby によるプログラミングのスキルを有していて、時間的な余裕が有るのであれば、 Formula Cookbook を参照した上で、ソフトウェアをパッケージとして管理するための Formula スクリプトを記述することを強く御勧め致します。

謝辞

本稿の記述に当たって、最初に、当方の手元の環境である Debian 環境への Linuxbrew の導入の詳細に関しては、 thermes 氏による "Linuxbrew のススメ" の投稿を大いに参考にしました。 thermes 氏に心より感謝致します。

そして、 Linuxbrew 本体のリポジトリの開発を行っている Shaun Jackman 氏を始めとする Linuxbrew の開発コミュニティの各氏に心より感謝致します。また、 Linuxbrew の詳細に関しては、 Linuxbrew 公式ページ及び Linuxbrew のリポジトリに同梱される各種資料も併せて参考にしました。

最後に、 HomebrewLinuxbrew 及び Debian 環境の全ての事に関わる全ての皆様に心より感謝致します。