Godot GDEXTENSION の WEB エクスポート(その4)

Godot

emscripten 向け C++ ライブラリのビルド

本稿は GDEXTENSION の WEB エクスポートを試した際のメモの共有を意図した一連の記事の4番目。1番目から順に読まれていくことを想定している。

前稿では、GDEXTENSION の C++ ソースコードを Windows プラットフォーム及び WEB(HTML5)向けにビルドし、それぞれ動作することを確認した。

本稿では、emscripten 向けに C++ ライブラリを準備するべく、コンピュータビジョンで多用される C++ ライブラリをスタティックリンクライブラリとしてビルドしてゆく。

ビルドを通しただけで実際に使えるかは検証していない。

対象としている Godot エンジンのバージョンは 4.2.1。 emscripten のバージョンは 3.1.39。

本稿は GDEXTENSION 開発で使う C++ ライブラリを用意することを意図しているが、本稿にはGDEXTENSION 向けの特別な説明はない。

C++ ライブラリのビルド

emscripten 環境設定と emsdk.bat

emscripten の環境設定は emsdk_env.bat を実行する必要がある。本稿ではコマンドプロンプトを起動した際のディレクトリに以下のファイルを設置し、コマンドプロンプトを開くたびに実行する前提とする。

%HOMEPATH%\emsdk.bat

SET PATH=%PATH%;"C:\Program Files\7-Zip"
SET PATH=%PATH%;C:\dev\tools\pkg-config\bin
SET PATH=C:\dev\tools\Python\Python312\Scripts;C:\dev\tools\Python\Python312;%PATH%
SET PATH=C:\dev\tools\mingw64\bin;%PATH%
SET PATH=C:\dev\godot-4.2.1-stable\bin;%PATH%
SET PATH=%PATH%;C:\dev\tools\emsdk\local

set PKG_CONFIG_EXE_DIR=C:\dev\tools\pkg-config\bin

call c:\dev\tools\emsdk\emsdk_env.bat
set PKG_CONFIG_PATH=""

cd c:\dev

emscripten 向け cmake-gui に関して

多くの既存 C++ ライブラリは Cmake によるビルドを前提にしていて、emscripten 向けビルドでも同様に Cmake を用いることができる。ただし、emscripten は wasm 向けコンパイラで、クロスコンパイルとなるから環設定が複雑になる。emscripten では Cmake の環境設定の補助を行うべく、emcmake や emconfigure を用意してくれている。特に cmake-gui を用いる場合、 emconfigure を用いると GUIでコンフィグの可視化ができるので、ビルドの見通しが付きやすい。

emscripten で cmake-gui により Makefile を生成するには以下のようにする。

CMakeLists.txt がカレントにある場合以下を実行する。

emconfigure cmake-gui .

通常通り cmake-gui が起動する。

ここで 「Generate」を押下すると以下のダイアログが開く。

ここで ”Specify toolchain file for cross-compiling” を選択し、「Next」 を押下する。

以下のダイアログが開く。

デフォルトで以下が選択されているのでそのまま「Finish」を押す。

C:/dev/tools/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake

これにより初回 Generate が実行される。後は通常のコンフィグ設定を行う。この状態で上の “Name/Value” 欄で Cmake の Config Key を編集できるようになる。右上にある “Grouped”と “Advanced” の二つのチェックを有効にすると、隠れた Key も表示されるとともに、機能グループに分かれて表示されるので見通しが良くなる。

ライブラリにもよるが、Generate はエラーで失敗するので、エラーの内容を確認しながらコンフィグ設定を行っていく。

emconfigure を付けて cmake-gui を起動した場合、起動したコマンドプロンプトシェルは掴まれたままになるので、必要ならば別窓でコマンドプロンプトを開き、作業を行えば良い。

emscripten を用いた WEB(HTML5)ターゲットへのビルド及びインストール

sdl2

vtk などが sdl2 に依存しているのでインストールしておく。以下の手順でインストールできるがバージョンは選べない。

c:\dev\tools\emsdk>embuilder build sdl2
embuilder:INFO: building sdl2
ports:INFO: retrieving port: sdl2 from https://github.com/libsdl-org/SDL/archive/release-2.24.2.zip
ports:INFO: unpacking port: sdl2
cache:INFO: generating port: sysroot\lib\wasm32-emscripten\libSDL2.a... (this will be cached in "C:\dev\tools\emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libSDL2.a" for subsequent builds)
system_libs:INFO: compiled 115 inputs
cache:INFO:  - ok
embuilder:INFO: ...success. Took (11.54s)

