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

[インデックス 19688] ファイルの概要

このコミットは、Goプロジェクトのテスト実行スクリプトである src/run.bash に関連する変更です。run.bash は、Goの様々なテストスイートを実行し、異なるオペレーティングシステムやアーキテクチャでの動作を検証するための主要なスクリプトです。

コミット

このコミットは、GoのテストスイートがAndroid環境で正しく実行されない問題を解決するために、特定のテストをAndroidプラットフォームで無効化することを目的としています。特に、Cgo(GoとC言語の相互運用機能)を使用するテストや、ホスト環境に依存するテストが対象となっています。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/107b8fc9e41cbe365d574f56518ca27e7d9a919d

元コミット内容

run.bash: disable tests that don't (yet) like running off the host

LGTM=bradfitz, minux
R=bradfitz, golang-codereviews, minux
CC=golang-codereviews
https://golang.org/cl/110940043

変更の背景

このコミットが行われた2014年当時、Go言語のAndroidサポートはまだ初期段階にありました。Goはクロスコンパイルに優れていますが、生成されたバイナリがターゲット環境(この場合はAndroidデバイス)で完全に機能するためには、ランタイムやシステムコール、Cgoの挙動など、多くの課題をクリアする必要がありました。

特に、Cgoを利用するテストは、GoのコードとCのコードが連携するため、クロスコンパイルされたCライブラリや、ターゲット環境のCランタイムの可用性に強く依存します。Android環境では、通常のLinux環境とは異なるlibc(Bionic)が使用されるなど、Cgoのテストが期待通りに動作しないケースがありました。また、一部のテストは、テスト実行環境(ホスト)の特定の機能やネットワーク設定に依存しており、Androidデバイスのような「ホストから切り離された」環境では実行が困難でした。

このコミットは、これらの問題を一時的に回避し、CI/CDパイプラインや開発者がAndroid環境でGoのテストを実行する際に、失敗するテストによって全体のテストプロセスが中断されることを防ぐための措置として導入されました。将来的にはこれらのテストもAndroidで動作するように修正されることが期待されていましたが、この時点では無効化が最も現実的な解決策でした。

前提知識の解説

  • run.bash: Goプロジェクトのルートディレクトリにあるシェルスクリプトで、Goの標準ライブラリやツールチェインのテストを実行するために使用されます。様々なテストスイートを呼び出し、異なるプラットフォームでの動作を検証します。
  • GOOS: Goの環境変数の一つで、ターゲットとするオペレーティングシステムを指定します。例えば、linuxdarwin (macOS)、windowsandroid などがあります。このコミットでは、GOOSandroid の場合に特定の処理を行うように変更されています。
  • CGO_ENABLED: Goの環境変数の一つで、Cgoを有効にするかどうかを制御します。CGO_ENABLED=1 の場合、Cgoが有効になり、GoのコードからCの関数を呼び出すことができます。CGO_ENABLED=0 の場合、Cgoは無効になり、Cgoを使用するGoのコードはコンパイルできません。Cgoは、OSのシステムコールを直接呼び出したり、既存のCライブラリを利用したりする際に必要となります。
  • クロスコンパイル: あるプラットフォーム(例: Linux x86-64)で、別のプラットフォーム(例: Android ARM)向けの実行可能ファイルを生成することです。Goはクロスコンパイルを強力にサポートしていますが、ターゲット環境の特性(システムライブラリ、ABIなど)によっては、追加の設定や考慮が必要になります。
  • go test: Goの標準テストコマンドです。パッケージ内のテスト関数を実行します。
  • -ldflags: go buildgo test コマンドで使用されるフラグで、リンカに渡すオプションを指定します。-linkmode=external は、外部リンカ(通常はGCCなど)を使用してリンクを行うことを指示します。これはCgoを使用する場合や、特定のシステムライブラリにリンクする場合に重要になります。

技術的詳細

