rcmdnk's blog
Last update

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

シェルスクリプトのチェックツールShellCheckをHomebrewでインストールしようとしたら ちょっと面倒だった件。

ShellCheck

ShellCheckはシェルスクリプトの文法をチェックしてくれるツールで、 Vimとかと連携しておくと捗ります。

LinuxでのShellCheckのインストール

インストールするのはCentOS 7です。

LinuxbrewがHomebrewに統合されたのを機に、 ユーザーローカルエリアにインストールするツールはLinuxでもHomebrewで行うようにしてきました。

その話は随分前の話なんですがなんですが、今更ShecllCheckが入ってないことに気が付きました。

ということでインストールしてみようとすると、

$ brew install shellcheck
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
No changes to formulae.
==> Installing dependencies for shellcheck: pandoc
==> Installing shellcheck dependency: pandoc
==> Downloading https://hackage.haskell.org/package/pandoc-2.9.1.1/pandoc-2.9.1.1.tar.gz
Already downloaded: /home/user/.cache/Homebrew/downloads/4292bf61443a19f2a8957e8af9c220e56e8b2d83a1497b14fbbb1715811569f5--pandoc-2.9.1.1.tar.gz
==> cabal v1-sandbox init
==> cabal v1-update
==> cabal v1-sandbox init
==> cabal v1-install --jobs=32 --max-backjumps=100000 --only-dependencies
Last 15 lines from /home/user/.cache/Homebrew/Logs/pandoc/04.cabal:
2020-XX-XX XX:XX:XX +0900
cabal
v1-install
--jobs=32
--max-backjumps=100000
--only-dependencies
gcc-5: error: unrecognized command line option '-no-pie'
`gcc-5' failed in phase `C Compiler'. (Exit code: 1)
READ THIS: https://docs.brew.sh/Troubleshooting

というエラー。 探してみるとこんなIssueが。

shellcheck fails to install · Issue #10694 · Homebrew/linuxbrew-core

ここで

brew install gcc@8
brew install shellcheck -svd --cc=gcc-8

というのがありますが、ちょっと注意が必要なのは何も考えずにgcc@8を入れると glibcが入って環境によっては問題が起こる点。

gccには--without-glibcというオプションがあるのですが、gcc@8Formulaにはその様なオプションはありません。

ということで仕方ないので自作。

homebrew-rcmdnkpac/[email protected]

追記: 2022/06/23

上記は最新レポジトリでは削除済(Formulaのアップデートが面倒で、特にもう必要なかったので。)

remove gcc@8, obsolete, need to update script if needed · rcmdnk/homebrew-rcmdnkpac@a27d2b7

追記ここまで

gcc@8のFormulagccのFormula のglibcのところをちょっと足しただけですが。

これで、Linuxで

$ brew install rcmdnk/rcmdnkpac/rcmdnk-gcc@8 --without-glibc

でglibcなしでgcc@8が入れられます。

これでOK、と思ってたら

$ brew install shellcheck --cc=gcc-8
Warning: You passed `--cc=gcc-8`.
You will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew's GitHub,
Discourse, Twitter or IRC. You are responsible for resolving any issues you
experience while you are running this unsupported configuration.
==> Installing dependencies for shellcheck: pandoc
==> Installing shellcheck dependency: pandoc
Error: An exception occurred within a child process:
  RuntimeError: The requested Homebrew GCC was not installed. You must:
    brew install gcc@8

どうやら--ccオプションはHomebrewの中でFormulaから処理しているらしく、 gcc@8の名前で入ってないとだめ、ということに。。。

同じ名前のFormulaを別のTapで入れるとconflictを起こして問題になるので、 Linuxbrew-coreのFormulaをアップデートするしかありません。

gcc@8を–without-glibcで入れられるように

add –without-glibc option to gcc@X by rcmdnk · Pull Request #19054 · Homebrew/linuxbrew-core

gccのFormulaを参考にすれば簡単にできるのでgcc@8なども--without-glibc出来るように変更。

Pull Requestを出してある状態ですが、とりあえず自分でFormula([email protected]など)を

~/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

にコピーしてインストール。

$ brew install gcc@8  --without-glibc

入りました。

すでにPull Requestはマージされてるのでbrew updateすればgcc@8なども--without-glibcで入れられるはずです。

without-glibcなgcc@8でトライ

これでもう一度トライ:

