ruby-trunk-changes 2022-01-19

今日は主に WASI 環境向けのビルドをサポートするための変更と rubygems/bundler の更新がありました。

[54568c949b] Kazuhiro NISHIYAMA 2022-01-18 13:57:21 UTC

NEWS にチケット参照のリンク用の footnote を追加。

[ffda21b7ba] Peter Zhu 2022-01-18 14:01:03 UTC

HP-UX のサポートを停止して configure の対応部分の削除や preprocessor 分岐で __hpux をチェックしているところを削除するなどしています。 [ruby-core:107129] [Feature #18491]

[e7b4abf384] Jeremy Evans 2022-01-18 19:40:13 UTC

コンパイラの組み込み関数の存在チェックに使うマクロ RBIMPL_HAS_BUILTIN___builtin_bswap32 と RBIMPL_HAS_BUILTIN___builtin_bswap64 を OpenBSD では定義しないようにしています。

[09ed5aa806] git 2022-01-18 19:45:48 UTC

version.h の日付更新

[8a50a6b6f9] Yuta Saito 2022-01-15 13:18:18 UTC

ここから WASI 向けのビルドのための変更が続きます。 configure に target_os が wasi の時にコンパイラオプションの stack-protector を無効にする指定を追加しています。

[e41b121e94] Yuta Saito 2022-01-15 17:34:43 UTC

configure に target_os が wasi の時のコンパイラオプション群の定義のセクションを追加しています。

[65f95f26ff] Yuta Saito 2022-01-15 14:10:48 UTC

WASI 環境向けにビルドに必要なツール類の wrapper コマンド追加や Makefile のルール追加、main 関数を rb_main() に改名して WASM 環境では rb_wasm_rt_start() を経由する main() 関数をその上に置く変更、WASI 環境用に setjmp(), fiber 用の swapcontext() などの関数の代替実装の追加、asyncify を利用するための実装の追加など。 asyncify という語彙が出てきますが、これは emscriptenC/C++ の同期的な関数の処理を非同期化してブラウザの処理エンジンに組み込めるようにするためのランタイム機能のことのようです。

[7ee786388a] Yuta Saito 2022-01-15 16:18:49 UTC

WASI 環境の libc ライブラリ関数に不足しているものをちゃんとチェックするため configure で kill() や execve() などの関数の存在チェックを追加して(6729258839467ffabf40e25e8510ee9f2a24864a もこれの Windows 版向けだったんですね)、存在しない時の代替実装を wasm/missing.c に追加しています。

[a4b73f1ba8] Yuta Saito 2022-01-15 13:22:30 UTC

Fiber のための coroutine 実装に WASI 環境向けの coroutine/asyncify/ を追加しています。

[23de01c7aa] Yuta Saito 2022-01-15 13:18:55 UTC

WASM 環境では setjmp.h をシステムヘッダを使うかわりに wasm/setjmp.h を #include するようにしています。

[e7fb1fa041] Yuta Saito 2022-01-15 14:57:14 UTC

GC の compaction で移動したオブジェクトへの参照を検出するための read barrier の実装にシグナルを利用しているけど WASI 環境ではサポートされていないということで GC_ENABLE_READ_SIGNAL_BARRIER というマクロを導入してこれが真でないとシグナルハンドラの処理は省略するようにしています。

[bf1c4d254b] Yuta Saito 2022-01-15 14:59:37 UTC

gc.c で emscripten 向けに追加していた rb_emscripten_mark_locations() を WASI 環境向けにも使いまわすため改名して、mark_current_machine_context() は WASI 環境向けの別バージョンの実装を追加しています。

[d6d52a7d04] Yuta Saito 2022-01-15 15:37:09 UTC

thread.c の DEBUG_OUT() というデバッグ出力用のマクロは排他処理部分が環境依存のためここだけ preprocessor 分岐で定義分けしていましたが、thread.c のプラットフォーム依存部分は thread_pthread.c や thread_win32.c という別のファイルに分けられているのでそれに倣ってそれぞれのファイル内にマクロ定義を置くようにリファクタリングしています。

[420622b5a7] Yuta Saito 2022-01-15 15:37:54 UTC

thread_none.c と thread_none.h というファイルを追加して第3の thread 実装を追加しています。実体としてはほぼなにもしない実装でインターフェースとして必要な関数が定義されているだけというような感じです。そして WASI 向けのビルド時にこの thread 実装を利用するように configure で対応しています。

[9033ac3e2c] Yuta Saito 2021-11-27 09:27:37 UTC

glob(3) のエラー時の処理で errno=EACCESS を警告扱いにするところで ENOTCAPABLE というエラーも(定義されていれば)同様の扱いにするようにしています。

[be1382b498] Yuta Saito 2021-12-06 02:25:44 UTC

起動時に静的にリンクする拡張ライブラリ向けの初期化処理を挿入するために Init_extra_exts() という空の関数を用意しておいてこれを呼び出すようにしています。 attribute で weak symbol にしておくことで動的リンク時に別の実装とすりかえることができるようにしています。

[3794ef6f01] Yuta Saito 2022-01-15 16:13:06 UTC

macOSコンパイラの警告を抑制するためにデフォルトで tool/darwin-cc というのを強制的に CC_WRAPPER と XCC_WRAPPER にセットするようになっていたのをやめています。

[f72f01abd8] Yuta Saito 2021-12-08 13:19:52 UTC

WASM 環境向けのテスト用ターゲット make test-wasm を追加して wasm/tests に C API のテスト? を追加しています。実行には wasmtime というコマンドを利用するようです。

[df31fa4a51] Yuta Saito 2021-12-09 03:44:45 UTC

WASI 環境には dup() と dup2() が利用できないため target_os が wasi の時にはこれらの関数を RUBY_REPLACE_FUNC() で存在しないとビルドエラーにするのを抑制するようにしています。

[dd99ee1f7d] Yuta Saito 2022-01-15 13:11:55 UTC

basictest および bootstraptest の Kernel#` (バッククオートによるコマンド実行) のテストを RUBY_PLATFORM をチェックして WASI 環境では実行しないようにしています。

[bb2228817f] Yuta Saito 2021-12-14 10:12:02 UTC

WASI 環境では MJIT は無効にするようにしています。デフォルトでは、とあるのでできる可能性もあるのかな? かなり難しそうだけど。

[4f579ecfce] Yuta Saito 2021-12-14 15:32:49 UTC

wasm/README.md を追加して WASM 環境向けのビルドについて簡単な説明をまとめています。

[50f1468bfd] Yuta Saito 2021-12-15 06:49:59 UTC

include/ruby/io.h での poll(2) 用の定数の定義で POLLPRI という定数が定義されない WASI 環境のためにマジックナンバーで RB_WAITFD_PRI を定義する分岐を追加しています。

[d015b0c928] Yuta Saito 2022-01-15 13:22:41 UTC

GitHub Actions に WASM 環境向けの workflow を追加しています。

[a892e5599e] git 2022-01-19 02:19:20 UTC

wasm/setjmp.c のタブを空白に展開。

[f04954d95c] David Rodríguez 2022-01-17 14:16:34 UTC

rubygems のコーディングスタイルの修正。主にインデントの変更のみ。

[39c36a5cf4] David Rodríguez 2022-01-17 19:46:49 UTC

bundler のテストで Windows で skip していたものが File.open の mode の変更で直ったみたいなので skip をやめています。

[e7249294fb] David Rodríguez 2022-01-17 17:55:10 UTC

bundler の spec.required_rubygems_version の未定義時のデフォルト値を Gem::Requirement.default に fallback するなどして nil にならないようにしてエラーを回避しているようです。

[2f0f56bdca] Nobuyoshi Nakada 2022-01-19 02:50:04 UTC

Process.groups や Process.initgroups の rdoc 用コメントの記法やマークアップの修正、groups の返す最大数についての記述の追加など。

[68e821c3e5] Yusuke Endoh 2022-01-19 04:14:43 UTC

ca3d405242c722c8140944bda7278c2a9e5a7139 で追加した定数の代入の評価順についてのテストで eval の外で定義した変数に eval 内で参照していたため変数が未使用と判定されて警告が出ていたので変数への代入も eval 内に閉じるように修正しています。

[8c21701968] Yuta Saito 2022-01-19 03:16:56 UTC

50f1468bfd11eb2ea54c2d6bea958f44eb2db33c の include/ruby/io.h での WASI 環境での RB_WAITFD_PRI 定義の再修正。POLLPRI が未定義だったら 0 で定義しておくようにしています。この定数はビットフラグとして使うものなので 0x3 にしていたのはまずかったとのこと。

[8f3e29c849] Nobuyoshi Nakada 2022-01-19 04:33:14 UTC

gc.c の rb_raw_obj_info() で文字列の capacity を表示するために使うフォーマット指示子に %ld を使ってましたがポインタが long より大きい環境向けに PRIdSIZE を使うように修正しています。

[5646f4b67b] Nobuyoshi Nakada 2022-01-19 05:45:52 UTC

e41b121e94ccce9877824e55f865885bbabe40c3 で configure.ac に追加した wasi 向けのオプション設定でカンマが抜けていたのを修正しています。

[d22511fd75] Hiroshi SHIBATA 2022-01-19 04:28:23 UTC

rubygems および bundler を upstream から最新版をマージしています。

[e4f8d5b2f5] 卜部昌平 2022-01-19 04:43:52 UTC

GitHub Actions の BASERUBY をいろんなバージョンを使ってみる workflow で 2.7 を消して 3.1 を追加しています。

[8b6a02de2f] David Rodríguez 2022-01-17 13:02:58 UTC

rubygems の gem list および gem search サブコマンドで引数とオプションの処理をリファクタリングしています。シンプルにするって書いてるけど if 文の評価値を代入の右辺に使うのも人によって好みは分かれそうですけどね。

[0350c179ea] David Rodríguez 2022-01-17 13:10:27 UTC

rubygems の gem list、gem query、gem search の引数処理は共通化されていて、全てで同じ name オプションの処理は共通部分に埋め込んでいます。

[1d530ae27a] David Rodríguez 2022-01-17 13:42:15 UTC

rubygems の lib/rubygems/commands/dependency_command.rb の未使用のメソッドを削除しています。

[0dd8c6157d] David Rodríguez 2022-01-17 13:42:41 UTC

rubygems の gem dependency サブコマンドの実装のリファクタリング。 Gem::Dependency.new を利用しないようにしている? ようです。

[528344b8de] Yuta Saito 2022-01-19 07:40:06 UTC

include/ruby/win32.h で Windows 環境での HAVE_SHUTDOWN を 1 に定義しておくようにしています。WASI のために追加した代替実装が使われないようにするため。