c:\dev\tools\emsdk>

boost 1.84.0

配布サイトは以下。

https://www.boost.org

boost の機能の多くは ヘッダーファイルをインクルードするだけで利用可能で、emscripten では “-s USE_BOOST_HEADERS=1” オプションを付与することで使用することができる。つまり、ビルドの必要なライブラリを使わないのならば、emscripten で boost を利用することは簡単といえる。

しかし、そのビルドの必要なライブラリを emscripten で使おうとすると非常に厄介。boost 1.81.0 はどうやってもインストールできなかった。試行錯誤の末、boost 1.84.0 では以下の手順でビルド及びインストールができた。

c:\dev>curl -L -O https://boostorg.jfrog.io/artifactory/main/release/1.84.0/source/boost_1_84_0.7z
c:\dev>7z x boost_1_84_0.7z
c:\dev>del boost_1_84_0.7z
c:\dev>cd boost_1_84_0
c:\dev\boost_1_84_0>.\bootstrap.bat
c:\dev\boost_1_84_0>mkdir build
c:\dev\boost_1_84_0>mkdir C:\dev\tools\emsdk\local\boost_1_84_0
c:\dev\boost_1_84_0>.\b2 toolset=emscripten ^
  link=static ^
  threading=multi ^
  host-os=windows ^
  target-os=linux ^
  architecture=x86 ^
  address-model=32 ^
  cflags="-fPIC -s SIDE_MODULE=1 -s USE_PTHREADS=1" ^
  cxxflags="-fPIC -s SIDE_MODULE=1 -s USE_PTHREADS=1" ^
  --build-dir=./build  ^
  --prefix=c:/dev/tools/emsdk/local/boost_1_84_0 ^
  install

これを実行すると、”c:/dev/tools/emsdk/local/boost_1_84_0/include” というディレクトリにヘッダファイル一式がインストールされるとともに、”c:/dev/tools/emsdk/local/boost_1_84_0/lib” というディレクトリに “*.bc” という suffix の多数のオブジェクトファイルが生成される。オブジェクトファイルはスタティックリンクライブラリとして使うにはアーカイブファイル “*.a” に変換する必要がある。変換には emar を用いるが、例えば以下のような Python3 スクリプトを作成・実行して一括変換すると簡便。

c:\dev\boost_1_84_0\emar_all.py

#!/usr/bin/env python3
from pathlib import Path
from subprocess import run

dir = 'C:/dev/tools/emsdk/local/boost_1_84_0/lib'
files = list(Path(dir).glob('**/*.bc'))
for i in files:
    com = f"emar q {i.with_suffix('.a')} {i}"
    print(com)
    ret = run(com, shell=True)
    print(ret)

この Python3 スクリプトは “C:/dev/tools/emsdk/local/boost_1_84_0/lib” ディレクトリ配下にある ”*.bc” ファイル全てに対して以下のコマンドを発行するもの。

emar q <dir_path>\<lib_name>.a <dir_path>\*.bc

スクリプト設置はどこでも良いが、c:\dev\boost_1_84_0\emar_all.py に設置した場合は以下のように実行する。

c:\dev\boost_1_84_0>python emar_all.py

scons から使用する際に備えて、 “C:\dev\tools\emsdk\local\boost_1_84_0\lib\pkgconfig” というディレクトリを作成し、以下のファイルを設置しておく。

C:\dev\tools\emsdk\local\boost_1_84_0\lib\pkgconfig\boost.pc

# Package Information for pkg-config
 
