はじめに
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.1
が cmake
コマンドの引数として渡ります。
しかし、 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
に指定することが出来ます。
...
# 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 のリポジトリに同梱される各種資料も併せて参考にしました。
最後に、 Homebrew と Linuxbrew 及び Debian 環境の全ての事に関わる全ての皆様に心より感謝致します。
追記とお断り
2017/11/16 現在の追記とお断り
Linuxbrew を用いた野良ビルドパッケージの管理手法について、パッケージのバージョンの切り替えを行う為のコマンドである brew switch
コマンドに関する内容の追記を行い、本稿を改稿致しました。どうか御了承下さい。