$ brew install shellcheck -svd --cc=gcc-8
...
Downloaded   aeson-1.4.6.0
Starting     aeson-1.4.6.0
Building     JuicyPixels-3.3.4
Building     aeson-1.4.6.0
Completed    hxt-9.3.1.18
Failed to install JuicyPixels-3.3.4
Build log ( /tmp/pandoc-20200115-158652-15h1ohp/pandoc-2.9.1.1/.cabal-sandbox/logs/ghc-8.8.1/JuicyPixels-3.3.4-683Rg9ZKIIHL6oz4xD5Bes.log ):
cabal: Entering directory '/tmp/cabal-tmp-158859/JuicyPixels-3.3.4'
Configuring JuicyPixels-3.3.4...
Preprocessing library for JuicyPixels-3.3.4..
Building library for JuicyPixels-3.3.4..
[ 1 of 30] Compiling Codec.Picture.InternalHelper ( src/Codec/Picture/InternalHelper.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/InternalHelper.o )
[ 2 of 30] Compiling Codec.Picture.Metadata.Exif ( src/Codec/Picture/Metadata/Exif.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Metadata/Exif.o )
[ 3 of 30] Compiling Codec.Picture.Metadata ( src/Codec/Picture/Metadata.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Metadata.o )
[ 4 of 30] Compiling Codec.Picture.Tiff.Internal.Types ( src/Codec/Picture/Tiff/Internal/Types.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Tiff/Internal/Types.o )
[ 5 of 30] Compiling Codec.Picture.Tiff.Internal.Metadata ( src/Codec/Picture/Tiff/Internal/Metadata.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Tiff/Internal/Metadata.o )
[ 6 of 30] Compiling Codec.Picture.Types ( src/Codec/Picture/Types.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Types.o )
<command line>: /lib/libz.so: wrong ELF class: ELFCLASS32
cabal: Leaving directory '/tmp/cabal-tmp-158859/JuicyPixels-3.3.4'
Completed    cryptonite-0.26
Completed    aeson-1.4.6.0
cabal: Error: some packages failed to install:
JuicyPixels-3.3.4-683Rg9ZKIIHL6oz4xD5Bes failed during the building phase. The
exception was:
ExitFailure 1
/home/user/.linuxbrew/opt/curl/bin/curl --version
java -version
/home/user/.linuxbrew/Homebrew/Library/Homebrew/build.rb (Formulary::FormulaLoader): loading /home/user/.linuxbrew/Homebrew/Library/Taps/linuxbrew/homebrew-xorg/Formula/xorg.rb

で止まってしまいます。

Failed to install JuicyPixels-3.3.4
    Build log ( /tmp/pandoc-20200115-158652-15h1ohp/pandoc-2.9.1.1/.cabal-sandbox/logs/ghc-8.8.1/JuicyPixels-3.3.4-683Rg9ZKIIHL6oz4xD5Bes.log ):

の辺が失敗している模様。

このログを見てみると

cabal: Entering directory '/tmp/cabal-tmp-158859/JuicyPixels-3.3.4'
Configuring JuicyPixels-3.3.4...
Preprocessing library for JuicyPixels-3.3.4..
Building library for JuicyPixels-3.3.4..
[ 1 of 30] Compiling Codec.Picture.InternalHelper ( src/Codec/Picture/InternalHelper.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/InternalHelper.o )
[ 2 of 30] Compiling Codec.Picture.Metadata.Exif ( src/Codec/Picture/Metadata/Exif.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Metadata/Exif.o )
[ 3 of 30] Compiling Codec.Picture.Metadata ( src/Codec/Picture/Metadata.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Metadata.o )
[ 4 of 30] Compiling Codec.Picture.Tiff.Internal.Types ( src/Codec/Picture/Tiff/Internal/Types.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Tiff/Internal/Types.o )
[ 5 of 30] Compiling Codec.Picture.Tiff.Internal.Metadata ( src/Codec/Picture/Tiff/Internal/Metadata.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Tiff/Internal/Metadata.o )
[ 6 of 30] Compiling Codec.Picture.Types ( src/Codec/Picture/Types.hs, dist/dist-sandbox-4b7509f0/build/Codec/Picture/Types.o )
<command line>: /lib/libz.so: wrong ELF class: ELFCLASS32
cabal: Leaving directory '/tmp/cabal-tmp-158859/JuicyPixels-3.3.4'

