Open2
Yuniframe: NCCCモジュール化
通常のインタプリタ言語における拡張モジュールはその言語でしか使えないことが多いが、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で利用できる。
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
を立てるようにする。