インストール: 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 |
日付 | バージョン | OS | 依存関係 |
---|---|---|---|
2019-03-31 | 2.7.1 (tgz) | Ubuntu 18.04 | GNU Make 4.2.1, GCC 7.4.0 |
2020-03-27 Fri | 3.5.3 (git) | Ubuntu 18.04 | GNU 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まではmake
やmake 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でのビルドに失敗するのか不明だった。続報があり次第,手順を更新する。