インストール: Flex | 高速な字句解析機

GNOME Terminal

高速な字句解析機である Flex (Fast Lexical Analyzer) をソースコードからインストールする。

Flexはコンパイラーの作成のために使われることが多い。Wineの依存関係で必要になったためインストールした。

手順

インストール情報
項目 説明
配布元 westes/flex: The Fast Lexical Analyzer – scanner generator for lexing in C and C++
リポジトリー westes/flex: The Fast Lexical Analyzer – scanner generator for lexing in C and C++
手順 flex/README.md at master · westes/flex
依存情報
依存先 (必須) Make (GNU Make)
依存先 (任意) リポジトリーからのビルドで必要: shell (Bash), m4 (GNU m4), GNU bison, autoconf, automake, gettext, help2man, tar, gzip, lzip, GNU texinfo, GNU indent
依存元 Wine
インストールコマンド
sh -eux <<-"EOT"
PKG=flex VER=2.6.4 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 && command -v flex) >/dev/null; then
  [ -e $PKG ] || git clone --depth 1 git://github.com/westes/flex $PKG
  cd $PKG
git fetch --depth 1 ${TAG:+origin tag $TAG} git checkout -f ${TAG:-master}
git clean -dfX else [ -e $PKG_VER ] || wget https://github.com/westes/flex/releases/download/$TAG/$PKG_VER.tar.gz tar -xf $PKG_VER.* cd $PKG_VER fi
make -kj $J distclean clean || :
[ -e configure ] || [ -e configure.ac ] && autoreconf -is [ -x configure ] && ./configure --prefix="$LOCAL/stow/$PKG_VER"
FLAG=
[ $(echo $VER | sed 's/\.//g') -lt 265 ] && FLAG="CFLAGS='-g -O2 -D_GNU_SOURCE'"
make -j $J "$FLAG"

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 依存関係
2020-03-27 Fri 2.6.4 Ubuntu 18.04 GNU Make 4.2.1, GCC 7.4.0, GNU Bison 2.7.1, GNU m4 1.4.18, help2man 1.47.8, gettext 0.19.8.1, GNU Texinfo 6.6

v2.6.4はtgzとリポジトリーからの両方でビルドに成功した。

ビルドに際し注意点が2点あるので説明する。

リポジトリーからのビルドにはflexが必要

当初,v2.6.4のリポジトリーからのビルドでは,makeで以下のエラーが出た。

make[2]: Entering directory '/home/senooken/.local/src/flex/src'
/bin/bash ../build-aux/ylwrap scan.l .c scan.c -- /bin/bash /home/senooken/.local/src/flex/build-aux/missing flex
/home/senooken/.local/src/flex/build-aux/missing: line 81: flex: command not found
WARNING: 'flex' is missing on your system.
         You should only need it if you modified a '.l' file.
         You may want to install the Fast Lexical Analyzer package:
         <https://github.com/westes/flex>
make[2]: *** [Makefile:1464: scan.c] Error 12

flexコマンドを実行しようとして失敗している。

リポジトリーからのビルドの場合,flexが必要のようだ (参考: flex-2.6.4: segfault during build · Issue #219 · westes/flex)。

そのため,以下のようにGitを使ったリポジトリーからのビルドには,gitの他にflexコマンドがあることを条件に加えた。

if (command -v git && command -v flex) >/dev/null; then

stage1flexのクラッシュ

リポジトリーからのビルドを断念し,tgzからv2.6.4のインストールを試みると,makeで以下のエラーが出た。

Making all in src
make[1]: Entering directory '/home/senooken/.local/src/flex-2.6.4/src'
make  all-am
make[2]: Entering directory '/home/senooken/.local/src/flex-2.6.4/src'
./stage1flex   -o stage1scan.c ./scan.l
make[2]: *** [Makefile:1696: stage1scan.c] Segmentation fault (core dumped)
make[2]: Leaving directory '/home/senooken/.local/src/flex-2.6.4/src'

stage1flexの実行でクラッシュしている。

調べたところ,「flex-2.6.4 build fails with segfault on Ubuntu 18.04 · Issue #425 · westes/flex」のissueのコメントで対応できた。

デフォルトでは,MakefileCFLAGS = -g -O2が指定されている。以下のように,CLFAGSの末尾に-D_GNU_SOURCEを追加する。

./configure CFLAGS='-g -O2 -D_GNU_SOURCE'
make CFLAGS='-g -O2 -D_GNU_SOURCE'

glibc 2.26+でconfig.hで定義されているreallocarrayのプロトタイプが変わったのが原因らしい。

Flexの本体には,2017-09-04のコミット [24fd0551333e7eded87b64dd36062da3df2f6380] で対応されたらしい。v2.6.5からこの問題は解決するようだ。

そのため,手順内では以下のようにv2.6.5未満の場合だけCFLAGSを変更するようにした。

FLAG=
[ $(echo $VER | sed 's/\.//g') -lt 265 ] && FLAG="CFLAGS='-g -O2 -D_GNU_SOURCE'"
make -j $J "$FLAG"

コメントを残す

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