prefix=C:\dev\tools\emsdk\local\boost_1_84_0
libdir=${prefix}/lib
includedir=${prefix}/include/boost-1_84
Name: Boost
Description: Boost Release libraries
Version: 1.84.0
Libs: -L${libdir} -lboost_atomic-1-mt-x32-1_84 -lboost_container-1-mt-x32-1_84 -lboost_context-1-mt-x32-1_84 -lboost_contract-1-mt-x32-1_84 -lboost_coroutine-1-mt-x32-1_84 -lboost_date_time-1-mt-x32-1_84 -lboost_exception-1-mt-x32-1_84 -lboost_fiber-1-mt-x32-1_84 -lboost_filesystem-1-mt-x32-1_84 -lboost_graph-1-mt-x32-1_84 -lboost_iostreams-1-mt-x32-1_84 -lboost_json-1-mt-x32-1_84 -lboost_locale-1-mt-x32-1_84 -lboost_log-1-mt-x32-1_84 -lboost_log_setup-1-mt-x32-1_84 -lboost_math_c99-1-mt-x32-1_84 -lboost_math_c99f-1-mt-x32-1_84 -lboost_math_c99l-1-mt-x32-1_84 -lboost_math_tr1-1-mt-x32-1_84 -lboost_math_tr1f-1-mt-x32-1_84 -lboost_math_tr1l-1-mt-x32-1_84 -lboost_nowide-1-mt-x32-1_84 -lboost_prg_exec_monitor-1-mt-x32-1_84 -lboost_program_options-1-mt-x32-1_84 -lboost_random-1-mt-x32-1_84 -lboost_regex-1-mt-x32-1_84 -lboost_serialization-1-mt-x32-1_84 -lboost_stacktrace_addr2line-1-mt-x32-1_84 -lboost_stacktrace_basic-1-mt-x32-1_84 -lboost_stacktrace_noop-1-mt-x32-1_84 -lboost_system-1-mt-x32-1_84 -lboost_test_exec_monitor-1-mt-x32-1_84 -lboost_thread-1-mt-x32-1_84 -lboost_timer-1-mt-x32-1_84 -lboost_type_erasure-1-mt-x32-1_84 -lboost_unit_test_framework-1-mt-x32-1_84 -lboost_wave-1-mt-x32-1_84 -lboost_wserialization-1-mt-x32-1_84
Cflags: -I${includedir}

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\emsdk.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\boost_1_84_0\lib\pkgconfig

eigen 3.4.0

配布は以下の GitHub。
https://gitlab.com/libeigen/eigen

インストールは以下の手順を実行する。

c:\dev>git clone --depth 1 https://gitlab.com/libeigen/eigen -b 3.4.0 eigen-3.4.0
c:\dev>cd eigen-3.4.0
c:\dev\eigen-3.4.0>mkdir build
c:\dev\eigen-3.4.0>cd build
c:\dev\eigen-3.4.0>emcmake cmake -G "MinGW Makefiles" ^
 -DCMAKE_INSTALL_PREFIX=C:/dev/tools/emsdk/local/eigen-3.4.0 ^
 -DEIGEN_BUILD_PKGCONFIG=ON ^
 -DEIGEN_CONFIG_DIR=C:/dev/tools/emsdk/local/eigen-3.4.0 ^
 ..
c:\dev\eigen-3.4.0>cmake --build . --target install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\eigen-3.4.0\share\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\emsdk.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\eigen-3.4.0\share\pkgconfig

zlib 1.3.1

配布サイトは以下。
https://zlib.net/

最新のバージョンのソースコードをダウンロードできる。

インストールは以下の手順を実行する。

c:\dev>curl -O https://zlib.net/zlib131.zip
c:\dev>7z x zlib131.zip
c:\dev>cd zlib-1.3.1
c:\dev\zlib-1.3.1>mkdir build
c:\dev\zlib-1.3.1>cd build
c:\dev\zlib-1.3.1\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1
CMAKE_BUILD_TYPE:STRING=Release
CMAKE_C_FLAGS:STRING=-fPIC -s SIDE_MODULE=1
INSTALL_BIN_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/bin
INSTALL_INC_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/include
INSTALL_LIB_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/lib
INSTALL_MAN_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/share/man
INSTALL_PKGCONFIG_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/lib/pkgconfig

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

C:\dev\zlib-1.3.1\build>mingw32-make
C:\dev\zlib-1.3.1\build>mingw32-make install

zlib はライブラリとしての提供であり、単体では使わない。

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\zlib-1.3.1\lib\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\emsdk.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\zlib-1.3.1\lib\pkgconfig

lz4 v1.9.4

配布は以下のGitHub。
https://github.com/lz4/lz4

インストールは以下の手順を実行する。

