Solaris 11 で ShellCheck をビルドするメモ
ShellCheck はシェルスクリプトの文法チェッカです。文法チェックだけでなく、ダブルクォート忘れなども指摘してくれるので、コードの品質向上にも非常に役立ちます。
ShellCheckはWebブラウザ版もありますが、CLI版もあります。多くのLinuxディストリビューションにはパッケージがあるようですが、例のごとくSolarisにはないのでビルドしてみることにしました。
ShellCheckはHaskellで書かれているのでまずはHaskellコンパイラをインストールしないといけません。Haskellが入れば、cabal-install (Perlのcpanみたいなもの)で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 を使うようにしています。Solarisのgccのリンカは 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