Solaris 11 で ShellCheck をビルドするメモ

ShellCheckシェルスクリプト文法チェッカです。文法チェックだけでなく、ダブルクォート忘れなども指摘してくれるので、コードの品質向上にも非常に役立ちます。

ShellCheckはWebブラウザ版もありますが、CLI版もあります。多くのLinuxディストリビューションにはパッケージがあるようですが、例のごとくSolarisにはないのでビルドしてみることにしました。

ShellCheckはHaskellで書かれているのでまずはHaskellコンパイラをインストールしないといけません。Haskellが入れば、cabal-install (Perlcpanみたいなもの)でShellCheckをインストールできるのですが、 cabal-install のインストールが曲者でした。

環境

試した環境は Solaris 11.3 x86 です。gccが必要になるので、pkg install gcc で入れておいてください。

GHC(Haskellコンパイラ)のバージョンは 7.10.2 の32ビット版, cabal-install のバージョンは 1.22.9.0 にしました。

GHC 8.0.1 と cabal-install 1.24.0.1 も試してみましたが、今のところうまくいっていません。

GHCインストール

Solaris用のバイナリパッケージが用意されているのでそれを使うことにします。

依存ライブラリをインストールします。

$ sudo pkg install library/gmp
$ sudo pkg install library/libffi

パッケージをダウンロードします。

$ cd /usr/local/src
$ wget http://downloads.haskell.org/~ghc/7.10.2/ghc-7.10.2-i386-unknown-solaris2.11.tar.bz2

展開します。

$ tar jxvf ghc-*
$ cd ghc-*

インストールします。インストール先は /opt/ghc 配下にします。

$ ./configure --prefix=/opt/ghc
$ sudo make install

実行できればインストール成功です。

$ /opt/ghc/bin/ghc -V
The Glorious Glasgow Haskell Compilation System, version 7.10.2

cabal-install インストール

cabal-install のソースコードをダウンロードします。

$ cd /usr/local/src/
$ wget https://www.haskell.org/cabal/release/cabal-install-1.22.9.0/cabal-install-1.22.9.0.tar.gz

展開します。

$ tar zxvf cabal-install*
$ cd cabal-install*

bootstrap.sh を実行すると、依存パッケージも含めてビルドしてくれるのですが、そのままでは実行できなかったので、3カ所ほど修正します。

$ diff -u bootstrap.sh.orig bootstrap.sh
--- bootstrap.sh.orig   2016-12-20 19:17:06.120135204 +0900
+++ bootstrap.sh        2016-12-20 22:47:50.427981094 +0900
@@ -10,6 +10,8 @@
 # you don't want profiling and dynamic versions of libraries to be installed in
 # addition to vanilla, run 'EXTRA_CONFIGURE_OPTS="" ./bootstrap.sh'

+export LD_ALTEXEC=/usr/gnu/bin/ld
+
 #VERBOSE
 DEFAULT_CONFIGURE_OPTS="--enable-library-profiling --enable-shared"
 EXTRA_CONFIGURE_OPTS=${EXTRA_CONFIGURE_OPTS-$DEFAULT_CONFIGURE_OPTS}
@@ -24,7 +26,7 @@
 GHC_VER="$(${GHC} --numeric-version)"
 HADDOCK=${HADDOCK:-haddock}
 WGET="${WGET:-wget}"
-CURL="${CURL:-curl}"
+CURL="${CURL:-curl -k}"
 FETCH="${FETCH:-fetch}"
 TAR="${TAR:-tar}"
 GZIP_PROGRAM="${GZIP_PROGRAM:-gzip}"
@@ -304,6 +306,7 @@
   ./Setup configure $args || die "Configuring the ${PKG} package failed."

   ./Setup build ${EXTRA_BUILD_OPTS} ${VERBOSE} ||
+  LD_ALTEXEC= ./Setup build ${EXTRA_BUILD_OPTS} ${VERBOSE} ||
      die "Building the ${PKG} package failed."

   if [ ! ${NO_DOCUMENTATION} ]

10行目あたりの LD_ALTEXEC で強制的に GNU ld を使うようにしています。Solarisgccのリンカは GNU ld ではないのでたまにどハマリしますが、cabalの依存パッケージ類も GNU ld を前提としているようで、Solaris ld ではビルドできないようでした。Solaris ld は LD_ALTEXEC 環境変数を使って別のリンカを実行することができるので、Solaris 11 なら以下のように指定すれば GNU ld が使われます。

export LD_ALTEXEC=/usr/gnu/bin/ld 

24行目あたりのcurlの -k オプションはSSLの証明書の検証を行わないオプションです。

304行目あたりは苦肉の策なのですが、cabal-install の依存パッケージの中でHTTPモジュールだけは GNU ld だと逆にだめなようなので、Solaris ld でビルドするようにしました。
もっとましな方法がある気がしますが、Haskellが目的ではなく、ShellCheckが目的なのであんまり深追いはしてませんという言い訳で。

bootstrap.sh を実行すると、依存パッケージが自動的にダウンロードされてビルドされます。

$ export PATH=/opt/ghc/bin:$PATH
$ ./bootstrap.sh
...

デフォルトでは、~/.cabal 配下にパッケージがインストールされます。 cabal コマンドは ~/.cabal/bin 配下にインストールされるので、以下のようにPATHを通します。

$ export PATH=~/.cabal/bin:$PATH

パッケージのリストを更新します。

$ cabal update

(ようやく)ShellCheckをインストールします。

$ cabal install shellcheck

ビルドが成功すると、~/.cabal/bin 配下に shellcheck コマンドがインストールされます。

$ shellcheck -V
ShellCheck - shell script analysis tool
version: 0.4.5
license: GNU General Public License, version 3
website: http://www.shellcheck.net