Linuxbrew の自動的なインストールスクリプトが異常終了する場合における代替の導入手法

# はじめに

[Linuxbrew][BREW] とは、 Mac OS X 上における、ソースコードの取得及びビルドに基づいたパッケージ管理システムである [Homebrew][HBRW] を Linux の各ディストリビューション向けに移植したものです。

[Linuxbrew][BREW] の使用により、 Linux の各ディストリビューションにおいて、ソースコードからのビルドに基づいたソフトウェアの導入を単純かつ容易に行うことが出来ます。

しかし、 [64 bit ARM アーキテクチャ][ARMP]等の環境で動作する Linux の各ディストリビューションにおいて、 [Linuxbrew 公式ページ][BREW]が公開している [Linuxbrew][BREW] を自動的にインストールするためのスクリプトを起動すると、以下のようなエラーメッセージを出力してスクリプトが異常終了します。

```shell-session
  $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install)"
  ...
  Error: Cannot find a vendored version of ruby for your aarch64
  processor on Linuxbrew!
  Error: Failed to install vendor Ruby.
  $
```

これは、自動的なインストールスクリプトの実行の過程において、 [Linuxbrew][BREW] 本体が使用する [ruby 処理系][RUBY]をインストールするための ```brew``` コマンドが実行され、この時に、 ```brew``` コマンドによって自動検出されたアーキテクチャに対応した [ruby 処理系][RUBY]の bottle ファイルの取得が正常に行われないことが異常終了の原因と考えられます。