このコミットは、src/run.bash スクリプトに以下の主要な変更を加えています。

  1. AndroidでのCgoテストの無効化: スクリプトの冒頭近くに、GOOSandroid の場合に CGO_ENABLED=0 を設定するブロックが追加されました。

    if [ "$GOOS" == "android" ]; then
        # Disable cgo tests on android.
        # They are not designed to run off the host.
        # golang.org/issue/8345
        CGO_ENABLED=0
    fi
    

    これにより、Android環境ではCgoが強制的に無効化され、Cgoに依存するテストが実行されなくなります。コメントには golang.org/issue/8345 が参照されていますが、現在のGoのIssueトラッカーでこの番号は別の内容(gRPCのbalancerに関するもの)を示しており、当時の文脈とは異なる可能性があります。

  2. android-arm のテスト対象への追加: go test -ldflags '-linkmode=external' を実行するプラットフォームリストに android-arm が追加されました。

    -dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
    +android-arm | dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
    

    これは、Android ARMアーキテクチャでも外部リンカを使用したテストが試行されることを意味しますが、上記のCgo無効化と合わせて、Cgo関連のテストはスキップされます。

  3. Androidでの特定のテストスイートのスキップ: 複数のテストスイートの実行ブロックに、[ "$GOOS" == android ] || という条件が追加されました。これは、GOOSandroid でない場合にのみ、その後のテストを実行するという意味です。

    • ../doc/progs のテスト
    • ../doc/articles/wiki のテスト (コメントに TODO(crawshaw): get this working とある)
    • ../doc/codewalk のテスト
    • ../test/bench/go1 のベンチマークテスト
    • ../test のテスト (runtest)
    • ../misc/cgo/test のテスト (これはCgoテストであり、上記の CGO_ENABLED=0 とも関連)

    これらの変更により、Android環境では、当時問題なく動作しないと判断された広範なテストが実行対象から除外されるようになりました。

コアとなるコードの変更箇所

diff --git a/src/run.bash b/src/run.bash
index 128f15c395..d13161e9de 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -99,6 +99,13 @@ xcd() {
 # Strictly speaking, the test may be unnecessary on the final command of
 # the subshell, but it aids later editing and may avoid future bash bugs.
 
+if [ "$GOOS" == "android" ]; then
+	# Disable cgo tests on android.
+	# They are not designed to run off the host.
+	# golang.org/issue/8345
+	CGO_ENABLED=0
+fi
+
 [ "$CGO_ENABLED" != 1 ] ||
 [ "$GOHOSTOS" == windows ] ||
 (xcd ../misc/cgo/stdio
@@ -128,7 +135,7 @@ darwin-386 | darwin-amd64)\n \t*) go test -ldflags \'-linkmode=external\'  || exit 1;;\n \tesac\n \t;;\n-dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)\n+android-arm | dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)\n \tgo test -ldflags \'-linkmode=external\' || exit 1\n \tgo test -ldflags \'-linkmode=auto\' ../testtls || exit 1\n \tgo test -ldflags \'-linkmode=external\' ../testtls || exit 1\n@@ -182,16 +189,19 @@ go run main.go || exit 1\n ) || exit $?\n \n [ "$GOOS" == nacl ] ||\n+[ "$GOOS" == android ] ||\n (xcd ../doc/progs\n time ./run || exit 1\n ) || exit $?\n \n+[ "$GOOS" == android ] ||\n [ "$GOOS" == nacl ] ||\n [ "$GOARCH" == arm ] ||  # uses network, fails under QEMU\n (xcd ../doc/articles/wiki\n ./test.bash || exit 1\n ) || exit $?\n \n+[ "$GOOS" == android ] ||\n [ "$GOOS" == nacl ] ||\n (xcd ../doc/codewalk\n time ./run || exit 1\n@@ -203,6 +213,7 @@ time ./run || exit 1\n time ./timing.sh -test || exit 1\n ) || exit $?\n \n+[ "$GOOS" == android ] || # TODO(crawshaw): get this working\n [ "$GOOS" == openbsd ] || # golang.org/issue/5057\n (\n echo\n@@ -210,6 +221,7 @@ echo \'#\' ../test/bench/go1\n go test ../test/bench/go1 || exit 1\n ) || exit $?\n \n+[ "$GOOS" == android ] ||\n (xcd ../test\n unset GOMAXPROCS\n GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build -o runtest run.go || exit 1\n@@ -217,6 +229,7 @@ time ./runtest || exit 1\n rm -f runtest\n ) || exit $?\n \n+[ "$GOOS" == android ] ||\n [ "$GOOS" == nacl ] ||\n (\n echo\n```