C:\dev>git clone https://github.com/lz4/lz4  -b v1.9.4 lz4-v1.9.4
C:\dev>cd lz4-v1.9.4
C:\dev\lz4-v1.9.4>cd build
C:\dev\lz4-v1.9.4\build>cd cmake
C:\dev\lz4-v1.9.4\build\cmake>mkdir build
C:\dev\lz4-v1.9.4\build\cmake>cd build
C:\dev\lz4-v1.9.4\build\cmake\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

CMAKE_BUILD_TYPE:STRING=Release
CMAKE_C_FLAGS:STRING=-fPIC -s SIDE_MODULE=1
BUILD_SHARED_LIBS:BOOL=0
BUILD_STATIC_LIBS:BOOL=1
CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/lz4-v1.9.4

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

C:\dev\zlib-1.3.1\build>mingw32-make
C:\dev\zlib-1.3.1\build>mingw32-make install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\lz4-v1.9.4\lib\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\lz4-v1.9.4\lib\pkgconfig

vtk 9.3.0

配布サイトは以下の GitHub。
https://gitlab.kitware.com/vtk/vtk.git

インストールは以下の手順を実行する。

c:\dev>tar -xzf VTK-9.3.0.tar.gz   
c:\dev>cd vtk-v9.2.6
c:\dev\VTK-9.3.0>mkdir build
c:\dev\VTK-9.3.0>cd build
c:\dev\VTK-9.3.0\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

BUILD_SHARED_LIBS:BOOL=0
CMAKE_BUILD_TYPE:STRING=Release
CMAKE_CXX_FLAGS:STRING=-std=c++17 -fPIC -s SIDE_MODULE=1
CMAKE_C_FLAGS:STRING=-fPIC -s SIDE_MODULE=1
CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/vtk-v9.3.0
VTK_ENABLE_LOGGING:BOOL=0
VTK_ENABLE_WRAPPING:BOOL=0
VTK_GROUP_ENABLE_Qt:STRING=NO
VTK_MODULE_ENABLE_VTK_GUISupportQt:STRING=NO
VTK_MODULE_ENABLE_VTK_GUISupportQtSQL:STRING=NO
VTK_MODULE_ENABLE_VTK_GUISupportQtQuick:STRING=NO
VTK_MODULE_ENABLE_VTK_hdf5:STRING=NO
VTK_MODULE_ENABLE_VTK_RenderingLICOpenGL2:STRING=NO
VTK_MODULE_ENABLE_VTK_RenderingQt:STRING=NO
VTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2:STRING=YES
VTK_MODULE_ENABLE_VTK_RenderingCellGrid:STRING=NO
VTK_MODULE_ENABLE_VTK_sqlite:STRING=NO
VTK_MODULE_ENABLE_VTK_ViewsQt:STRING=NO

ビルド範囲を広げると大抵エラーとなるので最小ビルドを目指す。GDEXTENSION WEB ターゲットでは Qt も不要。ただし、 VTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2 は pcl が必須とするので YES とする。

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

c:\dev\VTK-9.3.0\build>mingw32-make
c:\dev\VTK-9.3.0\build>mingw32-make install

pkgconfig は生成されないので以下を設置する。

C:\dev\tools\emsdk\local\vtk-v9.3.0\lib\pkgconfig\vtk.pc

# Package Information for pkg-config

