大致寫一下,免得哪天電腦掛了找不到東西 (不過 moztw 最近也掛得很頻繁就是了 ... 囧rz)。
基本的安裝 vc、安裝 mozilla build system 我就不寫了。
注意:因為 visual studio 2008 編出來的東西只支援 windows 2000 以上的系統,所以如果您還要 win98 的相容性,請使用
visual studio 2005 或更早的版本編譯。
如果您用 visual studio 2008 的目的是要編 pgo 最佳化,請仔細看完下面的東西。
修改 mozilla build system v1.3 的 Micro$oft SDK 檢查
因為 mozilla build system v1.3 並沒有預期到我們偷懶使用 VS2008 內帶的 micro$oft SDK,他會抓不到,所以我們要手動修改一下 guess-msvc.bat。在第 80 行左右會看到這個:
代碼:
SET SDK6KEY=HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0\WinSDKBuild
REM Just a base value to compare against
SET SDKVER=0
SET SDKMINORVER=0
REG QUERY "%SDK6KEY%" /v InstallationFolder >nul 2>nul
if "%SDKDIR%"=="" (
IF %ERRORLEVEL% EQU 0 (
FOR /F "tokens=2* usebackq delims= " %%A IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0\WinSDKBuild" /v InstallationFolder`) DO SET SDKDIR=%%B
SET SDKVER=6
)
)
改成
代碼:
SET SDK6KEY=HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A
REM Just a base value to compare against
SET SDKVER=0
SET SDKMINORVER=0
REG QUERY "%SDK6KEY%" /v InstallationFolder >nul 2>nul
if "%SDKDIR%"=="" (
IF %ERRORLEVEL% EQU 0 (
FOR /F "tokens=2* usebackq delims= " %%A IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A" /v InstallationFolder`) DO SET SDKDIR=%%B
SET SDKVER=6
)
)
修改 compiler & linker 的「版本檢查」因為 seamonkey 1.x 還沒開放 vs2008 可以編,所以必需要作此修改,如下:
- mozilla\configure,約 3019 行位置
- mozilla\configure.in,約 422 行位置
會看到如下的碼:
代碼:
if test "$_CC_MAJOR_VERSION" = "12"; then
_CC_SUITE=6
elif test "$_CC_MAJOR_VERSION" = "13"; then
_CC_SUITE=7
elif test "$_CC_MAJOR_VERSION" = "14"; then
_CC_SUITE=8
else
{ echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
fi
# Check linker version
_LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
_LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then
{ echo "configure: error: The linker major version, $_LD_FULL_VERSION, does not match the compiler suite version, $_CC_SUITE." 1>&2; exit 1; }
fi
改成
代碼:
if test "$_CC_MAJOR_VERSION" = "12"; then
_CC_SUITE=6
elif test "$_CC_MAJOR_VERSION" = "13"; then
_CC_SUITE=7
elif test "$_CC_MAJOR_VERSION" = "14"; then
_CC_SUITE=8
elif test "$_CC_MAJOR_VERSION" = "15"; then
_CC_SUITE=8
else
{ echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
fi
# Check linker version
_LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
_LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
#if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then
# { echo "configure: error: The linker major version, $_LD_FULL_VERSION, does not match the compiler suite version, $_CC_SUITE." 1>&2; exit 1; }
# fi
修改 WINVER 及 WIN32_WINNT 宣告如前述,visual studio 2008 已不支援 win98,所以這兩項宣告必需往上調整。請在下兩檔案中搜尋 winver 及 win32_winnt 兩項,將後面接的「0x400」都改成「0x500」。
- mozilla\configure
- mozilla\configure.in
修改 LINK 參數:MAPINFO:LINES因為 VS2008 的 link 已經不支援這個參數,所以必需要把他修掉,不然會不能編 (ps: fx3 應該無此問題)。在 mozilla\config\rules.mk 中約 199 行處會看到這個:
代碼:
ifdef MAPFILE
OS_LDFLAGS += -MAP:$(MAPFILE) -MAPINFO:LINES
#CFLAGS += -Fm$(MAPFILE)
#CXXFLAGS += -Fm$(MAPFILE)
endif
改成
代碼:
ifdef MAPFILE
OS_LDFLAGS += -MAP:$(MAPFILE) -MAPINFO:EXPORTS
#CFLAGS += -Fm$(MAPFILE)
#CXXFLAGS += -Fm$(MAPFILE)
endif
修改 mozilla\xpcom\base\nsStackFrameWin.cpp 以避免 C2664 錯誤- 在 326 行左右會看到這個:
代碼:
/*
* Not loaded, here's the magic.
* Go through all the modules.
*/
enumRes = _EnumerateLoadedModules(aProcess, callbackEspecial, (PVOID)&aAddr);
if (FALSE != enumRes)
改成代碼:
/*
* Not loaded, here's the magic.
* Go through all the modules.
*/
enumRes = _EnumerateLoadedModules(aProcess, (PENUMLOADED_MODULES_CALLBACK)callbackEspecial, (PVOID)&aAddr);
if (FALSE != enumRes)
- 在 380 行左右會看到這個:
代碼:
/*
* Not loaded, here's the magic.
* Go through all the modules.
*/
enumRes = _EnumerateLoadedModules64(aProcess, callbackEspecial64, (PVOID)&aAddr);
if (FALSE != enumRes)
改成:代碼:
/*
* Not loaded, here's the magic.
* Go through all the modules.
*/
enumRes = _EnumerateLoadedModules64(aProcess, (PENUMLOADED_MODULES_CALLBACK64)callbackEspecial64, (PVOID)&aAddr);
if (FALSE != enumRes)
修改 mozilla\netwerk\system\win32\nsNotifyAddrListener.cpp 以避免 C2365 錯誤代碼:
Index: netwerk/system/win32/nsNotifyAddrListener.cpp
===================================================================
RCS file: /cvsroot/mozilla/netwerk/system/win32/nsNotifyAddrListener.cpp,v
retrieving revision 1.4.2.3
diff -u -r1.4.2.3 nsNotifyAddrListener.cpp
--- netwerk/system/win32/nsNotifyAddrListener.cpp 8 May 2006 05:21:32 -0000 1.4.2.3
+++ netwerk/system/win32/nsNotifyAddrListener.cpp 7 Feb 2008 22:38:12 -0000
@@ -67,6 +67,7 @@
#define IF_TYPE_SOFTWARE_LOOPBACK 24
+#ifndef _NLDEF_
typedef enum {
IpPrefixOriginOther = 0,
IpPrefixOriginManual,
@@ -91,6 +92,12 @@
IpDadStateDeprecated,
IpDadStatePreferred
} IP_DAD_STATE;
+ #else
+typedef NL_PREFIX_ORIGIN IP_PREFIX_ORIGIN;
+typedef NL_SUFFIX_ORIGIN IP_SUFFIX_ORIGIN;
+typedef NL_DAD_STATE IP_DAD_STATE;
+#endif
+
typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
union {
@@ -148,6 +155,7 @@
SOCKET_ADDRESS Address;
} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS;
+#ifndef _IFDEF_
typedef enum {
IfOperStatusUp = 1,
IfOperStatusDown,
@@ -157,6 +165,7 @@
IfOperStatusNotPresent,
IfOperStatusLowerLayerDown
} IF_OPER_STATUS;
+#endif
typedef struct _IP_ADAPTER_ADDRESSES {
union {
將 winable.h 改成 winuser.h:自 2005/7 之後的 windows sdk 已經不再包含 winable.h,理由是跟 winuser.h 完全重覆。
- mozilla\widget\src\windows\nsWindow.cpp,104 行左右:
代碼:
//#include <winuser.h>
#include <zmouse.h>
//#include "sysmets.h"
#include "nsGfxCIID.h"
#include "resource.h"
#include <commctrl.h>
#include "prtime.h"
#include "nsIRenderingContextWin.h"
#include "nsIImage.h"
#ifdef ACCESSIBILITY
#include "OLEIDL.H"
#include "winable.h"
改成:代碼:
#include <zmouse.h>
//#include "sysmets.h"
#include "nsGfxCIID.h"
#include "resource.h"
#include <commctrl.h>
#include "prtime.h"
#include "nsIRenderingContextWin.h"
#include "nsIImage.h"
#ifdef ACCESSIBILITY
#include "OLEIDL.H"
#include <winuser.h>
//#include "winable.h"
移除 rpcndr.lib 參照因 Visual Studio 2008 已經沒有 rpcndr.lib,故我們要把參照到這個 lib 的檔修改一下。
mozilla/accessible/public/msaa/Makefile.in
代碼:
--- Makefile.in Sat Dec 27 13:40:14 2008
+++ Makefile.in Sat Dec 27 13:24:38 2008
@@ -86,7 +86,6 @@
OS_LIBS = \
kernel32.lib \
- rpcndr.lib \
rpcns4.lib \
rpcrt4.lib \
oleaut32.lib \
指定 PGC 檔的存放位置在呼叫 vcvars32.bat 後,請手動加一行:
set VCPROFILE_PATH=path
optimize 參數中加入 /GL 指令.mozconfig 中的 optimize 參數要加入 /GL。
加入 mmoy manifest patch在您下完 source code 後,請修改幾個檔:
- mozilla\xpcom\typelib\xpt\tools\Makefile.in,約 48 行左右的位置
代碼:
SIMPLE_PROGRAMS = xpt_dump$(BIN_SUFFIX) xpt_link$(BIN_SUFFIX)
改成代碼:
SIMPLE_PROGRAMS = xpt_dump$(BIN_SUFFIX) xpt_link$(BIN_SUFFIX) xpt_dump$(BIN_SUFFIX).manifest xpt_link$(BIN_SUFFIX).manifest
- mozilla\xpcom\typelib\xpidl\Makefile.in, 約 49 行左右的位置
代碼:
PROGRAM = xpidl$(BIN_SUFFIX)
改成代碼:
PROGRAM = xpidl$(BIN_SUFFIX) xpidl$(BIN_SUFFIX).manifest
參考自這個。這可以解決編到一半 xpidl 掛掉的問題。
- mozilla\xpfe\bootstrap\Makefile.in,約 118 行左右的位置
代碼:
ifeq ($(USE_SHORT_LIBNAME),1)
PROGRAM = $(MOZ_APP_NAME)$(BIN_SUFFIX)
else
PROGRAM = $(MOZ_APP_NAME)-bin$(BIN_SUFFIX)
endif
改成代碼:
ifeq ($(USE_SHORT_LIBNAME),1)
PROGRAM = $(MOZ_APP_NAME)$(BIN_SUFFIX) $(MOZ_APP_NAME)$(BIN_SUFFIX).manifest
else
PROGRAM = $(MOZ_APP_NAME)-bin$(BIN_SUFFIX) $(MOZ_APP_NAME)-bin$(BIN_SUFFIX).manifest
endif
這可以在編完後不用再自己 copy seamonkey.exe.manifest
為 mozilla\security\nss 下的檔案加上 CL 的最佳化命令不知為何那個目錄下的所有檔案,都不鳥 .mozconfig 中的 optimize 指定參數,所以只好手動加嘍。
開啟 mozilla\security\coreconf\win32.mk,在大約 115 行的位置會看到這個
代碼:
else # !NS_USE_GCC
ifdef BUILD_OPT
OS_CFLAGS += -MD
OPTIMIZER += -O
DEFINES += -UDEBUG -U_DEBUG -DNDEBUG
DLLFLAGS += -OUT:"$@"
手動把 .mozconfig 中 optimize 的參數加到「optimizer += -o」的後面吧,記得要存檔。
4/27 編輯:1.1.9 目錄名已經變成 coreconf,原先是 coreconfig。
統一 mozilla\security\nss\lib\freebl 內的最佳化參數freebl 下的所有原始碼都會強制以 -Ox 編譯,這有時(?)會造成問題。
開啟 mozilla\security\nss\lib\freebl\Makefile,在大約 90 行的位置會看到這個:
代碼:
else
MPI_SRCS += mpi_x86_asm.c
DEFINES += -DMP_ASSEMBLY_MULTIPLY -DMP_ASSEMBLY_SQUARE
DEFINES += -DMP_ASSEMBLY_DIV_2DX1D -DMP_USE_UINT_DIGIT -DMP_NO_MP_WORD
ifdef BUILD_OPT
OPTIMIZER += -Ox # maximum optimization for freebl
endif
endif
endif
在 「Optimizer += -Ox」前面加「#」把它註解掉,記得要存檔。
此項可改可不改,看個人。
取 log file,為 pgx 作準備
原先編譯的指令是:
make -f client.mk ooxx
建議使用 pipe 的方式改成:
make -f client.mk ooxx 2>&1 | tee logfilename
這樣的好處是,您可以在畫面上看到執行的過程,同時也會產生一個一模一樣的完整 logfile。