Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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のようなサンドボックス環境では、セキュリティと分離のために、アプリケーションが直接ホストのファイルシステムにアクセスする代わりに、インメモリファイルシステムが提供されることがあります。これにより、アプリケーションはファイル操作を行えますが、その影響はサンドボックス内に限定されます。
  • GOOSGOARCH: 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サポートにおけるビルドおよびテストプロセスの改善に焦点を当てています。

  1. misc/nacl/README の更新:

    • 以前のドキュメントでは、Goツールチェインのビルドとテストが別々のセクションに分かれており、それぞれ make.bashrun.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.bashall.bash のNaCl版であるという説明が追加されました。これにより、NaCl環境の特殊性が強調され、ユーザーがテストの仕組みを理解しやすくなっています。
  2. 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.bashenv GOARCH=amd64p32 ./nacltest.bash に変更されました。これは、NaCl環境でのテスト実行には専用の nacltest.bash スクリプトを使用することが推奨されるようになったことを明確に示しています。GOOS=naclnacltest.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をよりスムーズに利用できるようにすることを目的としています。

関連リンク

参考にした情報源リンク

  • 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 の関連ディスカッション