prefix=C:\dev\tools\emsdk\local\vtk-v9.3.0
libdir=${prefix}/lib
includedir=${prefix}/include/vtk-9.3
Name: vtk
Description: VTK C++ source libraries
Version: 9.3.0
Libs: -L${libdir} -lvtkRenderingLOD-9.3 -lvtkFiltersModeling-9.3 -lvtkIOImage-9.3 -lvtkRenderingOpenGL2-9.3 -lvtkInteractionWidgets-9.3 -lvtkIOPLY-9.3 -lvtkRenderingAnnotation-9.3 -lvtkRenderingFreeType-9.3 -lvtkRenderingHyperTreeGrid-9.3 -lvtktiff-9.3 -lvtkInteractionStyle-9.3 -lvtkRenderingUI-9.3 -lvtkFiltersHyperTree-9.3 -lvtkRenderingCore-9.3 -lvtkFiltersGeneral-9.3 -lvtkFiltersGeometry-9.3 -lvtkFiltersGeometryPreview-9.3 -lvtkCommonExecutionModel-9.3 -lvtkFiltersExtraction-9.3 -lvtkFiltersCore-9.3 -lvtkCommonDataModel-9.3 -lvtkCommonCore-9.3 -lvtksys-9.3 -lvtkChartsCore-9.3 -lvtkCommonColor-9.3 -lvtkCommonComputationalGeometry-9.3 -lvtkCommonMisc-9.3 -lvtkCommonSystem-9.3 -lvtkCommonTransforms-9.3 -lvtkDICOMParser-9.3 -lvtkDomainsChemistry-9.3 -lvtkDomainsChemistryOpenGL2-9.3 -lvtkdoubleconversion-9.3 -lvtkexpat-9.3 -lvtkFiltersAMR-9.3 -lvtkFiltersCellGrid-9.3 -lvtkFiltersFlowPaths-9.3 -lvtkFiltersGeneric-9.3 -lvtkFiltersHybrid-9.3 -lvtkFiltersImaging-9.3 -lvtkFiltersParallel-9.3 -lvtkFiltersParallelImaging-9.3 -lvtkFiltersPoints-9.3 -lvtkFiltersProgrammable-9.3 -lvtkFiltersReduction-9.3 -lvtkFiltersSelection-9.3 -lvtkFiltersSMP-9.3 -lvtkFiltersSources-9.3 -lvtkFiltersStatistics-9.3 -lvtkFiltersTexture-9.3 -lvtkFiltersTensor-9.3 -lvtkFiltersTopology-9.3 -lvtkFiltersVerdict-9.3 -lvtkfmt-9.3 -lvtkfreetype-9.3 -lvtkgl2ps-9.3 -lvtkglew-9.3 -lvtkImagingColor-9.3 -lvtkImagingCore-9.3 -lvtkImagingFourier-9.3 -lvtkImagingGeneral-9.3 -lvtkImagingHybrid-9.3 -lvtkImagingMath-9.3 -lvtkImagingMorphological-9.3 -lvtkImagingSources-9.3 -lvtkImagingStatistics-9.3 -lvtkImagingStencil-9.3 -lvtkInfovisCore-9.3 -lvtkInfovisLayout-9.3 -lvtkInteractionImage-9.3 -lvtkIOAsynchronous-9.3 -lvtkIOChemistry-9.3 -lvtkIOCityGML-9.3 -lvtkIOCore-9.3 -lvtkIOEnSight-9.3 -lvtkIOExport-9.3 -lvtkIOExportGL2PS-9.3 -lvtkIOExportPDF-9.3 -lvtkIOCellGrid-9.3 -lvtkIOGeometry-9.3 -lvtkIOImport-9.3 -lvtkIOInfovis-9.3 -lvtkIOLegacy-9.3 -lvtkIOLSDyna-9.3 -lvtkIOMotionFX-9.3 -lvtkIOMovie-9.3 -lvtkIOOggTheora-9.3 -lvtkIOParallel-9.3 -lvtkIOParallelXML-9.3 -lvtkIOSegY-9.3 -lvtkIOTecplotTable-9.3 -lvtkIOVideo-9.3 -lvtkIOXML-9.3 -lvtkIOXMLParser-9.3 -lvtkjpeg-9.3 -lvtkjsoncpp-9.3 -lvtkkissfft-9.3 -lvtklibharu-9.3 -lvtklibxml2-9.3 -lvtklz4-9.3 -lvtklzma-9.3 -lvtkmetaio-9.3 -lvtkogg-9.3 -lvtkParallelCore-9.3 -lvtkParallelDIY-9.3 -lvtkpng-9.3 -lvtkpugixml-9.3 -lvtkRenderingContext2D-9.3 -lvtkRenderingContextOpenGL2-9.3 -lvtkRenderingGL2PSOpenGL2-9.3 -lvtkRenderingImage-9.3 -lvtkRenderingLabel-9.3 -lvtkRenderingSceneGraph-9.3 -lvtkRenderingVolume-9.3 -lvtkRenderingVolumeOpenGL2-9.3 -lvtkRenderingVtkJS-9.3 -lvtkRenderingWebGPU-9.3 -lvtkTestingRendering-9.3 -lvtktheora-9.3 -lvtkverdict-9.3 -lvtkViewsContext2D-9.3 -lvtkViewsCore-9.3 -lvtkViewsInfovis-9.3 -lvtkzlib-9.3 -lvtkCommonMath-9.3
Cflags: -I${includedir}

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\vtk-v9.3.0\lib\pkgconfig\vtk.pc

