SolarisでXFree86

Firefoxで必要なpangoをmakeしているとこんなエラーがでました。

 gcc -DHAVE_CONFIG_H -I. -I. -I.. -DG_LOG_DOMAIN=\"Pango\" -DPANGO_ENABLE_BACKEND -DPANGO_ENABLE_ENGINE -DSYSCONFDIR=\"/usr/local/etc\" -DLIBDIR=\"/usr/local/lib\" -I.. -DPANGO_ENABLE_DEBUG -DG_DISABLE_DEPRECATED -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/openwin/include -I/usr/include/freetype2 -g -O2 -Wall -MT pangoxft-font.lo -MD -MP -MF .deps/pangoxft-font.Tpo -c pangoxft-font.c  -fPIC -DPIC -o .libs/pangoxft-font.o
In file included from ../pango/pangoxft-render.h:30,
                 from ../pango/pangoxft.h:30,
                 from pangoxft-private.h:25,
                 from pangoxft-font.c:27:
/usr/openwin/include/X11/Xlib.h:32: warning: ignoring #pragma ident
In file included from /usr/openwin/include/X11/extensions/Xrender.h:33,
                 from /usr/openwin/include/X11/Xft/Xft.h:37,
                 from ../pango/pangoxft-render.h:31,
                 from ../pango/pangoxft.h:30,
                 from pangoxft-private.h:25,
                 from pangoxft-font.c:27:
/usr/openwin/include/X11/Xutil.h:56: warning: ignoring #pragma ident
In file included from ../pango/pangoxft.h:30,
                 from pangoxft-private.h:25,
                 from pangoxft-font.c:27:
../pango/pangoxft-render.h:90: error: expected declaration specifiers or '...' before 'XTrapezoid'
make[4]: *** [pangoxft-font.lo] Error 1
make[4]: Leaving directory `/export/home2/hoge/pango/pango-1.15.0/pango'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/export/home2/hoge/pango/pango-1.15.0/pango'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/export/home2/hoge/pango/pango-1.15.0/pango'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/export/home2/hoge/hoge/pango-1.15.0'
make: *** [all] Error 2

pango/pangoxft-render.hの90行目あたりではこんな関数の定義があります。

  /*< public >*/
  void (*composite_trapezoids) (PangoXftRenderer *xftrenderer,
                                PangoRenderPart   part,
                                XTrapezoid       *trapezoids,
                                int               n_trapezoids);

この3つめの引数の型であるXTrapezoidが定義されていませんっていうエラー。
Linux環境(Redhat)なんかだと/usr/X11R6/include/X11/extensions/Xrender.hにこう定義があります。

typedef struct _XTrapezoid {
    XFixed  top, bottom;
    XLineFixed  left, right;
} XTrapezoid;

でもSolarisにデフォルトで入っているX環境にはそんな定義がないので、XFree86をインストールする必要があるみたい。

ソースを入手

ソースはftp://ftp.xfree86.org/pub/XFree86/4.6.0/source/から手に入ります。以下のすべてをダウンロードして展開。

全部展開します。展開するとxcというディレクトリができます。

開発環境の準備

ビルドのために、シャドウディレクトリのシンボリックリンクをつくります。LinuxだとXの環境にlndirってコマンドがありますが、Solarisにはそんなのありません。親切なことにコマンドが作れるようになっています。xc/config/util以下にあります。

$ cd xc/config/util
$ CC=/usr/local/bin/gcc ; make -f Makefile.ini lndir
ln -s ../../include X11
gcc -o lndir  -O -I. lndir.c
rm -f X11
$ cd ../../build
$ ../config/util/lndir ../../xc

README.Solarisを読む

ビルド時の注意事項がいくつか書いてあります。

  • GCCでもProWorksでも大丈夫。
  • GCCは最低でも2.7.2以上がお勧め。初期のGCCだと動かないことがあるよ。
  • SPARCプラットフォームの場合は、GCCは32bitバイナリで生成されていること。
  • "sun"ってpredefineのGCCを使ってること。必要な場合は/usr/local/lib/gcc-lib/*/*/specsの*predefines:の行を編集する。
  • SPARCプラットフォームの場合、xc/config/cf/hosts.defのBuildXFree86OnSparcSunOSをYESに設定する必要がある。そうしないと、XSun*サーバの古い劣化したものしか作れない。
  • GCCコンパイルされてたスレッド化されたXlibは若干問題がある。98%は正常に動作するけれども、クライアントが時々へんな感じでハングする。有名どころでは、xv-3.10みたいなイメージビューアでこのような問題がおきる。
  • GCCを使う場合、xc/config/cf/hosts.defのThreadedXをNOに設定することがお勧め。ProWorksでは設定しなくても問題ない。
  • GCCXFree86をビルドする場合、gccに加えてGNU binutilsに入っているc++filtが追加で必要。gasとGNU binutilにあるldはインストールしないこと。両方ともSunのオリジナルを使うこと。/opt/SUNWspro/binディレクトリをつくって、cc,CC,c++flitというシンボリックリンクをそれぞれgcc,g++,c++flitからシンボリックリンクを張ってもいいかもしれない。
  • ProWorksをXFree86コンパイルに使う場合は、ProWorksツールへのPATHを適当に通してあげること。通常は/opt/SUNWspro/binにあります。
  • 必ずPATHの先頭に/usr/ccs/binを持ってくること。ここにあるユーティリティがGNUのものに置き換わることで発生する問題があります。なので、/usr/ccs/binにあるユーティリティが他の場所よりも優先させなければなりません。(有名なところではGNUのarではビルドできません。)

これに従って、xc/conig/cf/hosts.defを作って、2行追加。

$ cd build/config/cf
$ cp xf86site.def hosts.def

以下の2行を追加。

#define BuildXFree86OnSparcSunOS        YES
#define ThreadedX                       NO

いよいよmake

buildディレクトリでmakeします。

$ cd build
$ CC=/usr/local/bin/gcc make World > World.log 2>&1

時間はかかったけど以外にスムーズにコンパイルできちゃった。

インストール

rootにsuしてインストール。

$ su - root
# cd ~hoge/XFree86/xc/build
# /usr/local/bin/make install
# /usr/local/bin/male install.man

/usr/X11R6以下にインストールされます。もっと苦労するかとおもったけど、すんなりビルドできました。