2016-11-03

LightDM 1.20.0をビルドしてみる

まず最初にLightDM 1.20.0を単独でビルドできるか試してみます。これが上手くいってからpkgsrc化をおこなおうと思っています。ビルドするためにはconfigureしてからmake && make installするわけですが、この場合のインストール対象は/usr/local以下になります。いろいろな問題が発生して、ビルドヲ正常終了するところまで辿りつけません。

いきなり次のような問題が発生しました。
  1. configure: error: libgcrypt not found」というエラーが出ました。
  2. NetBSD標準の/usr/bin/makeではビルドできませんでした。
  3. liblightdm-gobject/language.cでコンパイルエラーになりました。
  4. ビルド中に「ld: warning: libintl.so.1, needed by /usr/pkg/lib/libgio-2.0.so, may conflict with libintl.so.8」という警告が出ました。
  5. Shared object "libXi.so.7" not found」というエラーが出てビルドが止まりました。

1番目の問題は、pkgsrcでインストールされるディレクトリが/usr/pkg以下になっていることが原因だと思います。見つからないと訴えているファイルは/usr/pkg/libにあるのですが検索対象になっていないのでしょう。以下のようにしてconfigureを実行することで対処しました。
 # env CPPFLAGS='-I/usr/pkg/include' ./configure

2番目の問題はconfigureで生成されたGNU make 4.1を利用することで対処しました。これはMATEをビルドする時にインストールされたものです。

3番目の問題はWIPにあるパッチを参考にして対処しました。setlocale()の引数にLC_IDENTIFICATIOが使われていますが、これはGNU拡張なのでNetBSDには入っていません。WIPのパッチではコンパイル対象から外しているだけですが、当面はこれで凌ぐとしても、きちんと直すにはどうすれば良いのでしょうか。2012年10月30日付のバグ報告「lightdm-1.4.0 fails to build on uclibc due to LC_IDENTIFICATION undeclared」(Bug #1073080)がありました。問題は把握しているようですが、何の進展もありません。
--- liblightdm-gobject/language.c.org    2016-11-03 13:12:38.000000000 +0900
+++ liblightdm-gobject/language.c    2016-11-03 13:22:49.000000000 +0900
@@ -227,10 +227,16 @@
         if (locale)
         {
             gchar *current = setlocale (LC_ALL, NULL);
+#ifdef LC_IDENTIFICATION
             setlocale (LC_IDENTIFICATION, locale);
+#endif
             setlocale (LC_MESSAGES, "");

+#ifdef _NL_IDENTIFICATION_LANGUAGE
             gchar *language_en = nl_langinfo (_NL_IDENTIFICATION_LANGUAGE);
+#else
+            gchar *language_en = NULL;
+#endif
             if (language_en && strlen (language_en) > 0)
                 priv->name = g_strdup (dgettext ("iso_639_3", language_en));

@@ -270,10 +276,16 @@
         if (locale)
         {
             gchar *current = setlocale (LC_ALL, NULL);
+#ifdef LC_IDENTIFICATION
             setlocale (LC_IDENTIFICATION, locale);
+#endif
             setlocale (LC_MESSAGES, "");

+#ifdef _NL_IDENTIFICATION_TERRITORY
             gchar *country_en = nl_langinfo (_NL_IDENTIFICATION_TERRITORY);
+#else
+            gchar *country_en = NULL;
+#endif
             if (country_en && strlen (country_en) > 0 && g_strcmp0 (country_en, "ISO") != 0)
                 priv->territory = g_strdup (dgettext ("iso_3166", country_en));

4番目の問題は何をした時に出てきたメッセージなのかを突き止めなければなりません。確かに/usr/lib/libintl.so.1/usr/pkg/lib/libintl.so.8があります。しかし何をした時に出るのかが分からないと対処のしようもありません。

5番目の問題は本来出てはいけないメッセージのような気がします。問題となっているファイルは/usr/X11R7/lib/libXi.so.7として存在しているので、特別に何も設定しなくても参照できなくてはいけない筈です。ダイナミックライブラリが見つからない時には、環境変数LD_LIBRARY_PATHを設定するとか、ファイル/etc/ld.so.confを使うというのが常套手段ですが、それは非標準ライブラリを利用したい場合の話であってlibXi.soは違うのではないでしょうか。想像するに、configureで生成されたファイルの何処かでダイナミックライブラリの検索パスを壊しているような気がします。

0 件のコメント:

コメントを投稿