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

ソフトウェア開発

前回の続きです。

前回のおさらい

Firefox NSSのWindows上でのnss/build.shを使ってのBuildですが、下記のような問題が残っていました。

  1. nsprのinstallでエラーになる
  2. 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をかけるためには以下のようなファイルの修正が必要であることがわかりました。

  1. NSSのBuild関係のファイルの修正 (build.sh, msvc.sh)
  2. gypのscriptの修正(win_tool.py)
  3. 一部のNSPRのsource fileのencodeをBOM付UTF-8に変更
  4. 一部のNSPRのTestのソースコードを変更
  5. 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 

コメント

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