flann 1.9.1

配布サイトは以下の GitHub。
https://github.com/mariusmuja/flann

インストールは以下の手順を実行する。

c:\dev>git clone --depth 1 https://github.com/mariusmuja/flann -b 1.9.1 flann-1.9.1
c:\dev\flann-1.9.1>cd flann-1.9.1
c:\dev\flann-1.9.1>mkdir build
c:\dev\flann-1.9.1>cd build
c:\dev\flann-1.9.1\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

BUILD_EXAMPLES:BOOL=0
BUILD_PYTHON_BINDINGS:BOOL=0
BUILD_TESTS:BOOL=0
BUILD_MATLAB_BINDINGS:BOOL=0
CMAKE_BUILD_TYPE:STRING=Release
CMAKE_CXX_FLAGS:STRING=-std=c++14 -fPIC -s SIDE_MODULE=1
CMAKE_C_FLAGS:STRING=-fPIC -s SIDE_MODULE=1
CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/flann-1.9.1
USE_OPENMP:BOOL=0

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

c:\dev\flann-1.9.1\build>mingw32-make
c:\dev\flann-1.9.1\build>mingw32-make install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\flann-1.9.1\lib\pkgconfig

ただし、スタティックライブラリのライブラリ名に齟齬が有るので以下のように修正する。

C:\dev\tools\emsdk\local\flann-1.9.1\lib\pkgconfig\flann.pc

  Requires: 
- Libs: -L${libdir} -lflann -lflann_cpp
+ Libs: -L${libdir} -lflann_s -lflann_cpp_s
  Cflags: -I${includedir}

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\flann-1.9.1\lib\pkgconfig

qhull v8.0.2

配布サイトは以下の GitHub。
https://github.com/qhull/qhull

インストールは以下の手順を実行する。

c:\dev>git clone --depth 1 https://github.com/qhull/qhull -b v8.0.2 qhull-v8.0.2
c:\dev>cd qhull-v8.0.2
c:\dev\qhull-v8.0.2>emconfigure cmake-gui .

generate 完了後、以下の Config Key を編集する。

CMAKE_CXX_FLAGS:STRING=-fPIC
CMAKE_C_FLAGS:STRING=-fPIC
CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/qhull-v8.0.2
CMAKE_BUILD_TYPE:STRING=Release
BUILD_SHARED_LIBS:BOOL=0
WITH_LFS:BOOL=0

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

c:\dev\qhull-v8.0.2>mingw32-make
c:\dev\qhull-v8.0.2>mingw32-make install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\qhull-v8.0.2\lib\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\qhull-v8.0.2\lib\pkgconfig

pcl 1.13.1

配布サイトは以下の GitHub。
https://github.com/PointCloudLibrary/pcl.git

インストールは以下の手順でできる。依存するライブラリが非常に多く、Cmake のコンフィグもややこしい。

c:\dev>git clone --depth 1 https://github.com/PointCloudLibrary/pcl.git -b pcl-1.13.1 pcl-1.13.1
c:\dev>cd pcl-1.13.1
c:\dev\pcl-1.13.1>mkdir build
c:\dev\pcl-1.13.1>cd build
c:\dev\pcl-1.13.1\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

VTK_DIR:PATH=C:/dev/VTK-9.3.0/build
ZLIB_INCLUDE_DIR:PATH=C:/dev/tools/emsdk/local/zlib-1.3.1/include
ZLIB_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/zlib-1.3.1/lib/libz.a
ZLIB_LIBRARY_DEBUG:FILEPATH=C:/dev/tools/emsdk/local/zlib-1.3.1/lib/libz.a

Qhull_DIR:PATH=C:/dev/qhull-v8.0.2
QHULL_LIBRARY_STATIC:FILEPATH=C:/dev/tools/emsdk/local/qhull-v8.0.2/lib/libqhullstatic.a

EIGEN_INCLUDE_DIR:PATH=C:/dev/tools/emsdk/local/eigen-3.4.0/include/eigen3

flann_DIR:PATH=C:/dev/flann-1.9.1/build/cmake
FLANN_INCLUDE_DIR:PATH=C:/dev/tools/emsdk/local/flann-1.9.1/include
FLANN_LIBRARY_DEBUG_STATIC:FILEPATH=C:/dev/tools/emsdk/local/flann-1.9.1/lib/libflann_s.a
FLANN_LIBRARY_STATIC:FILEPATH=C:/dev/tools/emsdk/local/flann-1.9.1/lib/libflann_s.a

