Firefox NSSをWindows上でBuildする(3)

ソフトウェア開発

前回の続きです。

Firefox NSSのWindows上でとりあえず力づくでBuildはできるようになりましたが、ソースファイルを手で修正しなくていけないなどメインテナンス性がよくありません。従って、なんとかこれらを簡単にできるようにScript化を考えていきたいと思います。

下記に現在の手作業による手段と自動化に向けた恒久対策をまとめてみます。

番号修正ファイル修正点現在の手段恒久対策
1nss/build.shWindowsでのuname -sの出力フォーマットの修正手で修正patchを用意する*1
2nss/coreconf/msvc.shWindowsのMSVCコマンドのPATHを最初に追加する手で修正patchを用意する*1
3nss/coreconf/WIN32.mk-WX optionを削除するscriptで対処する
4gyp/pylib/gyp/win_tool.pyencoding=UTF8を追加手で修正patchを用意する*1
5nss/lib/certhigh/certvfy.c
nss/lib/freebl/ecl/ecp_secp384r1.c
nss/lib/freebl/ecl/ecp_secp521r1.c
nss/cmd/bltest/blapitest.c
nss/gtests/pk11_gtest/pk11_key_unittest.cc
BOM付のUTF-8に修正手で修正3の対策により不要
4nss/gtests/certdb_gtest/alg1485_unittest.cc
nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp
nss/gtests/pk11_gtest/pk11_module_unittest.cc
UTF-8に含まれない文字をコメントアウトもしくは含まれる文字に修正
BOM付のUTF-8に修正
手で修正
scriptでBOMをつける。
alg1485_unittest.ccについては3の対策により対応不要
5nspr/pr/include/mk/Makefile
(nsinstallが期待しないDirectoryにInstallする問題)
対応策なしInstall先のSymbolic Linkを貼るscriptにてNSPRのBuild後がFailしたあとにSymbolic Linkでを貼る。
NSPRのRebuild後には実体をコピーしておく必要があく。
(そのあとのNSSのBuildがエラーになってしまうため)
*1:これらのファイルが将来Updateされた際にはPatchを作り直す必要がある

Patch 作成

Patchの作成手順です。(例:build.sh)

  1. 修正前に build.sh を build.sh.orgという名前で退避
  2. build.shを修正
  3. Patchファイルを作成
$ diff build.sh.org build.sh > build.sh.patch

Patchをあてるときには以下のコマンドを実行します。

$ patch build.sh < build.sh.patch

Compiler Warning Levelの修正

MSVCのCompiler Optionはnss/coreconf/WIN32.mkに記述されています。

WARNING_CFLAGS = -W3 -nologo -D_CRT_SECURE_NO_WARNINGS D_CRT_NONSTDC_NO_WARNINGS               

WARNING_CFLAGS += -WX

-WXはもっとも厳しくWARNINGをERRORとして処理してしまうため、このOPTIONを下記のようにはずします。(最終的なWarning Levelは-W3)

sed -i '/-WX/s/-WX//' nss/coreconf/WIN32.mk    

ソースファイルにBOMをつける

下記のようにすればUTF-8のファイルにBOMをつけることができます(例:pkcs11testmodule.cpp)

当然ですが、元のファイルがUTF-8でエンコードされていることが前提です。

$ mv pkcs11testmodule.cpp pkcs11testmodule.cpp.org
$ echo -ne '\xEF\xBB\xBF' > pkcs11testmodule.cpp
$ cat pkcs11testmodule.cpp.org >> pkcs11testmodule.cpp

今回のまとめ

Build Stepとしては以下のようになります。Buildするためのステップがだいぶ簡単になってきました。

Legacy Build

$ patch nss/coreconf/msvc.sh < msvc.sh.patch
$ sed -i '/-WX/s/-WX//' nss/coreconf/WIN32.mk 

$ target_arch=$(${python:-python} nss/coreconf/detect_host_arch.py)
$ source nss/coreconf/msvc.sh
$ make -C nss nss_build_all USE_64=1

New Build

% ROOTDIR=/d/Project//nss-3.87

$ cd $ROOTDIR

$ patch nss/build.sh < build.sh.patch
$ patch nss/coreconf/msvc.sh < msvc.sh.patch
$ patch $GYPHOME/gyp/pylib/gyp/win_tool.py < win_tool.py.patch
$ sed -i '/-WX/s/-WX//' nss/coreconf/WIN32.mk 

$ mv nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp.org
$ echo -ne '\xEF\xBB\xBF' >nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp
$ cat nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp.org >> nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp

$ mv nss/gtests/pk11_gtest/pk11_module_unittest.cc nss/gtests/pk11_gtest/pk11_module_unittest.cc.org
$ echo -ne '\xEF\xBB\xBF' > nss/gtests/pk11_gtest/pk11_module_unittest.cc
$ cat nss/gtests/pk11_gtest/pk11_module_unittest.cc.org >> nss/gtests/pk11_gtest/pk11_module_unittest.cc

$ nss/build.sh -v --nspr --nspr-only
$ ln -s /d/$ROOTDIR/dist/Debug $ROOTDIR/dist
         
$ make -C nspr/Debug install
$ mv -f /d/$ROOTDIR/dist/Debug $ROOTDIR/dist

$ nss/build.sh -g --with-nspr=$ROOTDIR/nspr/Debug/dist/include/nspr:$ROOTDIR/nspr/Debug/dist/lib 

さすがにこれを全部コマンドで打つのは間違いもありそうですし、現実的ではないので次回はこれらをBuild用Scriptとして作成し、GITに登録してみます。

コメント

タイトルとURLをコピーしました