## コアとなるコードの解説

1.  **Cgo無効化ブロックの追加**:
    ```bash
    +if [ "$GOOS" == "android" ]; then
    +	# Disable cgo tests on android.
    +	# They are not designed to run off the host.
    +	# golang.org/issue/8345
    +	CGO_ENABLED=0
    +fi
    ```
    このコードは、現在のビルドターゲットOSがAndroidであるかどうかを `GOOS` 環境変数でチェックします。もしAndroidであれば、`CGO_ENABLED` 環境変数を `0` に設定し、Cgoを無効にします。これにより、Cgoに依存するテストがコンパイルまたは実行されるのを防ぎます。コメントには、これらのテストが「ホストから切り離された」環境(Androidデバイスなど)で実行されるように設計されていないことが示唆されています。

2.  **プラットフォームリストへの `android-arm` の追加**:
    ```diff
    -dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
    +android-arm | dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | freebsd-arm | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
    ```
    これは、`go test -ldflags '-linkmode=external'` を実行する対象となるOS/アーキテクチャのリストに `android-arm` を追加しています。これは、Android ARM環境でも外部リンカを使用したテストが考慮されるようになったことを示しますが、前述のCgo無効化と組み合わさることで、Cgo関連のテストは引き続きスキップされます。

3.  **Androidでのテストスキップ条件の追加**:
    ```bash
    [ "$GOOS" == nacl ] ||
    +[ "$GOOS" == android ] ||
    (xcd ../doc/progs
    time ./run || exit 1
    ) || exit $?\n
    ```
    このパターンは、複数のテスト実行ブロックに適用されています。`[ "$GOOS" == android ] ||` はシェルスクリプトの条件式で、「もし `GOOS` が `android` であれば、その後のコマンド(`xcd ...` で始まるブロック)は実行しない」という意味になります。つまり、Android環境ではこれらのテストスイートがスキップされるように変更されました。これは、当時のAndroid環境ではこれらのテストが安定して動作しなかったための一時的な措置です。

## 関連リンク

*   Go CL (Code Review) ページ: [https://golang.org/cl/110940043](https://golang.org/cl/110940043)

## 参考にした情報源リンク

*   GitHubコミットページ: [https://github.com/golang/go/commit/107b8fc9e41cbe365d574f56518ca27e7d9a919d](https://github.com/golang/go/commit/107b8fc9e41cbe365d574f56518ca27e7d9a919d)
*   `golang.org/issue/8345` に関するWeb検索結果 (ただし、このコミットで参照されているIssueの内容は、現在のIssueトラッカー上の内容と異なる可能性があります):
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGce-xX-_opVEGOyEdWZLEdV96h_G9GY5PYaPmsVcRlYHOxFygQMQDIf3X7U1eePvSLVho7fPEyTfx_ELETd_mrPeltf9Woq8eYljZjRvDr8eHY44TrxaKM2veXb1PzohrAdFpvbg==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGce-xX-_opVEGOyEdWZLEdV96h_G9GY5PYaPmsVcRlYHOxFygQMQDIf3X7U1eePvSLVho7fPEyTfx_ELETd_mrPeltf9Woq8eYljZjRvDr8eHY44TrxaKM2veXb1PzohrAdFpvbg==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFW1yxrnkNVtSAvlajA3RDvd8pUDvKsCpk0OehvueGVZxP1QvZGBl2ZJKY18-uXvLfNmanm3Xxx-iWlKlqxKz3gOIqp9hqo7FKNmzuw_Lj27EqRGgEK6_NU0_GfWdqw66O8yVKjR_1gDvZTfk8BG9Q=](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFW1yxrnkNVtSAvlajA3RDvd8pUDvKsCpk0OehvueGVZxP1QvZGBl2ZJKY18-uXvLfNmanm3Xxx-iWlKlqxKz3gOIqp9hqo7FKNmzuw_Lj27EqRGgEK6_NU0_GfWdqw66O8yVKjR_1gDvZTfk8BG9Q=)