WITH_CUDA:BOOL=0
WITH_OPENMP:BOOL=0
WITH_OPENGL:BOOL=0
WITH_LIBUSB:BOOL=0
WITH_PCAP:BOOL=0
WITH_QT:STRING=NO

CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/pcl-1.13.1
CMAKE_C_FLAGS:STRING=-fPIC -DBOOST_HAS_PTHREADS
CMAKE_CXX_FLAGS:STRING=-fPIC -DBOOST_HAS_PTHREADS
CMAKE_CONFIGURATION_TYPES:STRING=Release
CMAKE_BUILD_TYPE:STRING=Release
CMAKE_MSVC_CODE_LINK_OPTIMIZATION:BOOL=0

CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE:BOOL=0
CUDA_PROPAGATE_HOST_FLAGS:BOOL=0
CUDA_HOST_COMPILATION_CPP:BOOL=0

PCL_QHULL_REQUIRED_TYPE:STRING=STATIC
PCL_SHARED_LIBS:BOOL=0

Boost_DIR:PATH=C:/dev/tools/emsdk/local/boost_1_84_0
Boost_LIBRARY_DIR_DEBUG:PATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib
Boost_LIBRARY_DIR_RELEASE:PATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib
Boost_SERIALIZATION_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib/libboost_serialization-1-mt-x32-1_84.a
Boost_FILESYSTEM_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib/libboost_filesystem-1-mt-x32-1_84.a
Boost_IOSTREAMS_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib/libboost_iostreams-1-mt-x32-1_84.a
Boost_SYSTEM_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib/libboost_system-1-mt-x32-1_84.a
Boost_INCLUDE_DIR:PATH=C:/dev/tools/emsdk/local/boost_1_84_0/include/boost-1_84
Boost_REGEX_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/boost_1_84_0/lib/libboost_regex-1-mt-x32-1_84.a

設定変更した後は “Generate” ボタンにより確認する。最初は全てのコンフィグは選べず、Generate の度にエラーが発生するが、エラーの内容を確認し、コンフィグを追加していく。アドベンチャーゲームのように謎解きを楽しみながら先へ先へと進んでゆくと良いと思う。

Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

mingw32-make
mingw32-make install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\pcl-1.13.1\lib\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\pcl-1.13.1\lib\pkgconfig

opencv 4.8.1

インストールは以下の手順でできる。

c:\dev>git clone --depth 1 https://github.com/opencv/opencv -b 4.8.1 opencv-4.8.1
c:\dev>cd opencv-4.8.1
c:\dev\opencv-4.8.1>mkdir build
c:\dev\opencv-4.8.1>cd build
c:\dev\opencv-4.8.1\build>
c:\dev\opencv-4.8.1\build>emconfigure cmake-gui ..

generate 完了後、以下の Config Key を編集する。

Eigen3_DIR:PATH=C:/dev/eigen-3.4.0/build
EIGEN_INCLUDE_PATH:PATH=C:/dev/tools/emsdk/local/eigen-3.4.0/include/eigen3

ENABLE_PIC:BOOL=0
ENABLE_LIBJPEG_TURBO_SIMD:BOOL=0

CMAKE_INSTALL_PREFIX:PATH=C:/dev/tools/emsdk/local/opencv-4.8.1
CMAKE_CONFIGURATION_TYPES:STRING=Release

CMAKE_CXX_FLAGS:STRING=-fPIC -s SIDE_MODULE=1
CMAKE_C_FLAGS:STRING=-fPIC -s SIDE_MODULE=1

CPU_BASELINE:STRING=
CPU_DISPATCH:STRING=

CV_TRACE:BOOL=0
CV_ENABLE_INTRINSICS:BOOL=0

ZLIB_LIBRARY_RELEASE:FILEPATH=C:/dev/tools/emsdk/local/zlib-1.3.1/lib/libz.a

