2009年8月15日土曜日

pkgsrcでFirefox3をインストールしたらGran Paradiso

以前、



pkgsrcでFirefox2をインストールしたらBon Echo ???



ということがありましたが、Firefox3は、Gran Paradisoという名前になってました。



200908141



mozillaのWebサイトにも
http://www.mozilla.org/projects/granparadiso/
というのがちゃんとあるんですね。



200908142



さて、今回も懲りずにSolaris8でpkgsrcを使ってFrefox3をインストールしたんですが、Firefox 2のときのように、bmake installだけでは済まず、いろいろと手を加えてやる必要がありました。



ビルドしたときはfirefox-3.0.13でして、そのうちpkgsrcのほうが修正されて、すんなりインストールできるようになってしまうかもしれませんが。


まず最初に起きたエラーは、mozilla/memory/jemalloc/jemalloc.c で、

jemalloc.c:317:20: stdint.h: No such file or directory
jemalloc.c:1029: error: thread-local storage not supported for this target

というもの。

stdint.hは、無いものは仕方が無いのでincludeしなきゃいい、ってだけのこと。

問題は2個めのほうの、thread-local storage not supported for this target というエラー。

よくわかんないので、Webで見つけた情報に従うことにして、/etc/mk.confに
PKG_OPTIONS.gecko=-mozilla-jemalloc
と書き加えました。jemalloc自体を使わなくしてしまう、ってことでしょうか。

PKG_DEFAULT_OPTIONS=-mozilla-jemalloc
よりは、
PKG_OPTIONS.gecko=-mozilla-jemalloc
の方が、いくらか望ましいんじゃなかな、という感じで。
ちなみに、最初、
PKG_OPTIONS.firefox3=-mozilla-jemalloc
と書いて、時間を無駄にしました。
geckoなのか。

ビルド中に表示されるメッセージ
==========================================================================
The supported build options for firefox3 are:

        debug mozilla-jemalloc mozilla-single-profile
        official-mozilla-branding

The currently selected options are:

        mozilla-jemalloc

You can select which build options to use by setting PKG_DEFAULT_OPTIONS
or the following variable.  Its current value is shown:

        PKG_OPTIONS.gecko (not defined)

==========================================================================

をちゃんと見てればわかることではありますけど。



次のエラーは
mozilla/uriloader/base/nsDocLoader.cpp あたりの

In file included from ../../dist/include/gfx/nsCoord.h:42,
                 from ../../dist/include/layout/nsIPresShell.h:58,
                 from nsDocLoader.cpp:58:
../../dist/include/xpcom/nsMathUtils.h: In function `float NS_roundf(float)':
../../dist/include/xpcom/nsMathUtils.h:54: error: `floorf' was not declared in this scope
../../dist/include/xpcom/nsMathUtils.h:54: error: `ceilf' was not declared in this scope
../../dist/include/xpcom/nsMathUtils.h: In function `float NS_ceilf(float)':
../../dist/include/xpcom/nsMathUtils.h:111: error: `ceilf' was not declared in this scope
../../dist/include/xpcom/nsMathUtils.h: In function `float NS_floorf(float)':
../../dist/include/xpcom/nsMathUtils.h:123: error: `floorf' was not declared in this scope

というエラー。

なるほど、Solaris8には、floorf、ceilfという関数が無いんですか。


これについては、使われている箇所が少なかったので、ひたすら、castを使って全部書き換えました。

return x >= 0.0f ? floorf(x + 0.5f) : ceilf(x - 0.5f);
となっていれば
return x >= 0.0f ? (float)floor((double)(x + 0.5f)) : (float)ceil((double)(x - 0.5f));
という感じ。



次のエラーは
mozilla/gfx/src/thebes/nsThebesDeviceContext.cpp

nsThebesDeviceContext.cpp: In member function `nsresult nsThebesDeviceContext::SetDPI()':
nsThebesDeviceContext.cpp:177: error: `round' was not declared in this scope
というもの。

はぁ、Solaris8には、roundも無いんですか。

FreeBSDの
/usr/src/lib/msun/src/s_round.c
でroundのソースコードがあったので、それをもらってきてコピペしました。
ただ、FreeBSDではisfiniteという関数が使われていて、Solaris8にはisfiniteも無かったんです。

FreeBSDの
/usr/src/lib/msun/src/s_isfinite.c
を見ると、これは使えないだろう、という気がしたのでパス。

Solaris8には、finiteという関数ならあったので、それでいいんぢゃね?と・・・微妙に違いがあるようですけど、まあいいか。

こんなのをコピペしました。

#include <ieeefp.h>
double
round(double x)
{
    double t;

    //if (!isfinite(x))                                                         
    if (!finite(x))
        return (x);

    if (x >= 0.0) {
        t = floor(x);
        if (t - x <= -0.5)
            t += 1.0;
        return (t);
    } else {
        t = floor(-x);
        if (t + x <= -0.5)
            t += 1.0;
        return (-t);
    }
}


次のエラーが少し面倒な感じ。
mozilla/toolkit/xre/nsNativeAppSupportUnix.cpp
にて

nsNativeAppSupportUnix.cpp: In member function `virtual nsresult nsNativeAppSupportUnix::Start(PRBool*)':
nsNativeAppSupportUnix.cpp:242: error: `setenv' was not declared in this scope
nsNativeAppSupportUnix.cpp:251: error: `unsetenv' was not declared in this scope

というエラー。Solaris8には、setenv、unsetenvが無い、と。あってよさそうなのに無い、ってのが多い。

これですが、pkgsrcで用意してくれている、libnbcompat.aというライブラリの中に、setenv、unsetenvがあるので、このlibnbcompatをリンクしちゃえばいい、と思いまして、
nsNativeAppSupportUnix.cpp
の中に
extern "C" {
int setenv(const char *name, const char *value, int overwrite);
void unsetenv(const char *name);
}
を書き加えて、あとは、めんどくさかったので、Makefileを直接書き換え。
mozilla/toolkit/library/libxul-rules.mk
の中で、うーん・・・と眺めていって
EXTRA_DSO_LDOPTS += \
        $(LIBS_DIR) \
        $(JPEG_LIBS) \
        $(PNG_LIBS) \
        $(LCMS_LIBS) \
        $(MOZ_JS_LIBS) \
        $(NSS_LIBS) \
        /usr/pkg/lib/libnbcompat.a $(NULL)
でいいんじゃないかな、と。


最初、extern "C"をつける必要があることに気がついてなくて、リンク時に、またもやsetenv、unsetenvが無いとエラーになり、悩んでしまいました。ここはC++でしたね。C++の場合、関数名だけじゃなくて、引数の型まで厳密に見てるので、こうやらないといけないんですよね。


とまあ、だいたい、以上のような修正で、firefox3がビルドできました。




2 件のコメント:

  1. firefox3のjemallocの問題は、私が調べた限りでは、コンパイラが対応していないのが原因のようです。同じ問題にかなり前にはまりまして、何度もコンパイルした記憶があります。NetBSD5系では、gccは4.1.3で、firefox3に新機能があるのに、それを使いこなせないという...。
    興味があったら調べてみてください。

    返信削除
  2. スレッド毎にローカル変数を持てるようにする
    ・・・という機能らしいですね。
    コードを書くのは楽になりそうですが、変なことをやって、バグが紛れ込んだりして、大変なことになりそうな感じも。
    マルチスレッドのデバッグって、やりたくないなぁ[E:coldsweats01]

    返信削除