以前、
ということがありましたが、Firefox3は、Gran Paradisoという名前になってました。
mozillaのWebサイトにも
http://www.mozilla.org/projects/granparadiso/
というのがちゃんとあるんですね。
さて、今回も懲りずに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がビルドできました。
firefox3のjemallocの問題は、私が調べた限りでは、コンパイラが対応していないのが原因のようです。同じ問題にかなり前にはまりまして、何度もコンパイルした記憶があります。NetBSD5系では、gccは4.1.3で、firefox3に新機能があるのに、それを使いこなせないという...。
返信削除興味があったら調べてみてください。
スレッド毎にローカル変数を持てるようにする
返信削除・・・という機能らしいですね。
コードを書くのは楽になりそうですが、変なことをやって、バグが紛れ込んだりして、大変なことになりそうな感じも。
マルチスレッドのデバッグって、やりたくないなぁ[E:coldsweats01]