BUILD_ITT:BOOL=0
BUILD_IPP_IW:BOOL=0
BUILD_JPEG:BOOL=1
BUILD_OPENJPEG:BOOL=1
BUILD_opencv_videoio:BOOL=0
BUILD_opencv_java_bindings_generator:BOOL=0
BUILD_opencv_js:BOOL=0
BUILD_opencv_highgui:BOOL=1
BUILD_opencv_apps:BOOL=0
BUILD_opencv_python_bindings_generator:BOOL=0
BUILD_opencv_stitching:BOOL=1
BUILD_opencv_python_tests:BOOL=0
BUILD_opencv_imgcodecs:BOOL=1
BUILD_SHARED_LIBS:BOOL=0
BUILD_TESTS:BOOL=0
BUILD_TIFF:BOOL=1
BUILD_PACKAGE:BOOL=0
BUILD_PNG:BOOL=1
BUILD_PERF_TESTS:BOOL=0
BUILD_ZLIB:BOOL=1

WITH_1394:BOOL=0
WITH_ADE:BOOL=0
WITH_ARITH_DEC:BOOL=0
WITH_ARITH_ENC:BOOL=0
WITH_EIGEN:BOOL=1
WITH_FFMPEG:BOOL=0
WITH_GTK:BOOL=0
WITH_GSTREAMER:BOOL=0
WITH_JPEG:BOOL=1
WITH_JASPER:BOOL=0
WITH_LAPACK:BOOL=0
WITH_OBSENSOR:BOOL=0
WITH_OPENCLAMDBLAS:BOOL=0
WITH_OPENCL:BOOL=0
WITH_OPENCLAMDFFT:BOOL=0
WITH_QUIRC:BOOL=0
WITH_TIFF:BOOL=1
WITH_ITT:BOOL=0
WITH_IPP:BOOL=0
WITH_PNG:BOOL=1
WITH_V4L:BOOL=0
WITH_VA_INTEL:BOOL=0
WITH_WEBP:BOOL=0

OPENCV_GENERATE_PKGCONFIG:BOOL=1

設定変更した後は “Generate” ボタンにより確認する。問題無ければ “Configure” ボタンを左クリックし、Configuration を実行する。Makefile はカレントディレクトリに生成されるので、以下のようにビルドを実行する。

c:\dev\opencv-4.8.1\build>mingw32-make
c:\dev\opencv-4.8.1\build>mingw32-make install

pkg-config ファイルは以下に格納される。

C:\dev\tools\emsdk\local\opencv-4.8.1\lib\pkgconfig

コマンドプロンプトを起動した際のディレクトリに設置する %HOMEPATH%\mingw64.bat に以下の記述を追加しておく。

%HOMEPATH%\emsdk.bat(追加部分)

set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\opencv-4.8.1\lib\pkgconfig

環境変数設定ファイル emsdk.bat

emscripten 用環境設定設定ファイル emsdk_env.bat は最終的には以下のようになる。

%HOMEPATH%\emsdk.bat

SET PATH=%PATH%;"C:\Program Files\7-Zip"
SET PATH=%PATH%;C:\dev\tools\pkg-config\bin
SET PATH=C:\dev\tools\Python\Python312\Scripts;C:\dev\tools\Python\Python312;%PATH%
SET PATH=C:\dev\tools\mingw64\bin;%PATH%
SET PATH=C:\dev\godot-4.2.1-stable\bin;%PATH%
SET PATH=%PATH%;C:\dev\tools\emsdk\local

set PKG_CONFIG_EXE_DIR=C:\dev\tools\pkg-config\bin

call c:\dev\tools\emsdk\emsdk_env.bat
set PKG_CONFIG_PATH=""
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\boost_1_84_0\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\eigen-3.4.0\share\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\zlib-1.3.1\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\lz4-v1.9.4\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\vtk-v9.3.0\lib\pkgconfig\vtk.pc
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\flann-1.9.1\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\qhull-v8.0.2\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\pcl-1.13.1\lib\pkgconfig
set PKG_CONFIG_PATH=%PKG_CONFIG_PATH%;C:\dev\tools\emsdk\local\opencv-4.8.1\lib\pkgconfig

SET CMAKE_PREFIX_PATH=C:\dev\tools\emsdk\local

cd c:\dev

本稿の振り返りと次稿について

emscripten 向けにも boost や Eigen3 といった汎用ライブラリ、vtk, pcl, opencv といった大物 C++ ライブラリをビルドすることができた。

次稿では実際に使えるか、opencv に関してだけ試してみようと思う。

コメント

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