Firefox NSSをWindows上でBuildする(2)
前回の続きです。
前回のおさらい
Firefox NSSのWindows上でのnss/build.shを使ってのBuildですが、下記のような問題が残っていました。
- nsprのinstallでエラーになる
- nssのbuildでshlibsignがエラーになる
nspr installでのエラー
NSPRのInstallの部分で下記のエラーが出ました。
$ nss/build.sh -j 3 --disable-tests --nspr --nspr-only NSPR [1/5] configure ... ... NSPR [2/5] make ... ... NSPR [3/5] NOT building tests NSPR [4/5] NOT running tests NSPR [5/5] install ... ... make[3]: ディレクトリ `D:/Project/nss-3.87/nspr/Debug/pr/include/md' に入ります nsinstall -D /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_aix32.cfg ../../../../pr/include/md/_aix64.cfg ../../../../pr/include/md/_bsdi.cfg ../../../../pr/include/md/_darwin.cfg ../../../../pr/include/md/_freebsd.cfg ../../../../pr/include/md/_hpux32.cfg ../../../../pr/include/md/_hpux64.cfg ../../../../pr/include/md/_linux.cfg ../../../../pr/include/md/_netbsd.cfg ../../../../pr/include/md/_nto.cfg ../../../../pr/include/md/_openbsd.cfg ../../../../pr/include/md/_os2.cfg ../../../../pr/include/md/_qnx.cfg ../../../../pr/include/md/_riscos.cfg ../../../../pr/include/md/_scoos.cfg ../../../../pr/include/md/_solaris.cfg ../../../../pr/include/md/_unixware.cfg ../../../../pr/include/md/_unixware7.cfg ../../../../pr/include/md/_win95.cfg ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr mv -f /d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/prcpucfg.h mv: cannot stat '/d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg': No such file or directory
どうやら/d/Project/nss-3.87/dist/DebugというDirectoryができておらず、代わりに/d/d/Project/nss-3.87/dist/DebugというDirectoryが作成されて、そちらにInstallがされているようです。
$ ls dist build_args latest $ ls /d/d/Project/nss-3.87/dist/ Debug/
再度Makeをかけると確かにMakeは通るのですがやはりDebugはdist以下には作られていませんでした。つまり根本的には何も解決していなかったわけです。
エラーが出たpr/include/md/Makefileを見てみるとtargetを指定しない場合にはexportが実行されていたようです。
MOD_DEPTH = ../../.. topsrcdir = ../../../.. srcdir = ../../../../pr/include/md VPATH = ../../../../pr/include/md include $(MOD_DEPTH)/config/autoconf.mk # The .cfg files need to be exported and installed to support # cross-compilation. CONFIGS = $(wildcard $(srcdir)/*.cfg) include $(topsrcdir)/config/rules.mk export:: $(MDCPUCFG_H) $(INSTALL) -m 444 $(CONFIGS) $(dist_includedir)/md $(INSTALL) -m 444 $(srcdir)/$(MDCPUCFG_H) $(dist_includedir) mv -f $(dist_includedir)/$(MDCPUCFG_H) $(dist_includedir)/prcpucfg.h install:: $(NSINSTALL) -D $(DESTDIR)$(includedir)/md $(NSINSTALL) -t -m 644 $(CONFIGS) $(DESTDIR)$(includedir)/md $(NSINSTALL) -t -m 644 $(srcdir)/$(MDCPUCFG_H) $(DESTDIR)$(includedir) mv -f $(DESTDIR)$(includedir)/$(MDCPUCFG_H) $(DESTDIR)$(includedir)/prcpucfg.h
あらためてmake -C nspr/Debug installを実行したところエラーになりました。(当たり前)
make[3]: ディレクトリ `D:/Project/nss-3.87/nspr/Debug/pr/include/md' に入ります nsinstall -D /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_aix32.cfg ../../../../pr/include/md/_aix64.cfg ../../../../pr/include/md/_bsdi.cfg ../../../../pr/include/md/_darwin.cfg ../../../../pr/include/md/_freebsd.cfg ../../../../pr/include/md/_hpux32.cfg ../../../../pr/include/md/_hpux64.cfg ../../../../pr/include/md/_linux.cfg ../../../../pr/include/md/_netbsd.cfg ../../../../pr/include/md/_nto.cfg ../../../../pr/include/md/_openbsd.cfg ../../../../pr/include/md/_os2.cfg ../../../../pr/include/md/_qnx.cfg ../../../../pr/include/md/_riscos.cfg ../../../../pr/include/md/_scoos.cfg ../../../../pr/include/md/_solaris.cfg ../../../../pr/include/md/_unixware.cfg ../../../../pr/include/md/_unixware7.cfg ../../../../pr/include/md/_win95.cfg ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr mv -f /d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/prcpucfg.h mv: cannot stat '/d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg': No such file or directory
とりあえずマニュアルで各コマンドを実行してみたら、全部ちゃんと動いてdist/Debug以下にもファイルがInstallされていました。
$ cd D:/Project/nss-3.87/nspr/Debug/pr/include/md $ nsinstall -t -m 644 ../../../../pr/include/md/_aix32.cfg ../../../../pr/include/md/_aix64.cfg ../../../../pr/include/md/_bsdi.cfg ../../../../pr/include/md/_darwin.cfg ../../../../pr/include/md/_freebsd.cfg ../../../../pr/include/md/_hpux32.cfg ../../../../pr/include/md/_hpux64.cfg ../../../../pr/include/md/_linux.cfg ../../../../pr/include/md/_netbsd.cfg ../../../../pr/include/md/_nto.cfg ../../../../pr/include/md/_openbsd.cfg ../../../../pr/include/md/_os2.cfg ../../../../pr/include/md/_qnx.cfg ../../../../pr/include/md/_riscos.cfg ../../../../pr/include/md/_scoos.cfg ../../../../pr/include/md/_solaris.cfg ../../../../pr/include/md/_unixware.cfg ../../../../pr/include/md/_unixware7.cfg ../../../../pr/include/md/_win95.cfg ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/md $ nsinstall -t -m 644 ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr $ mv -f /d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/prcpucfg.h $ ls /d/Project/nss-3.87/dist/Debug/include/nspr/ md/ prcpucfg.h
ここで手詰まりになってしまいました。。。ので荒業に出ました。下記のようなSymblic Linkをはりました。。
$ ln -sf /d/d/Project/nss-3.87/dist/Debug/ /d/Project//nss-3.87/dist/
再度BuildをかけたところNSPRは通りました。
$ make -C nspr/Debug install make: ディレクトリ `D:/Project/nss-3.87/nspr/Debug' に入ります ... D:/GnuWin32/bin/make -C md install make[3]: ディレクトリ `D:/Project/nss-3.87/nspr/Debug/pr/include/md' に入ります nsinstall -D /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_aix32.cfg ../../../../pr/include/md/_aix64.cfg ../../../../pr/include/md/_bsdi.cfg ../../../../pr/include/md/_darwin.cfg ../../../../pr/include/md/_freebsd.cfg ../../../../pr/include/md/_hpux32.cfg ../../../../pr/include/md/_hpux64.cfg ../../../../pr/include/md/_linux.cfg ../../../../pr/include/md/_netbsd.cfg ../../../../pr/include/md/_nto.cfg ../../../../pr/include/md/_openbsd.cfg ../../../../pr/include/md/_os2.cfg ../../../../pr/include/md/_qnx.cfg ../../../../pr/include/md/_riscos.cfg ../../../../pr/include/md/_scoos.cfg ../../../../pr/include/md/_solaris.cfg ../../../../pr/include/md/_unixware.cfg ../../../../pr/include/md/_unixware7.cfg ../../../../pr/include/md/_win95.cfg ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/md nsinstall -t -m 644 ../../../../pr/include/md/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr mv -f /d/Project/nss-3.87/dist/Debug/include/nspr/_winnt.cfg /d/Project/nss-3.87/dist/Debug/include/nspr/prcpucfg.h make[3]: ディレクトリ `D:/Project/nss-3.87/nspr/Debug/pr/include/md' から出ます ... make: ディレクトリ `D:/Project/nss-3.87/nspr/Debug' から出ます
nssのBuildでshlibsignがエラー
引き続きnssの方のBuildをしたのですがなんと最後まで通ってしまいました!前回出たエラーが出ませんでした。NSPRのBuildが不完全だったのが原因だったのかもしれません。
$ nss/build.sh -v -j 3 -g --with-nspr=/d/Project/nss-3.87/nspr/Debug/dist/include/nspr:/d/Project/nss-3.87/nspr/Debug/dist/lib run_scanbuild gyp -f ninja --depth=/d/Project/nss-3.87/nss --generator-output=. -Dnspr_include_dir=/d/Project/nss-3.87/nspr/Debug/dist/include/nspr -Dnspr_lib_dir=/d/Project/nss-3.87/nspr/Debug/dist/lib -Dtarget_arch=x64 -Denable_sslkeylogfile=1 -Dnss_dist_dir=/d/Project/nss-3.87/dist -Dnss_dist_obj_dir=/d/Project/nss-3.87/dist/Debug /d/Project/nss-3.87/nss/nss.gyp ninja: Entering directory `D:/Project/nss-3.87/nss/out/Debug' [1/966] ninja -t msvc -e environment.x64 -- "D:\MicrosoftVisualStudio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x64\cl.exe" /nologo /showIncludes /FC @obj\lib\ssl\ssl.sslbloom.obj.rsp /c ..\..\lib\ssl\sslbloom.c /Foobj\lib\ssl\ssl.sslbloom.obj /Fdobj\lib\ssl\ssl.c.pdb ... [963/966] D:\mozilla-build\python3\python3.exe gyp-win-tool link-with-manifests environment.x64 True D:/Project/nss-3.87/dist/Debug/bin\bltest.exe "D:\mozilla-build\python3\python3.exe gyp-win-tool link-wrapper environment.x64 False link.exe /nologo /OUT:D:/Project/nss-3.87/dist/Debug/bin\bltest.exe @D:/Project/nss-3.87/dist/Debug/bin\bltest.exe.rsp" 1 mt.exe rc.exe "obj\cmd\bltest\bltest.bltest.exe.intermediate.manifest" obj\cmd\bltest\bltest.bltest.exe.generated.manifest [964/966] D:\mozilla-build\python3\python3.exe gyp-win-tool link-with-manifests environment.x64 True D:/Project/nss-3.87/dist/Debug/bin\atob.exe "D:\mozilla-build\python3\python3.exe gyp-win-tool link-wrapper environment.x64 False link.exe /nologo /OUT:D:/Project/nss-3.87/dist/Debug/bin\atob.exe @D:/Project/nss-3.87/dist/Debug/bin\atob.exe.rsp" 1 mt.exe rc.exe "obj\cmd\atob\atob.atob.exe.intermediate.manifest" obj\cmd\atob\atob.atob.exe.generated.manifest [965/966] D:\mozilla-build\python3\python3.exe gyp-win-tool link-with-manifests environment.x64 True D:/Project/nss-3.87/dist/Debug/bin\addbuiltin.exe "D:\mozilla-build\python3\python3.exe gyp-win-tool link-wrapper environment.x64 False link.exe /nologo /OUT:D:/Project/nss-3.87/dist/Debug/bin\addbuiltin.exe @D:/Project/nss-3.87/dist/Debug/bin\addbuiltin.exe.rsp" 1 mt.exe rc.exe "obj\cmd\addbuiltin\addbuiltin.addbuiltin.exe.intermediate.manifest" obj\cmd\addbuiltin\addbuiltin.addbuiltin.exe.generated.manifest [966/966] D:\mozilla-build\python3\python3.exe gyp-win-tool stamp obj\nss_tests.actions_depends.stamp
DLLを確認するとちゃんとできています!
$ find dist/ -name "*.dll" dist/Debug/lib/freebl3.dll dist/Debug/lib/libnspr4.dll dist/Debug/lib/libplc4.dll dist/Debug/lib/libplds4.dll dist/Debug/lib/nss3.dll dist/Debug/lib/nssckbi-testlib.dll dist/Debug/lib/nssckbi.dll dist/Debug/lib/nssutil3.dll dist/Debug/lib/pkcs11testmodule.dll dist/Debug/lib/smime3.dll dist/Debug/lib/softokn3.dll dist/Debug/lib/sqlite3.dll dist/Debug/lib/ssl3.dll
最後にあらためてnss/build.shをかけると最後まで通りました。
$ nss/build.sh ... [948/948] STAMP obj\nss_tests.actions_depends.stamp
念のため、Rebuildしてみましたが、何も変更していないのでrebuildはかかりませんでした。
$ nss/build.sh --nspr -g --rebuild ninja: Entering directory `D:/Project/nss-3.87/nss/out/Debug' ninja: no work to do. $ nss/build.sh ninja: Entering directory `D:/Project/nss-3.87/nss/out/Debug' ninja: no work to do.
今回のまとめ
Windows上でMozillaのNSS+NSPRのBuildをかけるためには以下のようなファイルの修正が必要であることがわかりました。
- NSSのBuild関係のファイルの修正 (build.sh, msvc.sh)
- gypのscriptの修正(win_tool.py)
- 一部のNSPRのsource fileのencodeをBOM付UTF-8に変更
- 一部のNSPRのTestのソースコードを変更
- NSPRのBuildにてnsintallが期待通りに動かないため手作業で修復する必要がある。
3に関しては、ソースの中に日本語、もしくはヨーロッパの特殊文字などが入っていることが原因であり、4に関してはソースの中にUTF-8でサポートされていない文字、日本語とヨーロッパの特殊文字が混在していることが原因で、簡単な解決策を見つけられませんでした。5に関しては本当に不可解な挙動で、これが原因でbuild.shで一発でBuildをかけることができませんでしたが、Makeの方はBuildが通りました。
今回の主目的であるNSSのDLLをWindows上でBuildするという目的においては達成できたのではないかと考えます。
1~4の修正をおこなった上で次のStepでBuildが可能です。開発環境に多少左右される部分はあるかと思いますが筆者の環境ではこれでBuildができました。
- Windows: Windows 11 Home 22H2 22621.1105
- Mozilla NSS+NSPR source : nss-3.87-with-nspr-4.35.tar.gz
- Visual Studio Code: 1.75.0
- bash : GNU bash, version 4.4.23(2)-release (x86_64-pc-msys)
- make : GNU Make 3.81
- Visual Studio : Visual Studio Community 2022 17.4.33213.308
- ninja : 1.11.1
- gyp: 0.1
Legacy Build(Make)
$ 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 (build.sh)
$ nss/build.sh -v --nspr --nspr-only $ ln -sf /d/d/Project/nss-3.87/dist/Debug/ /d/Project//nss-3.87/dist/ $ make -C nspr/Debug install $ nss/build.sh -g --with-nspr=${ROOTDIR}/nspr/Debug/dist/include/nspr:${ROOTDIR}/nspr/Debug/dist/lib