どうも/lib/libz.soを見てるのが悪いようですが、 ~/.linuxbrew/lib/libz.soにもちゃんとHomebrewで入れたのが入っていて、 環境変数LD_LIBRARY_PATHにも~/.linuxbrew/lib/libz.soは入っています。

without-glibcなgcc@9でトライ

もう一つ新しいgccがあるのでそれを入れてみる

$ brew install gcc@9  --without-glibc
Updating Homebrew...
==> Auto-updated Homebrew!
Updated Homebrew from 13f508d0d to 50354852f.
No changes to formulae.
==> Downloading https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
==> ../configure --with-bugurl=https://github.com/Homebrew/linuxbrew-core/issues --disable-multilib --prefix=/home/user/.linuxbrew/Cellar/gcc@9/9.2.0_1 --libdir=/home/user/.linuxbrew/Cellar/gcc@9/9.2.0_1/lib/gcc/9 --enable-languages=c,c++,objc,obj-c++,fortran --disable-nls --enable-checking=release --program-suffix=-9 --with-gmp=/home/user/.linuxbrew/opt/gmp --with-mpfr=/home/user/.linuxbrew/opt/mpfr --with-mpc=/home/user/.linuxbrew/opt/libmpc --with-isl=/home/user/.linuxbrew/opt/isl --with-pkgversion=Homebrew GCC 9.2.0_1 --without-glibc
==> make
Last 15 lines from /home/user/.cache/Homebrew/Logs/gcc@9/02.make:
/bin/sh ../../gcc/../move-if-change tmp-constrs.h tm-constrs.h
/bin/sh ../../gcc/../move-if-change tmp-preds.c insn-preds.c
echo timestamp > s-constrs-h
/bin/sh ../../gcc/../move-if-change tmp-preds.h tm-preds.h
echo timestamp > s-preds
/bin/sh ../../gcc/../move-if-change tmp-condmd.c build/gencondmd.c
echo timestamp > s-preds-h
echo timestamp > s-conditions
rm gcc.pod
make[3]: Leaving directory `/tmp/gcc@9-20200115-163739-1cqulwf/gcc-9.2.0/build/gcc'
make[2]: *** [all-stage1-gcc] Error 2
make[2]: Leaving directory `/tmp/gcc@9-20200115-163739-1cqulwf/gcc-9.2.0/build'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/tmp/gcc@9-20200115-163739-1cqulwf/gcc-9.2.0/build'
make: *** [all] Error 2
sh: line 1: 193696 Segmentation fault      /usr/bin/gcc --version 2> /dev/null
READ THIS: https://docs.brew.sh/Troubleshooting
These open issues may also help:
llvm: can't pick up gcc-toolchain if run from opt/llvm/bin/clang++  https://github.com/Homebrew/linuxbrew-core/issues/18601

ここでsegmentation fault…

これは面倒なのでこれ以上見てません。。。

gcc@7とか

もうちょっと前のgccを使ってみてもインストールは出来ましたがshellcheckのインストールで gcc@8の場合と同じようになりました。

gccとか全部なしでやって見る

その他、gcc自体もbrew rmして、とかもやってみましたが何も上手く行かず。。。

Homebrewではどうやってもうまく行きません。

直接cabal install

shellcheckのインストール時に、cabalを使っているので直接使ってみる

$ cabal install ShellCheck

が、これも最初のものと同じエラーが出ます。。。

諦めて直接

のREADMEに従ってpre-compiledされたものを入れてしまうことにしました。

$ scversion="stable"
$ wget -qO- "https://storage.googleapis.com/shellcheck/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv
$ cp shellcheck-${shellcheck} ~/usr/bin

もうこれで良しとしておきます。。。

MacでのShecllCheck

Macでも確認したらなぜか入ってなくてHomebrewで再インストールしたのですが、 その際にBrewfileにすでにあるよ、という homebrew-file のwarningが出て、おかしいなと思って Brewfile の履歴を見るとshellcheck自体は2017年に追加されてそのままでした。 それだと前のMacのときのものなので、Mac新しくしてからずっと使ってなかった? (でも最近でもVimでシェルスクリプトのチェックを見たような気がするが。。。)

確かに再インストール前はVim+Aleでチェックが効いてなかったのが、

インストール後には効くようになりました、当たり前だけど。

なぞ。。。

Sponsored Links
Sponsored Links

« Pythonでlistからfor loopでremoveする際の注意 macOSでcronジョブの出力がメールに送られない »

}