[インデックス 19510] ファイルの概要
このコミットは、Go言語のGoogle Native Client (NaCl) サポートに関するドキュメントとテストスクリプトの更新を目的としています。具体的には、misc/nacl/README
ファイル内のGoツールチェインのビルドおよびテスト手順が修正され、src/nacltest.bash
スクリプトに go_nacl_${naclGOARCH}_exec
の存在チェックが追加されました。これにより、NaCl環境でのGoのテスト実行がより堅牢になります。
コミット
nacltest.bash, misc/nacl/README: update NaCl docs.
LGTM=rsc R=dave, rsc CC=golang-codereviews https://golang.org/cl/105030043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3ad9df0422213468e22078bf5957fcc2fcafc391
元コミット内容
nacltest.bash, misc/nacl/README: update NaCl docs.
LGTM=rsc
R=dave, rsc
CC=golang-codereviews
https://golang.org/cl/105030043
変更の背景
この変更は、Go言語がGoogle Native Client (NaCl) をサポートしていた時期に行われました。NaClは、ウェブブラウザ内でネイティブコード(C/C++など)を安全かつ高性能に実行するためのGoogleが開発したサンドボックス技術です。NaCl環境では、セキュリティ上の理由から、アプリケーションはホストOSのファイルシステムに直接アクセスできません。代わりに、サンドボックス化されたファイルシステム、通常はインメモリファイルシステムやHTML5ファイルシステムを介してファイル操作を行います。
Go言語のNaClサポートにおいて、テストの実行は特に複雑でした。従来のGoのテストスクリプトである all.bash
は、通常のファイルシステムアクセスを前提としていましたが、NaCl環境ではこれが利用できません。そのため、NaCl専用のテストスクリプト nacltest.bash
が開発されました。このスクリプトは、テストに必要なファイルをインメモリファイルシステムに組み込み、その上でテストを実行するという特殊な手順を踏みます。
このコミットの背景には、nacltest.bash
の利用方法の明確化と、テスト実行時の前提条件(go_nacl_${naclGOARCH}_exec
の存在)の確認を強化することで、NaCl環境でのGoのビルドとテストの信頼性を向上させるという目的があります。また、ドキュメントの更新は、ユーザーがGoをNaCl向けにビルド・テストする際の手順をより正確に理解できるようにするためのものです。
前提知識の解説
- Go言語 (Golang): Googleによって開発されたオープンソースのプログラミング言語。並行処理に強く、シンプルで効率的なコード記述が可能です。
- Google Native Client (NaCl): Googleが開発したサンドボックス技術で、ウェブブラウザ内でネイティブコード(C/C++など)を安全に実行することを可能にします。これにより、ウェブアプリケーションで高性能な処理を実現することを目指していました。NaClは、セキュリティモデルとして、コードがホストシステムのリソースに直接アクセスするのを防ぎます。現在ではWebAssembly (Wasm) が後継技術として普及し、NaClは非推奨となっています。
sel_ldr
(Secure ELF Loader): NaClのランタイムコンポーネントであり、NaClモジュール(.nexe
ファイル)を実行するサンドボックス環境を提供します。sel_ldr
は、NaClモジュールがシステムリソースに不正にアクセスするのを防ぐためのセキュリティチェックを行います。- インメモリファイルシステム: 物理的なストレージではなく、コンピュータのメモリ上に構築される一時的なファイルシステムです。NaClのようなサンドボックス環境では、セキュリティと分離のために、アプリケーションが直接ホストのファイルシステムにアクセスする代わりに、インメモリファイルシステムが提供されることがあります。これにより、アプリケーションはファイル操作を行えますが、その影響はサンドボックス内に限定されます。
GOOS
とGOARCH
: Go言語のクロスコンパイルにおいて重要な環境変数です。GOOS
: ターゲットとするオペレーティングシステム(例:linux
,windows
,darwin
,nacl
)。GOARCH
: ターゲットとするアーキテクチャ(例:amd64
,arm
,amd64p32
)。amd64p32
は、64ビットアーキテクチャ上で32ビットポインタを使用するNaCl特有のアーキテクチャです。
nacltest.bash
: Go言語のNaClサポートにおいて、NaCl環境でGoのテストを実行するために特別に設計されたシェルスクリプトです。通常のall.bash
とは異なり、NaClのサンドボックス制約に対応するため、インメモリファイルシステムを構築し、テストに必要なファイルを埋め込むなどの処理を行います。go_nacl_${GOARCH}_exec
: NaCl環境でGoのバイナリを実行するためのヘルパースクリプトまたは実行ファイルです。NaClのサンドボックス内でGoのプログラムを起動するために必要とされます。
技術的詳細
このコミットは、Go言語のNaClサポートにおけるビルドおよびテストプロセスの改善に焦点を当てています。
-
misc/nacl/README
の更新:- 以前のドキュメントでは、Goツールチェインのビルドとテストが別々のセクションに分かれており、それぞれ
make.bash
とrun.bash
を使用するよう指示されていました。 - 今回の変更により、「Build the Go toolchain.」と「Test the Go toolchain.」というセクションが「Build and test Go for NaCl」という単一のセクションに統合されました。
- 最も重要な変更は、テストの実行方法です。以前は
env GOOS=nacl GOARCH=amd64p32 ./run.bash
と指示されていましたが、新しいドキュメントではenv GOARCH=amd64p32 ./nacltest.bash
となっています。これは、NaCl環境でのテストがnacltest.bash
という専用スクリプトによって行われることを明確に示しています。 - また、NaClが直接ファイルシステムアクセスを許可しないこと、そして
syscall
パッケージがインメモリデータによって提供されるシミュレートされたファイルシステムを使用すること、そしてnacltest.bash
がall.bash
のNaCl版であるという説明が追加されました。これにより、NaCl環境の特殊性が強調され、ユーザーがテストの仕組みを理解しやすくなっています。
- 以前のドキュメントでは、Goツールチェインのビルドとテストが別々のセクションに分かれており、それぞれ
-
src/nacltest.bash
の更新:- スクリプトのコメントが更新され、
sel_ldr
バイナリだけでなく、go_nacl_$GOARCH_exec
スクリプトも$PATH
に存在する必要があることが明記されました。これは、GoのNaClバイナリを実行するためにgo_nacl_exec
が必要であることを示唆しています。 - 新しいコードブロックが追加され、
go_nacl_${naclGOARCH}_exec
が$PATH
に存在するかどうかをチェックするようになりました。もし見つからない場合、エラーメッセージを出力してスクリプトを終了します。この変更により、テスト実行前に必要な依存関係が満たされているかどうかが確認され、より堅牢なテストプロセスが実現されます。これにより、ユーザーはテストが失敗する前に、必要なツールが不足していることを早期に知ることができます。
- スクリプトのコメントが更新され、
これらの変更は、GoのNaClサポートにおけるビルドおよびテストプロセスの正確性と信頼性を向上させることを目的としています。特に、NaCl環境の制約(ファイルシステムアクセスなど)を考慮したテストの実行方法が明確化され、必要なツールが揃っているかどうかの事前チェックが導入されました。
コアとなるコードの変更箇所
misc/nacl/README
--- a/misc/nacl/README
+++ b/misc/nacl/README
@@ -54,12 +54,10 @@ The script's name has a special format, go_$GOOS_$GOARCH_exec, so cmd/go can fin
In short, if the support scripts are in place, the cmd/go tool can be used as per normal.
-# Build the Go toolchain.
+# Build and test Go for NaCl
-\t% cd go/src
-\t% env GOOS=nacl GOARCH=amd64p32 ./make.bash
-\
-# Test the Go toolchain.
+NaCl does not permit direct file system access. Instead, package syscall provides a simulated file system served by in-memory data. The script nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an in-memory file system containing files needed for tests, and then it runs the tests.
% cd go/src
-\t% env GOOS=nacl GOARCH=amd64p32 ./run.bash
+\t% env GOARCH=amd64p32 ./nacltest.bash
src/nacltest.bash
--- a/src/nacltest.bash
+++ b/src/nacltest.bash
@@ -7,7 +7,8 @@
# Builds a test file system and embeds it into package syscall
# in every generated binary.
#
-# Assumes that sel_ldr binaries are in $PATH; see ../misc/nacl/README.
+# Assumes that sel_ldr binaries and go_nacl_$GOARCH_exec scripts are in $PATH;
+# see ../misc/nacl/README.
set -e
ulimit -c 0
@@ -32,6 +33,11 @@ amd64p32)
exit 1
esac
+if ! which go_nacl_${naclGOARCH}_exec >/dev/null; then
+\techo "cannot find go_nacl_${naclGOARCH}_exec, see ../misc/nacl/README." 1>&2
+\texit 1
+fi
+
# Run host build to get toolchain for running zip generator.
unset GOOS GOARCH
if [ ! -f make.bash ]; then
コアとなるコードの解説
misc/nacl/README
の変更点
- セクションの統合とテストコマンドの変更:
# Build the Go toolchain.
と# Test the Go toolchain.
という見出しが削除され、# Build and test Go for NaCl
に統合されました。これは、NaCl環境でのGoのビルドとテストが密接に関連していることを示唆しています。- 以前のテストコマンド
env GOOS=nacl GOARCH=amd64p32 ./run.bash
がenv GOARCH=amd64p32 ./nacltest.bash
に変更されました。これは、NaCl環境でのテスト実行には専用のnacltest.bash
スクリプトを使用することが推奨されるようになったことを明確に示しています。GOOS=nacl
はnacltest.bash
の内部で設定されるため、外部からの指定が不要になったと考えられます。
- NaClファイルシステムに関する説明の追加:
- 「NaCl does not permit direct file system access. Instead, package syscall provides a simulated file system served by in-memory data. The script nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an in-memory file system containing files needed for tests, and then it runs the tests.」という説明が追加されました。
- この説明は、NaCl環境の重要な制約である「直接ファイルシステムアクセス不可」という点を強調しています。そして、Goの
syscall
パッケージがインメモリファイルシステムを提供することでこの制約を回避していること、さらにnacltest.bash
がこのインメモリファイルシステムを構築し、テストに必要なファイルを埋め込む役割を果たすことを明確にしています。これにより、ユーザーはNaCl環境でのGoのテストがどのように機能するかの背景を理解できます。
src/nacltest.bash
の変更点
- コメントの更新:
- スクリプトの冒頭のコメント「Assumes that sel_ldr binaries are in $PATH; see ../misc/nacl/README.」が「Assumes that sel_ldr binaries and go_nacl_$GOARCH_exec scripts are in $PATH; see ../misc/nacl/README.」に更新されました。
- これは、
nacltest.bash
が正しく機能するためには、sel_ldr
バイナリだけでなく、go_nacl_${GOARCH}_exec
というGoのNaClバイナリを実行するためのヘルパースクリプトも$PATH
に存在する必要があることを明示しています。
go_nacl_${naclGOARCH}_exec
の存在チェックの追加:- 新しい
if
文が追加されました。if ! which go_nacl_${naclGOARCH}_exec >/dev/null; then ... fi
- このコードは、
which
コマンドを使用してgo_nacl_${naclGOARCH}_exec
がシステムの$PATH
内に存在するかどうかを確認します。 - もし存在しない場合(
!
演算子により否定)、エラーメッセージ「cannot find go_nacl_${naclGOARCH}_exec, see ../misc/nacl/README.」を標準エラー出力 (1>&2
) に表示し、スクリプトを終了 (exit 1
) します。 - このチェックの追加により、
nacltest.bash
はテストを実行する前に、GoのNaClバイナリを実行するために必要な環境が整っているかを自動的に検証するようになりました。これにより、ユーザーはテストが途中で失敗するのではなく、必要なツールが不足しているという明確なエラーメッセージを受け取ることができ、デバッグが容易になります。
- 新しい
これらの変更は全体として、GoのNaClサポートにおけるドキュメントの正確性を高め、テストスクリプトの堅牢性を向上させることで、開発者がNaCl環境でGoをよりスムーズに利用できるようにすることを目的としています。
関連リンク
- Google Native Client (Wikipedia): https://en.wikipedia.org/wiki/Google_Native_Client
- WebAssembly (Wikipedia): https://en.wikipedia.org/wiki/WebAssembly
参考にした情報源リンク
- Web search results for "Go Native Client file system"
- Web search results for "Go NaCl sel_ldr"
- Web search results for "Go nacltest.bash"
- Web search results for "Go go_nacl_exec"
- Go言語の公式ドキュメント (当時のNaCl関連ドキュメント)
- Go言語のソースコード (特に
misc/nacl
およびsrc
ディレクトリ) - Stack Overflow や Reddit の関連ディスカッション