また、この問題を回避するには、 [Linuxbrew][BREW] 本体のリポジトリの取得を手動に基づいた手法により行った後、 [ruby 処理系][RUBY]のバージョン 2.3.7 を [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリに手動でインストールすれば良いことが判ります。

そこで、[Linuxbrew][BREW] を自動的にインストールするためのスクリプトに基づいた [Linuxbrew][BREW] の導入が異常終了した場合に、 [Linuxbrew][BREW] 本体のリポジトリの取得を手動に基づいた手法によって行いました。

そして、 [64 bit ARM アーキテクチャ][ARMP]上における環境では、手動で [32 bit ARM アーキテクチャ][ARMP]に対応した [ruby 処理系][RUBY]の bottle ファイルを取得し、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリに展開することにより、正常な [Linuxbrew][BREW] の導入が確認されました。

また、その他の環境では、 [ruby 処理系][RUBY]のバージョン 2.3.7 をソースコードから手動でビルドして [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリにインストールする事によって、同様に正常な [Linuxbrew][BREW] の導入が確認されました。

そして、以上の手動による導入手法を踏まえて [Linuxbrew][BREW] の開発コミュニティによる [Linuxbrew][BREW] の自動的なインストールスクリプトに修正を加えた上で実行したところ、手動による導入手法と同じく正常に [Linuxbrew][BREW] が導入されることが示されました。

本稿では、 Linux の各ディストリビューションにおいて、 [Linuxbrew][BREW] の自動的なインストールスクリプトに基づいて [Linuxbrew][BREW] を導入した際に、 [Linuxbrew][BREW] 本体への ruby の導入の失敗に起因して異常終了する場合において、 [Linuxbrew][BREW] のインストールスクリプトによる導入に代わる [Linuxbrew][BREW] の導入手法について述べます。

本稿では、最初に、 "[Linuxbrew の自動的なインストールスクリプトが異常終了する原因][CHAP01]" の章において、 [Linuxbrew の公式ページ][BREW]で示された [Linuxbrew][BREW] の自動的なインストールスクリプトが正常に動作しない原因について述べます。

次に、 "[手動による Linuxbrew の導入手法][CHAP02]" の章において、  [64 bit ARM アーキテクチャ][ARMP]及びその他の環境のそれぞれの場合において、 手動による作業に基づいた [Linuxbrew][BREW] の導入手法について述べます。

そして、 "[自動による Linuxbrew の導入手法][CHAP03]" の章において、[前章][CHAP02]で述べた手法を踏まえて、 [Linuxbrew][BREW] の自動的なインストールスクリプトに修正を加えて代替のインストールスクリプトを作成し、 [64 bit x86 アーキテクチャ][X86P]及び[32 bit x86 アーキテクチャ][ARMP]以外の環境において、代替のインストールスクリプトの実行に基づく [Linuxbrew][BREW] の導入手法について述べます。

最後に、"[結論][CHAP04]" の章において、本稿の結論について述べます。 

なお、本稿においては、特段の断りがない限り、 [Linuxbrew][BREW] を導入する Linux ディストリビューションは Debian 系のディストリビューションとし、また、 [Linuxbrew][BREW] の導入先となるホームディレクトリを ```/home/linuxbrew``` として、 [Linuxbrew][BREW] 本体のリポジトリは ```/home/linuxbrew/.linuxbrew``` に置かれるものとします。

また、 [Linuxbrew][BREW] を導入するにあたって、 [Linuxbrew][BREW] に依存するパッケージは以下のコマンドによって既に導入済みであり、これらのパッケージに加えて、各種ファイルをダウンロードするためのパッケージである ```wget``` も既に導入されているものとして本稿を記述します。

```shell-session
 $ sudo apt-get install build-essential curl file git python-setuptools ruby
 $ sudo apt-get install wget
```
また、本稿においては、 [Linuxbrew][BREW] に関する各種用語等の詳細に関しては、具体的な説明を割愛致します。 [Linuxbrew][BREW] に関する詳細については、 [Linuxbrew の公式ページ][BREW] 及び [Linuxbrew][BREW] 本体のリポジトリに同梱する各種ドキュメントを参照して下さい。 

# Linuxbrew の自動的なインストールスクリプトが異常終了する原因

本章では、 [Linuxbrew の公式ページ][BREW]で示された [Linuxbrew][BREW] の自動的なインストールスクリプトが正常に動作しない原因の概要について述べます。

まず、前述した [Linuxbrew][BREW] のインストールスクリプトのエラーメッセージである ```"Error: Cannot find a vendored version of ruby for your ..."``` を [Linuxbrew][BREW] 本体のリポジトリ内で検索すると、シェルスクリプト [```/home/linuxbrew/.linuxbrew/Library/Homebrew/cmd/vendor-install.sh```][SRC1] (以下、 vendor-install.sh と表記) の実行時においてそのメッセージが表示されることが判ります。

シェルスクリプト ```vendor-install.sh``` は、コマンド ```brew vendor-install``` の実体となるスクリプトであり、インストールスクリプトが出力したエラーメッセージの内容と、シェルスクリプト ```vendor-install.sh``` 内の[関数 ```homebrew-vendor-install()``` におけるエラーメッセージを出力する以下の記述][SRC2]より、環境変数 ```VENDOR_NAME``` の値は "ruby" であることが判ります。

そして、この時 [Linuxbrew][BREW] のインストールスクリプトは、コマンド ```brew vendor-install ruby``` を呼び出していることも同時に判ります。

```sh:vendor-install.sh
...
  if [[ -z "$VENDOR_URL" || -z "$VENDOR_SHA" ]]
  then
    odie <<-EOS
Cannot find a vendored version of $VENDOR_NAME for your $HOMEBREW_PROCESSOR
processor on $HOMEBREW_PRODUCT!
EOS
  fi
...
```

また、[関数 ```homebrew-vendor-install()``` における環境変数 ```VENDOR_URL, VENDOR_URL2, VENDOR_SHA``` の値を設定する以下の記述][SRC3]より、環境変数 ```VENDOR_URL, VENDOR_URL2, VENDOR_SHA``` の値は、それぞれ環境変数 ```ruby_URL, ruby_URL2, ruby_SHA``` の値を取ることが判ります。

```sh:vendor-install.sh
...
  url_var="${VENDOR_NAME}_URL"
  url2_var="${VENDOR_NAME}_URL2"
  sha_var="${VENDOR_NAME}_SHA"
  VENDOR_URL="${!url_var}"
  VENDOR_URL2="${!url2_var}"
  VENDOR_SHA="${!sha_var}"
...
```

ここで、[スクリプト ```vendor-install.sh``` における環境変数 ```ruby_URL, ruby_URL2, ruby_SHA``` の値を設定する記述][SRC4]は以下のようになっています。

```sh:vedor-install.sh
...
VENDOR_DIR="$HOMEBREW_LIBRARY/Homebrew/vendor"

# Built from https://github.com/Homebrew/homebrew-portable-ruby.
#
# Dynamic variables can't be detected by shellcheck
# shellcheck disable=SC2034
if [[ -n "$HOMEBREW_MACOS" ]]
then
  if [[ "$HOMEBREW_PROCESSOR" = "Intel" ]]
  then
    ruby_URL="$HOMEBREW_BOTTLE_DOMAIN/bottles-portable-ruby/portable-ruby-2.3.7.leopard_64.bottle.tar.gz"
    ruby_URL2="https://github.com/Homebrew/homebrew-portable-ruby/releases/download/2.3.7/portable-ruby-2.3.7.leopard_64.bottle.tar.gz"
    ruby_SHA="033ac518bb14abdb1bb47d968dc9e967c3ae2035499383a21a79b49d523065d1"
  fi
elif [[ -n "$HOMEBREW_LINUX" ]]
then
  case "$HOMEBREW_PROCESSOR" in
    x86_64)
      ruby_URL="$HOMEBREW_BOTTLE_DOMAIN/bottles-portable-ruby/portable-ruby-2.3.7.x86_64_linux.bottle.tar.gz"
      ruby_URL2="https://github.com/Homebrew/homebrew-portable-ruby/releases/download/2.3.7/portable-ruby-2.3.7.x86_64_linux.bottle.tar.gz"
      ruby_SHA="9df214085a0e566a580eea3dd9eab14a2a94930ff74fbf97fb1284e905c8921d"
      ;;
    armv[67]*)
      ruby_URL="$HOMEBREW_BOTTLE_DOMAIN/bottles-portable-ruby/portable-ruby-2.3.7.armv6_linux.bottle.tar.gz"
      ruby_URL2="https://github.com/Homebrew/homebrew-portable-ruby/releases/download/2.3.7/portable-ruby-2.3.7.armv6_linux.bottle.tar.gz"
      ruby_SHA="17dce8965d7c935ec1dd0c5bb0be937b685ffe65529141d9e6ed78f4925b4570"
      ;;
  esac
fi
...
```

ここに、環境変数 ```HOMEBREW_PROCESSOR``` の値は ```brew``` コマンドによって設定されるアーキテクチャを表す文字列であり、コマンド ```uname -m``` が出力する文字列が代入されています。

このことと、上記のスクリプトの記述より、 ```brew``` コマンドによって検出されたアーキテクチャを表す文字列である環境変数 ```HOMEBREW_PROCESSOR``` の値が "armv6l, armv7l" 若しくは "x86_64" の何れでもない場合は、環境変数 ```ruby_URL, ruby_URL2, ruby_SHA``` の内容は空文字列となることが判ります。

また、[スクリプト ```vendor-install.sh``` の環境変数 ```VENDOR_DIR``` を設定する記述][SRC5]と[スクリプト ```vendor-install.sh``` 内の関数 ```install()``` の記述][SRC6]より、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリは、 ```/homee/linuxbrew/.linuxbrew/Library/Homebrew/vendor``` であることも判ります。

以上のことと、前述した関数 ```homebrew-vendor-install()``` の環境変数 ```VENDOR_URL, VENDOR_URL2, VENDOR_SHA``` の値によってエラーメッセージを出力する記述の内容から、環境変数 ```HOMEBREW_PROCESSOR``` の値が "armv6l, armv7l" 及び "x86_64" 以外の値を取る場合、コマンド ```brew vendor-install ruby``` 及びそれを呼び出す [Linuxbrew][BREW] のインストールスクリプトは、エラーメッセージを出力して異常終了することが判ります。

# 手動による Linuxbrew の導入手法

本章では、 [Linuxbrew][BREW] の自動的なインストールスクリプトが正常に動作しない場合における手動による作業に基づいた [Linuxbrew][BREW] の導入手法について述べます。

まず最初に、 "[64 bit ARM アーキテクチャの環境に導入する場合][SEC0201]" の節において、 [64 bit ARM アーキテクチャ][ARMP]の環境にて、 [32 bit ARM アーキテクチャ][ARMP] に対応する [ruby 処理系][RUBY]の bottle ファイルの取得と展開による手法に基づいた [Linuxbrew][BREW] の導入手法について述べます。

最後に、 "[64 bit ARM アーキテクチャ以外の環境に導入する場合][SEC0202]" の節において、[64 bit ARM アーキテクチャ][ARMP]以外のその他の環境にて、 [ruby 処理系][RUBY]のバージョン 2.3.7 のソースコードを手動にてビルドし、[Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリにインストールする手法に基づいた [Linuxbrew][BREW] の導入手法について述べます。

## 64 bit ARM アーキテクチャの環境に導入する場合

本節では、[64 bit ARM アーキテクチャ][ARMP]の環境における手動による [Linuxbrew][BREW] の導入手法について述べます。

[64 bit ARM アーキテクチャ][ARMP]は、[32 bit ARM アーキテクチャ][ARMP]とプログラム実行用のバイナリコードにおいて互換性があるため、[64 bit ARM アーキテクチャ][ARMP]の環境においては、[32 bit ARM アーキテクチャ][ARMP]の環境に対応した bottle ファイルをそのまま導入作業において使用することが出来ます。

そこで、 [32 bit ARM アーキテクチャ][ARMP]に対応した [ruby 処理系][RUBY]の bottle ファイルを手動によって取得し、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリに展開することにより、 [Linuxbrew][BREW] の導入作業を行います。


まず最初に、各種 ```brew``` コマンドの実行等を可能にするために、下記の通りに bash の初期化ファイル ```${HOME}/.bashrc``` に追記を行い、 bash の再起動を行います。

```sh:${HOME}/.bashrc
...
export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"                    # Linuxbrew の本体のリポジトリが存在するディレクトリ。
export PATH="${HOMEBREW_PREFIX}/sbin:${HOMEBREW_PREFIX}/bin:$PATH"     # 環境変数 PATH にディレクトリ ${HOMEBREW_PREFIX}/sbin 及び ${HOMEBREW_PREFIX}/bin を追記。
export MANPATH="${HOMEBREW_PREFIX}/share/man:${MANPATH}"               # 環境変数 MANPATH, INFOPATH についても同様。
export INFOPATH="${HOMEBREW_PREFIX}/share/info:${INFOPATH}"
...
```

次に、 [Linuxbrew の公式ページ][BREW]の "Alternative Installation" の記述に従って、 [Linuxbrew][BREW] の導入先となるディレクトリにカレントディレクトリを移動し、 ```git clone``` コマンドを用いて [Linuxbrew][BREW] 本体のリポジトリを取得します。ここで、 [Linuxbrew][BREW] 本体のリポジトリの展開先のディレクトリ名は ```.linuxbrew``` としておきます。

```shell-session
  $ cd /home/linuxbrew
  $ git clone https://github.com/Linuxbrew/brew.git .linuxbrew
```

続いて、 [Linuxbrew][BREW] がソースコード及びバイナリコードのアーカイブファイル等のキャッシュとして用いるディレクトリである ```$HOME/.cache/Homebrew``` を作成した上で、そのディレクトリにカレントディレクトリを移動します。

そして、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]の bottle ファイルである ```portable-ruby-2.3.7.armv6l_linux.bottle.1.tar.gz``` を以下に示す URL から ```wget``` コマンドを用いて取得します。

```shell-session
  $ mkdir -p ~/.cache/Homebrew
  $ cd ~/.cache/Homebrew
  $ wget https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.7.armv6l_linux.bottle.1.tar.gz
```

次に、 ## 2018/06/08 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT2]の更新と、代替スクリプトの実行手法の変更に伴い、本稿を改稿致しました。どうか御了承下さい。

のインストール先となるディレクトリである ```/home/linuxbrew/.linuxbrew/Library/Homebrew/vendor``` にカレントディレクトリを移動し、 bottle ファイル ```portable-ruby-2.3.7.armv6l_linux.bottle.1.tar.gz``` を ```tar``` コマンドを用いて展開します。

そして、ディレクトリ ```portable-ruby``` にカレントディレクトリを移動して、ディレクトリ ```2.3.7``` に向けてシンボリックリンク ```current``` を作成します。

```shell-session
  $ cd /home/linuxbrew/.linuxbrew/Library/Homebrew/vendor
  $ tar -zxvf ~/.cache/Homebrew/portable-ruby-2.3.7.armv6l_linux.bottle.1.tar.gz
  $ cd portable-ruby
  $ ln -sf 2.3.7 current
```

最後に、 ```brew update --force``` コマンドによって、 core tap である ```homebrew/core``` を [Linuxbrew][BREW] に導入した後、 [Linuxbrew][BREW] の診断コマンドである ```brew doctor``` コマンドを実行します。

```shell-session
  $ brew update --force
  $ brew doctor
```

```brew doctor``` コマンドが正常に終了すれば、手動による [Linuxbrew][BREW] の導入が正常に完了したことが判ります。

## 64 bit ARM アーキテクチャ以外の環境に導入する場合

本節では、[64 bit ARM アーキテクチャ][ARMP]以外のその他の環境における手動による [Linuxbrew][BREW] の導入手法について述べます。

この場合は、[32 bit ARM アーキテクチャ][ARMP]及び[64 bit x86 アーキテクチャ][X86P]以外の環境に対応した [ruby 処理系][RUBY]の bottle ファイルを取得することが出来ません。

そこで、 [ruby 処理系][RUBY]のバージョン 2.3.7 のソースコードを手動でビルドして [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリにインストールする事によって、 [Linuxbrew][BREW] の導入作業を行います。

まず最初に、[前節][SEC0201]と同様に、各種 ```brew``` コマンドの実行等を可能にするために、下記の通りに bash の初期化ファイル ```${HOME}/.bashrc``` に追記を行い、 bash の再起動を行います。

```sh:${HOME}/.bashrc
...
export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"                    # Linuxbrew の本体のリポジトリが存在するディレクトリ。
export PATH="${HOMEBREW_PREFIX}/sbin:${HOMEBREW_PREFIX}/bin:$PATH"     # 環境変数 PATH にディレクトリ ${HOMEBREW_PREFIX}/sbin 及び ${HOMEBREW_PREFIX}/bin を追記。
export MANPATH="${HOMEBREW_PREFIX}/share/man:${MANPATH}"               # 環境変数 MANPATH, INFOPATH についても同様。
export INFOPATH="${HOMEBREW_PREFIX}/share/info:${INFOPATH}"
...
```

次に、[前節][SEC0201]と同様にして、 [Linuxbrew の公式ページ][BREW]の "Alternative Installation" の記述に従って、 [Linuxbrew][BREW] の導入先となるディレクトリにカレントディレクトリを移動し、 ```git clone``` コマンドを用いて [Linuxbrew][BREW] 本体のリポジトリを取得します。 [Linuxbrew][BREW] 本体のリポジトリの展開先のディレクトリ名は ```.linuxbrew``` とするのも[前節][SEC0201]と同様です。

```shell-session
  $ cd /home/linuxbrew
  $ git clone https://github.com/Linuxbrew/brew.git .linuxbrew
```

続いて、[前節][SEC0201]と同様に、ディレクトリ ```$HOME/.cache/Homebrew``` を作成して、そのディレクトリにカレントディレクトリを移動します。

そして、 [ruby 処理系][RUBY]のバージョン 2.3.7 のソースコードのアーカイブファイルである ```ruby-2.3.7.tar.gz``` を以下の URL より ```wget``` コマンドを用いて取得します。

```shell-session
  $ mkdir -p ~/.cache/Homebrew
  $ cd ~/.cache/Homebrew
  $ wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.7.tar.gz
```

次に、アーカイブファイル ```ruby-2.3.7.tar.gz``` を ```tar``` コマンドを用いて展開してディレクトリ ```ruby-2.3.7``` にカレントディレクトリを移動します。

その後は、 ruby 2.3.7 の処理系のソースコードを ```./configure && make && make install``` の実行に基づいてビルドし、ディレクトリ ```/home/linuxbrew/.linuxbrew/Library/Homebrew/vendor/portable-ruby/2.3.7``` 以下にインストールします。

即ち、 ```./configure``` スクリプトにオプション ```--prefix=/home/linuxbrew/.linuxbrew/Library/Homebrew/vendor/portable-ruby/2.3.7``` をつけて実行した後、 ```make``` コマンド及び ```make install``` コマンドを実行します。

```shell-session
  $ tar -zxvf ruby-2.3.7.tar.gz
  $ cd ruby-2.3.7
  $ ./configure --prefix=/home/linuxbrew/.linuxbrew/Library/Homebrew/vendor/portable-ruby/2.3.7
  $ make && make install
```

そして、[前節][SEC0201]と同様に、ディレクトリ ```portable-ruby``` にカレントディレクトリを移動して、ディレクトリ ```2.3.7``` に向けてシンボリックリンク ```current``` を作成します。

```shell-session
  $ cd /home/linuxbrew/.linuxbrew/Library/Homebrew/vendor/portable-ruby
  $ ln -sf 2.3.7 current
```

最後に、[前節][SEC0201]と同様に ```brew update --force``` コマンドによって、 core tap である ```homebrew/core``` を Linuxbrew に導入した後、 Linuxbrew の診断コマンドである ```brew doctor``` コマンドを実行します。

```shell-session
  $ brew update --force
  $ brew doctor
```

```brew doctor``` コマンドが正常に終了すれば、手動による [Linuxbrew][BREW] の導入が正常に完了したことが判ります。

# 自動による Linuxbrew の導入手法

ここで、[前章][CHAP02]にて述べた手動による [Linuxbrew][BREW] の導入手法を踏まえ、 [Linuxbrew][BREW] の自動的なインストールスクリプトについて、 [Linuxbrew][BREW] の core tap を取得するプロセスの直前に [Linuxbrew が使用する ruby 処理系をインストールする為のコードを追加する事により][GIT1]、自動的なインストールが異常終了することを回避したスクリプトを当方にて作成し、 [github にて公開しました][GIT2]。

本章では、 [Linuxbrew][BREW] で示された [Linuxbrew][BREW] の自動的なインストールスクリプトに代わるスクリプトを用いた [Linuxbrew][BREW] の導入手法について述べます。

通常のインストールスクリプトの代わりとなる自動的なインストールスクリプトは、 ```https://raw.githubusercontent.com/z80oolong/linuxbrew-altinstall/master/install.sh``` に置かれています (以下、代替スクリプトと記述)。

代替スクリプトの起動方法は、 [Linuxbrew 公式ページ][BREW]による [Linuxbrew][BREW] のインストールスクリプトの起動方法とほぼ同じですが、 [ruby 処理系][RUBY] をソースコードからインストールする場合に ```libssl-dev, readline, libyaml, libgdbm-dev, libdb-dev``` が必要となることから、予め代替スクリプトの起動前に、 [Linuxbrew][BREW] に依存するシステムのパッケージの他に、これらのパッケージをインストールする必要が有ります。

```
 $ sudo apt-get install libssl-dev libreadline6-dev libyaml-dev libgdbm-dev libdb-dev
```

次に、以下のコマンドを実行して [Linuxbrew][BREW] を導入します。

```
 $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/z80oolong/linuxbrew-altinstall/master/install.sh)"
 $ brew doctor
```

最後の ```brew doctor``` コマンドが正常に終了すれば、手動による [Linuxbrew][BREW] の導入が正常に完了したことが判ります。

# 結論

本稿では、"[Linuxbrew の自動的なインストールスクリプトが異常終了する原因][CHAP01]" の章において、 [Linuxbrew][BREW] 本体のリポジトリを分析した結果、 [Linuxbrew][BREW] のインストールスクリプトの実行の過程において、 [Linuxbrew][BREW] 本体が使用する [ruby 処理系][RUBY]をインストールするための ```brew vendor-install ruby``` コマンドが実行されることが判りました。

この時に、 ```brew``` コマンドによって検出されたアーキテクチャの文字列が "armv6l, armv7l" 及び "x86_64" 以外の値を取る場合に、 [Linuxbrew][BREW] で使用する [ruby 処理系][RUBY]の bottle ファイルの取得が失敗する事が、 [Linuxbrew][BREW] の自動的なインストールスクリプトの実行が異常終了する原因であることが判りました。

そこで、[前々章][CHAP02]において、 [Linuxbrew][BREW] 本体のリポジトリの取得を手動に基づいた手法によって行った後、 [64 bit ARM アーキテクチャ][ARMP]上における環境では、 [32 bit ARM アーキテクチャ][ARMP]に対応した [ruby 処理系][RUBY]の bottle ファイルを手動で取得し、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリに展開することにより、正常な [Linuxbrew][BREW] の導入が確認されました。

また、その他の環境では、同様に [Linuxbrew][BREW] 本体のリポジトリの取得を手動に基づいた手法によって行い、 [ruby 処理系][RUBY]のバージョン 2.3.7 をソースコードから手動でビルドして [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のインストール先となるディレクトリにインストールする事によって、正常な [Linuxbrew][BREW] の導入が確認されました。

そして、[前章][CHAP03]において、[前々章][CHAP02]での一連の導入作業を踏まえて、 [Linuxbrew の開発コミュニティ][BREW] による [Linuxbrew][BREW] の自動的なインストールスクリプトについて、 [Linuxbrew][BREW] の core tap を取得するプロセスの直前に Linuxbrew が使用する ruby 処理系をインストールする為のコードを追加したスクリプトを作成して実行することにより、問題無く [Linuxbrew][BREW] の導入が行われることが確認されました。

以上のことより、 [64 bit x86 アーキテクチャ][X86P]及び [32 bit ARM アーキテクチャ][ARMP]以外の環境においても、代替の手法によって [Linuxbrew][BREW] の導入作業を行うことにより、正常な [Linuxbrew][BREW] の導入を行うことが出来ることが示されました。

**但し、 [64 bit x86 アーキテクチャ][X86P]及び [32 bit ARM アーキテクチャ][ARMP]以外の環境において [Linuxbrew][BREW] を動作させることは、 [Linuxbrew][BREW] の開発コミュニティのサポートの対象外であり、本稿において述べた [Linuxbrew][BREW] の導入手法もまた、 [Linuxbrew][BREW] の開発コミュニティのサポートの対象外であることに留意する必要があります。**

# 謝辞

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

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

最後に、 [Linuxbrew][BREW] の全ての事に関わる全ての皆様に心より感謝致します。

# 追記とお断り

## 2018/02/04 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプトの作成と公開][GIT2]に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/06/08 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT2]の更新と、代替スクリプトの実行手法の変更に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/10/11 現在の追記とお断り

[Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]のバージョンが 2.3.7 に更新されたことに伴い、本稿を改稿致しました。また、[Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]をソースコードからコンパイルする際に必要となるパッケージについて訂正を行いました。どうか御了承下さい。

<!-- 各章及び各節へのリンク一覧 -->

[CHAP01]:#linuxbrew-の自動的なインストールスクリプトが異常終了する原因
[CHAP02]:#手動による-linuxbrew-の導入手法
[CHAP03]:#自動による-linuxbrew-の導入手法
[CHAP04]:#結論
[SEC0201]:#64-bit-arm-アーキテクチャの環境に導入する場合
[SEC0202]:#64-bit-arm-アーキテクチャ以外の環境に導入する場合

<!-- 外部リンク一覧 -->

[HBRW]:http://brew.sh/index_ja.html
[BREW]:http://linuxbrew.sh/
[RUBY]:https://www.ruby-lang.org/ja/
[ARMP]:https://www.arm.com/
[X86P]:https://www.intel.co.jp/content/www/jp/ja/homepage.html
[SRC1]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh
[SRC2]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh#L233-L239
[SRC3]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh#L226-L231
[SRC4]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh#L9-L34
[SRC5]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh#L9
[SRC6]:https://github.com/Linuxbrew/brew/blob/master/Library/Homebrew/cmd/vendor-install.sh#L145-L196
[GIT1]:https://github.com/z80oolong/linuxbrew-altinstall/compare/upstream/master...master
[GIT2]:https://github.com/z80oolong/linuxbrew-altinstall
[THER]:https://qiita.com/thermes
[THBR]:https://qiita.com/thermes/items/926b478ff6e3758ecfea
[SHAU]:http://sjackman.ca/