GNU Screen開発版(4.1.0)でビルド時にエラー
GNU Screenの開発版(4.1.0、リビジョン:d94037c)で、ビルド時に以下のエラーが発生しました。
端的には、「構造体のメンバ変数を参照する際の名前が間違っている」というだけで、バグ報告もされている(1件目、2件目)ので、おそらく、すぐに修正されるものと思いますが、いちおうメモしておきます。
ビルド風景とエラー内容
$ make gcc -c -I. -I. -DETCSCREENRC='"//etc/screenrc"' -DSCREENENCODINGS='"//share/screen/utf8encodings"' -DHAVE_CONFIG_H -DGIT_REV=\""`git describe --always 2>/dev/null`"\" \ -g -O2 -D_GNU_SOURCE ansi.c ansi.c: In function ‘MFindUsedLine’: ansi.c:2930: error: ‘struct win’ has no member named ‘encoding’ make: *** [ansi.o] エラー 1
修正箇所
エラーメッセージにある通り、「ansi.c」の2930行目が問題となっています。
# endif #endif #ifdef UTF8 if (p->encoding == UTF8) /* ここの行が問題(2030行目) */ { if (ml->font != null && bcmp((char*)ml->font, null, p->w_width)) break;
この、
if (p->encoding == UTF8)
を、以下のように修正すれば完了です。
if (p->w_encoding == UTF8)
補足
修正自体は以上でおわりですが、せっかくなので、ここまで至った経緯をメモしておきます。
当該箇所より上の方をたどっていくと、2908行目で変数「p」は以下のように定義されていることが分かります。
struct win *p;
「struct win」という構造体は、「window.h」の中で定義されています。
【136行目〜306行目まで抜粋】
struct win { struct win *w_next; /* next window */ int w_type; /* type of window */ void *w_data; struct layer w_layer; /* our layer */ /* (※1) */ ... 省略 ... int w_c1; /* enable C1 flag */ int w_bce; /* enable backcol erase */ #if 0 int w_encoding; /* for input and paste */ /* (※2) */ #endif int w_decodestate; /* state of our input decoder */ ... 省略 ... }; #define w_encoding w_layer.l_encoding /* (※3) */ #define w_width w_layer.l_width
(※1)〜(※3)が関係する箇所です。
(※2)を見ると、メンバ変数「w_encoding」はプリプロセッサの過程で無効化されるので、
一見、「w_encodingなどというメンバ変数は今や無い」かと思うのですが、
(※3)の箇所で「w_encoding」を「w_layer.l_encoding」で置換しており、
(※1)の通り「w_layer」というメンバ変数は存在しているため、
p->w_encoding
は問題ない、ということになります。
また、「UTF8」という定数名でgrepすると、他の箇所でも「w_encoding」との比較や代入を行っていたため、
おそらく、上述の修正で問題ないだろうと思います。
補足2
そもそも、最新の安定版をつかえば、という話もあります。
2013/05/23 追記
5/13に修正されてますね。