Open2

Yuniframe: NCCCモジュール化

okuokuokuoku

通常のインタプリタ言語における拡張モジュールはその言語でしか使えないことが多いが、NCCCならNode.jsやSchemeでモジュールを共用できる。。はず。というわけでYuniframeをNCCCモジュールにする。

配置場所

将来的には環境変数とかexecutable 相対による追加ロケーションを検討したいが、一旦以下に決め打ちにする。

  • mac/Linux/BSDなどPOSIX風OS: /opt/nccc/<module_name>/<module_name>_<ABI>_ncccv0.<soやdyld等拡張子>
  • Windows: c:/nccc/<module_name>/<module_name>_<ABI>_ncccv0.dll

いわゆるモバイルプラットフォーム等では、そもそもインタプリタやアプリケーション側に内蔵(静的リンク)される想定なので専用の配置場所は設定しない。

ABI

これも悩みどころだが一旦:

  • CPUバリアントは表現しない -- x86-64-v2 等は不要と判断
  • libcバリアントは 表現する -- 単一システムにMuslとglibcが同居するケースを想定する
  • カーネルバリアントは表現しない

つまり、今回のYuniframeの場合は以下が存在する:

  • amd64 amd64glibc amd64musl
  • i686musl -- 現役のLinuxでi686サポートが残っているメジャーディストリビューションはAlpineのみ
  • arm64 arm64glibc arm64musl
  • arm32glibc

今回はさらにそのサブセットにする。カーネル種別ごとに整理すると:

  • Windows: amd64
  • Linux: arm32glibc (RaspberryPi OS) arm64glibc amd64glibc amd64musl (Manylinux)
  • macOS: amd64

利用するC-WebGLバックエンド

C-WebGLバックエンド、つまりGPU描画はOS標準のものを使用する。つまり、

  • Windows: ANGLE + DirectX11
  • Linux: Mesa
  • macOS: ANGLE + Metal

OpenGL ESが標準で利用できるOSはLinuxやBSDといったMesaを採用しているシステムくらいしかない。WindowsもmacOSも自前のOpenGLを持ってはいるものの "ES" ではない。

そして全OSで本来は共通のはずのVulkanが無い ! まぁバックエンド単位のデバッグは別途やれば良いんじゃないかな。。あくまでアプリ側の開発用なのでdeployの簡便さを推す。

使用するMiniioバックエンド

ネットワーク通信にはMiniioを使用する。このバックエンドはlibuvが大抵のOSで利用できる。

okuokuokuoku

Alpineはデフォルトで PIC じゃないのか。。

ASLRするのに必須だと思うんだけど。。

/usr/lib/gcc/x86_64-alpine-linux-musl/13.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: /home/oku/repos/em2native-tests/_build/PosixNative@UV/uv/uv/Debug/libuv.a(udp.c.o): warning: relocation against `in6addr_any' in read-only section `.text'
/usr/lib/gcc/x86_64-alpine-linux-musl/13.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: /home/oku/repos/em2native-tests/_build/PosixNative@UV/uv/uv/Debug/libuv.a(uv-common.c.o): relocation R_X86_64_PC32 against symbol `stderr' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-alpine-linux-musl/13.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: final link failed: bad value

とりあえず依存関係のビルド時には CMAKE_POSITION_INDEPENDENT_CODE を立てるようにする。

https://github.com/okuoku/em2native-integ/commit/4d6a80abdae6fb35224e4dd69e11e1693e7f33fc

https://github.com/okuoku/em2native-tests/commit/a703fc7d43678130a178fbd9cea46daba2b34535