:::
主內容區域
開發者討論區
在暈倒下編譯 LibreOffice ... (未完)
參考此 頁 (英文的) ,以下只寫該頁沒提到的。
建構環境 (第一步):
建構環境 (第一步):
- 官方說法只支援 2008。我已經有裝 Visual Studio 2010 所以懶得裝。
- Apache Ant:至此下 載。安裝法:解開到一個獨立目錄即可。
- Java SDK 1.6x:至 此下載。直接執行安裝即可。
- Junit:至此下 載 jar 包。完全不用安裝,也不用解開。
Cygwin 設定:因為我先前是專門編 Seamonkey = Firefox 的,所以用到的是 msys,我就照這樣修改過來。
- cygwin.bat 癈棄不用,改用 mozilla build system 的 guest-msvc.bat + 修改過的 start-msvc10.bat。使用 start-msvc10.bat 啟動進入 cygwin。
start-msvc10.bat - 只有改紅字段落
@echo off
SET MOZ_MSVCVERSION=10
SET MOZBUILDDIR=%~dp0
SET MOZILLABUILD=%MOZBUILDDIR%
echo "cygwin directory: %MOZBUILDDIR%"
REM Get MSVC paths
call "%MOZBUILDDIR%guess-msvc.bat"
REM Use the "new" moztools-static 這邊這樣改是因為我的 mozilla build system 放在這
set MOZ_TOOLS=d:\moz-build\moztools
rem append to PATH
SET PATH=%PATH%;%MOZBUILDDIR%\bin;%MOZ_TOOLS%\bin
if "%VC10DIR%"=="" (
if "%VC10EXPRESSDIR%"=="" (
ECHO "Microsoft Visual C++ version 10 (2010) was not found. Exiting."
pause
EXIT /B 1
)
if "%SDKDIR%"=="" (
ECHO "Microsoft Platform SDK was not found. Exiting."
pause
EXIT /B 1
)
rem Prepend MSVC paths
call "%VC10EXPRESSDIR%\Bin\vcvars32.bat"
rem Don't set SDK paths in this block, because blocks are early-evaluated.
rem Fix problem with VC++Express Edition
if "%SDKVER%" GEQ "6" (
rem SDK Ver.6.0 (Windows Vista SDK) and newer
rem do not contain ATL header files.
rem We need to use the Platform SDK's ATL header files.
SET USEPSDKATL=1
)
rem SDK ver.6.0 does not contain OleAcc.idl
rem We need to use the Platform SDK's OleAcc.idl
if "%SDKVER%" == "6" (
if "%SDKMINORVER%" == "0" (
SET USEPSDKIDL=1
)
)
) else (
rem Prepend MSVC paths
rem The Win7 SDK (or newer) should automatically integrate itself into vcvars32.bat
ECHO Using VC 2010 built-in SDK
call "%VC10DIR%\Bin\vcvars32.bat"
)
if "%VC10DIR%"=="" (
rem Prepend SDK paths - Don't use the SDK SetEnv.cmd because it pulls in
rem random VC paths which we don't want.
rem Add the atlthunk compat library to the end of our LIB
set "PATH=%SDKDIR%\bin;%PATH%"
set "LIB=%SDKDIR%\lib;%LIB%;%MOZBUILDDIR%atlthunk_compat"
if "%USEPSDKATL%"=="1" (
if "%USEPSDKIDL%"=="1" (
set "INCLUDE=%SDKDIR%\include;%PSDKDIR%\include\atl;%PSDKDIR%\include;%INCLUDE%"
) else (
set "INCLUDE=%SDKDIR%\include;%PSDKDIR%\include\atl;%INCLUDE%"
)
) else (
if "%USEPSDKIDL%"=="1" (
set "INCLUDE=%SDKDIR%\include;%SDKDIR%\include\atl;%PSDKDIR%\include;%INCLUDE%"
) else (
set "INCLUDE=%SDKDIR%\include;%SDKDIR%\include\atl;%INCLUDE%"
)
)
)
rem Apache ANT 放的地方
SET ANT_HOME=d:\cygwin\ant
rem Ant 要帶 path
SET PATH=%PATH%;%ANT_HOME%\bin
rem 設定 jdk 位置
SET JAVA_HOME=c:\Program Files (x86)\java\jdk1.6.0_31
rem bash login d:\cygwin 是我的 cygwin 安裝位置
d:
cd \cygwin\bin
bash --login -i
cd \cygwin
- cygwin 會把所有磁碟掛到 /cygdrive 下面,我使用 ln -s 把所有磁碟都連結到 / 下,設定時可以少打幾個字。
- 下載 LibreOffice 團隊修改過的 make。 據說速度會比 cygwin 提供的快。下載後放到 cygwin 的 opt/lo/bin 目錄中,記得再去 chmod +x 加執行權限。
取得 LibreOffice 源碼:兩種方式可以作到,但都很花時間,因為要下載近 1G 的東西。
- 下載 libo_git_from_tar.sh,然後在 cygwin 下執行它。這會抓取數個 tar 源碼包,之後會自己解開到 libo 目錄中。
- 在 cygwin 下執行「git clone git://anongit.freedesktop.org/libreoffice/core libo」。一樣會把源碼抓到 libo 目錄中。
- cd 到 libo 目錄,首先修改 oowintool 檔案,這個檔是補足剩下的一堆東西的列表,不過有一個項目叫作 Microsoft_VC90_CRT_x86.msm 的檔我始終找不到 (一般的都是分開的三個檔 msvcp90.dll、msvcm90.dll、msvcr90.dll,他這個要求「三合一」的我還真的沒有看過 ...)
diff -ruNa libo/oowintool libox/oowintool
--- libo/oowintool 2012-01-12 01:14:36 +0800
+++ libox/oowintool 2012-01-18 13:03:07 +0800
@@ -280,6 +280,6 @@
my $msm_path = (cygpath $common_files_path . "\\Merge Modules", 'w', $output_format);
foreach $fname ("Microsoft_VC90_CRT_x86$postfix.msm", "policy_9_0_Microsoft_VC90_CRT_x86$postfix.msm") {
print STDERR "Copying $msm_path/$fname to $dest\n";
- copy ("$msm_path/$fname", $dest) || die "copy failed: $!";
+# copy ("$msm_path/$fname", $dest) || die "copy failed: $!";
}
}
- 在 libo 目錄內執行「make fetch」開始下載補足一堆檔案 (約 700MB)
- LibreOffice 會用到 dmake,請在 libo 目錄中執行:
cd dmake
./configure
make
make install
ps:本步驟只需要執行一次,以後就不用再執行了。 - 建立 myautogen.sh,用來跑 autogen.sh,存檔切記使用 LF 換行格式。內容主要是加上一堆編譯用設定參數。
autogen.sh \
--verbose \
--enable-verbose \
--disable-odk \
--disable-debug \
--disable-build-mozilla \
--without-junit \
--with-num-cpus=3 \
--with-max-jobs=4 \
--with-mozilla-build="/d/moz-build" \
--with-vendor="s793016" \
--with-build-version="Built by s793016" \
--with-directx-home="/d/VStudio/DirectXSDK" \
--with-cl-home="/d/VStudio/2010/VC" \
--with-mspdb-path="/d/VStudio/2010/Common7/IDE" \
--with-csc-path="/c/WINDOWS/Microsoft.NET/Framework/v3.5" \
--with-midl-path="/c/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin" \
--with-asm-home="/d/VStudio/2010/VC/Bin" \
--with-windows-sdk-home="/c/Program Files (x86)/Microsoft SDKs/Windows/v7.0A" \
--with-ant-home="/ant" \
--with-jdk-home="/c/Program Files (x86)/java/jdk1.6.0_31" \
--with-java-target-version=1.6 \
2>&1 | tee /e/lo/log-autogen
- 句尾的「\」是代表「此行未完」的連接符號
- 最後一行是用來留畫面輸出 log 檔,以便有問題的話事後再回去看。
- --with-num-cpus 設定使用幾個 cpu 核心數,我用的 4 核設定 3 核給他。這一項省略不設定的話就是「全部核心都用」。
- --with-max-jobs 設定同時最多放幾個工作,這邊設定 4。一般似乎是建議設定 開放的核心數 x2
- 在 libo 目錄執行 make 開始編譯。如果您需要加設參數給 compiler,用這方式:
當然,一樣要記得 i/o 轉向留 log 檔,這樣不幸編掛時才能找錯誤。CFLAGS="-O2" \
CXXFLAGS="-O2" \
make \
2>&1 | tee /e/lo/log-make
已知問題:
- 目前好像沒有比較有效的手段可以保持源碼的乾淨,這不像 firefox 可以指定 obj 目錄然後編掛了就只要把 obj 砍掉重來這麼簡單。如果直接 make clean、make distclean 之後再 make 旳話,錯誤的地方會不一樣 ... 也就是說,源碼被 obj 檔污染了,而且 make 移不乾淨,得重下源碼 ... orz
- 參數的設定非常不便。您可以看到目前的作法預設就是,全部打在 autogen.sh 的後面變成長長一串。以 mozilla 來說,人家是全部集中在一個 .mozconfig 檔中,只要修改他就可以了。
- 自從 2/28連假重感冒後就什麼都不想弄了。目前進度還沒編成功過,之前會掛在一個固定的地方。
ps:本文可能會再修改,如果心情好 或 有進展的話。

