インストール: GNU Bison | GNUのパーサージェネレーター

パーサージェネレーターの一種であるGNU Bisonをソースコードからインストールする。

GNU Bisonはプログラミング言語を開発する際に使われたりする。その他,PHPなどのプログラミング言語をソースコードからインストールする際にも必要となる。

手順

インストール情報
項目説明
配布元
リポジトリーbison.git – GNU bison (git mirror)
手順README-hacking – bison.git – GNU bison (git mirror)
依存情報
依存先 (必須)
依存先 (任意)リポジトリーからのビルド用: Autoconf, Automake, Flex, Gettext, Graphviz, Gzip, Help2man, Perl, Rsync, Tar, Texinfo
依存元PHP, Wine
インストール手順
sh -eux <<-"EOT"
PKG=bison VER=2.7.1 VER=3.5.3 TAG=v$VER PKG_VER=$PKG${VER:+-$VER}
LOCAL=~/.local J=$(grep -cs '^processor' /proc/cpuinfo || echo 2)
mkdir -p "$LOCAL/src"
cd "$LOCAL/src" if command -v git >/dev/null; then [ -e $PKG ] || git clone --depth 1 git://git.savannah.gnu.org/bison.git $PKG cd $PKG git fetch --depth 1 ${TAG:+origin tag $TAG} git checkout -f ${TAG:-master} git clean -dfX
git submodule update --init --progress --depth 1 || (
cd $(git submodule status | awk '/^+/ {print $2; exit}')
git fetch --shallow-since 2020-02-24 && git checkout
)
./bootstrap else [ -e $PKG_$VER ] || wget https://ftp.gnu.org/gnu/$PKG/$PKG_VER.tar.xz tar -xf $PKG_VER.* cd $PKG_VER fi make -kj $J distclean clean || : ./configure --prefix="$LOCAL/stow/$PKG_VER" make -j $J
make -j $J check
make -j $J install cd "$LOCAL/stow" echo $PKG${VER:+-}[0-9]* | xargs -n 1 stow --ignore=dir -D stow --ignore=dir $PKG_VER EOT
インストール例
日付バージョンOS依存関係
2019-03-312.7.1 (tgz)Ubuntu 18.04GNU Make 4.2.1, GCC 7.4.0
2020-03-27 Fri3.5.3 (git)Ubuntu 18.04GNU Make 4.2.1, GCC 7.4.0, GNU m4 1.4.18, Flex 2.6.4, Help2man 1.47.8, Texinfo 6.6

3.0.5-3.3.4まではmakemake checkに失敗したため,インストール例の2.7.1の次のバージョンが3.5.3になっている。

gnulibのリポジトリーのエラー

GNU Bisonではリポジトリーからのビルドにはbootstrapコマンドを使う。

このファイル内で,git submoduleでgnulibをダウンロードしてくるのだが,gnulibをまるごとダウンロードすると大きすぎるため,事前に git submodule update --init --depth 1 --progressを実行して最小限をダウンロードしている。

ただ,--depth 1だとgit submoduleの実行時やbootstrapの実行時に以下のエラーが出る。

error: Server does not allow request for unadvertised object d279bc6d9f9323e19ad
8c32b6d12ff96dfb0f5ba
Fetched in submodule path 'gnulib', but it did not contain d279bc6d9f9323e19ad8c32b6d12ff96dfb0f5ba. Direct fetching of that commit failed.
./bootstrap: Bootstrapping from checked-out bison sources...
./bootstrap: consider installing git-merge-changelog from gnulib
./bootstrap: getting gnulib files...                        
error: Server does not allow request for unadvertised object d279bc6d9f9323e19ad
8c32b6d12ff96dfb0f5ba
Fetched in submodule path 'gnulib', but it did not contain d279bc6d9f9323e19ad8c32b6d12ff96dfb0f5ba. Direct fetching of that commit failed.

必要な [d279bc6d9f9323e19ad8c32b6d12ff96dfb0f5ba] のコミットが含まれていないのが原因だ。

このコミットは2020-02-24のコミットのため,以下のコマンドのように,--shallow-since 2020-02-24でそこまでの履歴をダウンロードしている。

  git submodule update --init --progress --depth 1 || (
cd $(git submodule status | awk '/^+/ {print $2; exit}')
git fetch --shallow-since 2020-02-24 && git checkout
)

ビルドの失敗履歴

GNU Bisonはビルドがなかなか難しく,v2.7.1のtgzファイルのビルドに成功した後,3.3.2まではビルドかmake checkに失敗した。その後,3.5.3のリポジトリーからのビルドに成功した。

何かのために,失敗時の記録を残しておく。

v2.7.1をリポジトリーからビルドする場合,make実行時に以下のエラーが出た。

make  all-am
make[3]: Entering directory '/home/senooken/.local/src/bison/lib'
  AR       liby.a
ar: `u' modifier ignored since `D' is the default (see `U')
make[3]: *** No rule to make target 'timevar.c', needed by 'timevar.o'.  Stop.

また,3.3.2, 3.3.1, 3.2.91をリポジトリーからビルドするとmakeで以下のエラーが出た。src/scan-code-c.cは存在するが,src/scan-code.cは存在しないようだ。

  CC       src/bison-scan-code-c.o
src/scan-code-c.c:3:10: fatal error: src/scan-code.c: No such file or directory
 #include "src/scan-code.c"

3.2.4, 3.1.91をリポジトリーからビルドする場合,makeで以下のエラーが出た。

make[2]: Entering directory '/home/senooken/.local/src/bison'
  CC       src/bison-AnnotationList.o
In file included from src/AnnotationList.c:23:0:
src/AnnotationList.h:23:11: fatal error: bitsetv.h: No such file or directory
 # include <bitsetv.h>

3.3.2, 3.2.4, 3.1, 3.0.5のtarからのビルドだと,make checkで以下のエラーが出た。。

make[3]: 'examples/c/rpcalc/rpcalc' is up to date.
  LEX      examples/c++/calc++/scanner.cc
  CXX      examples/c++/calc++/calc__-scanner.o
g++: error: ./examples/c++/calc++/scanner.cc: No such file or directory
g++: fatal error: no input files
compilation terminated.

メーリングリストのやりとりで,bison-2.7.1ではmake checkに成功したとの報告を見つけ,2.7.1のtarファイルからビルドすると成功した。

なぜリポジトリーからのビルドや3.xでのビルドに失敗するのか不明だった。続報があり次第,手順を更新する。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です