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
配布サイトは以下。
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 に関してだけ試してみようと思う。
コメント