Firefox NSSをWindows上でBuildする(3)
この記事はアフィリエイト広告を利用しています
前回の続きです。
Firefox NSSのWindows上でとりあえず力づくでBuildはできるようになりましたが、ソースファイルを手で修正しなくていけないなどメインテナンス性がよくありません。従って、なんとかこれらを簡単にできるようにScript化を考えていきたいと思います。
下記に現在の手作業による手段と自動化に向けた恒久対策をまとめてみます。
番号 | 修正ファイル | 修正点 | 現在の手段 | 恒久対策 |
---|---|---|---|---|
1 | nss/build.sh | Windowsでのuname -sの出力フォーマットの修正 | 手で修正 | patchを用意する*1 |
2 | nss/coreconf/msvc.sh | WindowsのMSVCコマンドのPATHを最初に追加する | 手で修正 | patchを用意する*1 |
3 | nss/coreconf/WIN32.mk | -WX optionを削除する | – | scriptで対処する |
4 | gyp/pylib/gyp/win_tool.py | encoding=UTF8を追加 | 手で修正 | patchを用意する*1 |
5 | 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 | 3の対策により不要 | ||
4 | nss/gtests/pkcs11testmodule/pkcs11testmodule.cpp nss/gtests/pk11_gtest/pk11_module_unittest.cc | BOM付のUTF-8に修正 | 手で修正 | scriptでBOMをつける。 alg1485_unittest.ccについては3の対策により対応不要 |
5 | nspr/pr/include/mk/Makefile (nsinstallが期待しないDirectoryにInstallする問題) | 対応策なし | Install先のSymbolic Linkを貼る | scriptにてNSPRのBuild後がFailしたあとにSymbolic Linkでを貼る。 NSPRのRebuild後には実体をコピーしておく必要があく。 (そのあとのNSSのBuildがエラーになってしまうため) |
Patch 作成
Patchの作成手順です。(例:build.sh)
- 修正前に build.sh を build.sh.orgという名前で退避
- build.shを修正
- 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に登録してみます。