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

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

このコミットは、Go言語の実験的なexp/terminalパッケージ内のMakefileに対する変更です。具体的には、Makefileの書式設定が原因でビルドプロセスの一部であるdeps.bashスクリプトが正しく解釈できず、結果としてmake.bashが失敗するという問題を修正しています。

コミット

commit 151bcb11a8fe353530d614adcffa1f3ee2099ba4
Author: Dmitriy Vyukov <dvyukov@google.com>
Date:   Fri Nov 18 15:30:36 2011 +0300

    exp/terminal: fix Makefile formatting for deps.bash
    deps.bash does not understand current format,
    so make.bash fails (with MAKEFLAGS=-j20).
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5410046

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

https://github.com/golang/go/commit/151bcb11a8fe353530d614adcffa1f3ee2099ba4

元コミット内容

exp/terminal: fix Makefile formatting for deps.bash
deps.bash does not understand current format,
so make.bash fails (with MAKEFLAGS=-j20).

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5410046

変更の背景

このコミットは、Go言語のビルドシステムにおける特定のMakefileの書式設定の問題を解決するために行われました。2011年当時のGoのビルドシステムは、主にシェルスクリプトとカスタムビルドツールに依存しており、make.bashが中心的な役割を担っていました。

問題は、src/pkg/exp/terminal/Makefile内でGOFILES変数にutil.goを追加する際の記述方法にありました。元のMakefileでは、GOFILES+=util.goという形式で記述されていましたが、ビルドプロセスの一部であるdeps.bashスクリプトがこの書式を正しく解釈できませんでした。その結果、make.bash(特にMAKEFLAGS=-j20のような並列ビルドオプションが指定された場合)が失敗するという事象が発生していました。

この修正は、ビルドの安定性と互換性を確保し、開発者が並列ビルドオプションを使用しても問題なくGoプロジェクトをビルドできるようにするために必要でした。

前提知識の解説

  • Makefile: Makefileは、makeユーティリティがプログラムのコンパイルやその他のタスクを自動化するために使用するファイルです。依存関係とそれらを構築するためのルールを定義します。Go言語の初期のビルドシステムでは、Goプログラム自体のビルドだけでなく、ツールチェインのビルドにもMakefileが利用されていました。
  • make.bash: 2011年当時のGoのビルドシステムにおいて、make.bashはGoツールチェインをソースからビルドするための中心的なシェルスクリプトでした。これはビルド環境の初期チェック、cmd/distツールのコンパイル、そして全体のビルドプロセスをオーケストレーションする役割を担っていました。
  • deps.bash: コミットメッセージに登場するdeps.bashは、Goのビルドプロセスの一部として、依存関係の解決や生成に関連するタスクを実行するスクリプトであったと推測されます。Web検索ではdeps.bashに関する詳細な公式ドキュメントは見つかりませんでしたが、コミットメッセージから、Makefileの特定の書式を解析する役割を持っていたことが示唆されます。
  • GOOS: Go言語のクロスコンパイルを制御するための環境変数で、ターゲットとなるオペレーティングシステムを指定します(例: linux, windows, darwinなど)。このコミットでは、GOOSwindowsでない場合にのみutil.goGOFILESに追加する条件分岐が使用されています。

技術的詳細

問題の核心は、Makefileにおける変数への値の追加方法にありました。

元のコード:

ifneq ($(GOOS),windows)
GOFILES+=util.go
endif

このGOFILES+=util.goという記述は、makeユーティリティ自体にとっては有効な構文です。しかし、Goのビルドプロセス内でこのMakefileを解析するdeps.bashスクリプトが、この形式を正しく処理できなかったと考えられます。特に、MAKEFLAGS=-j20のような並列ビルドオプションが指定された場合に問題が顕在化したことから、deps.bashが並列処理環境下でのMakefileの解析に脆弱性を持っていたか、あるいは特定の書式に厳密であった可能性が考えられます。

修正は、GOFILESへのutil.goの追加を、より明示的な複数行の形式に変更することで行われました。

修正後のコード:

ifneq ($(GOOS),windows)
GOFILES+=\\
	util.go
endif

この変更により、util.goが新しい行でインデントされ、行末にバックスラッシュ\が追加されています。Makefileにおいてバックスラッシュは行の継続を示し、次の行が現在の行の論理的な続きであることを意味します。この形式は、deps.bashがより確実にGOFILES変数への追加を認識できるようにするためのものでした。

この修正は、Makefileの構文規則に則りつつ、特定のスクリプト(deps.bash)が期待する書式に合わせることで、ビルドプロセスの堅牢性を向上させることを目的としています。

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

変更はsrc/pkg/exp/terminal/Makefileファイルに対して行われました。

--- a/src/pkg/exp/terminal/Makefile
+++ b/src/pkg/exp/terminal/Makefile
@@ -9,7 +9,8 @@ GOFILES=\
 	terminal.go\
 
 ifneq ($(GOOS),windows)
-GOFILES+=util.go
+GOFILES+=\\
+\tutil.go
 endif
 
 include ../../../Make.pkg

具体的には、9行目から11行目にかけての変更です。

  • -GOFILES+=util.go (削除された行)
  • +GOFILES+=\\ (追加された行)
  • +\tutil.go (追加された行)

コアとなるコードの解説

この変更の目的は、GOFILES変数にutil.goを追加する際のMakefileの書式を修正し、deps.bashスクリプトがこれを正しく解析できるようにすることです。

元のGOFILES+=util.goという記述は、makeにとってはGOFILES変数にutil.goを追加するという意味になります。しかし、deps.bashがこの一行形式を正しく処理できなかったため、ビルドが失敗していました。

修正後のGOFILES+=\\\tutil.goという記述は、GOFILES変数にutil.goを追加するという意味は変わりませんが、makeに対してはGOFILESの定義が次の行に続いていることを明示的に伝えます。この複数行にわたる記述は、deps.bashが変数の追加をより確実に認識できる形式であったと考えられます。

この修正により、GOFILES変数の内容がdeps.bashによって正しく構築され、その後のmake.bashによるビルドプロセスが正常に完了するようになりました。特に、MAKEFLAGS=-j20のような並列ビルドオプションが指定された場合でも、deps.bashMakefileを正しく解析できるようになり、ビルドの安定性が向上しました。

関連リンク

  • Go CL 5410046: https://golang.org/cl/5410046

参考にした情報源リンク

  • Go build system in 2011:
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHwoJRkzQ4OJ7Vf3iAaLs9uZd65jnT9-XZIbTL4YdgX4i5TSaJpdwiBSyqCBNg2tHAull_-Qd9VR9UnbXO-gyHqPz4ubzAiD2ZY9bxRWrJVt4kewfETL_A6X4zGqRjK1mmv9q1kEs3O1I375uFGnU5NZonohV4gbGfniLWk
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEzhwaNYA69YsgChuD9CmO8QxD2uYVqb6139Un4MH-eeAZXL6-SmyNjkCYpTiE-fMXsTPn3CuC0NswtMdOS4z3isjAvOUa5TSNLuYr3ykm-ia-azZVrVDnOZ7wRENMF3lSDpBJs7UEvPLAo-5ySofy6sWc6J8AmtODK9tI=
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHnqBOTT6--4wZ4d9785oyeXffUJo0cBsNXJY7CroHoJxAywwfWLKTOcNs8d15QtxQ7ZyTDxsvhFfoseE0azSXhO6X9iNq5JrXHLgWyD8TYtfTw3Exp6cu4PPRppQzkyy8xQjUqOWNyL4NISRhahmhl7A==
  • GOPATH and Go Modules:
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH_ZmpEcJsQkCaWvKmglyjlvd6BKkmc6Q0559fngKLXH0IIh-2Ts1I_AEuIHh-A37tq-5Cwt6WbTeD3dEXQZwOtLhEA5IWVPwkHbRo2mNQAn-5tkZZvHAdBLUjnA7CIUXJnoHaSlpm82AfpUw==
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEIBmGcfSOsJHYw34CnpWmT4erdNu43qXRPYMpDliNLUsat1JD264CEMdXb-N-BZk39A0j8jQrpXscke8GsXfaRd5Sww5v8KDzv9O9GvAVogNo_i7IdsyHJ-O67p0QvlNTMPYlKR6NlA4mxyiS93gEksjGR9bHeVKQplPECLLyyplVeIH4RuSpynnzQM9iiHwFBLPlmBGr0Aw==
  • go build command:
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFDrfTLogxxvluy-wQ5vTTtBNd7ttX31CxkriVfwv_0Szz4A2mUkH00auJQW56Gdw9NCm73RHBEJcxwr29zDNi4tBZlmoCk6hg0zMtpTpM7W8vIAfy4l3v7OB4DyC2pl7qmErmeDgQCvGSrbQ==
  • Cross-compilation (GOOS, GOARCH):
    • https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGWO1V3FTIX3x240La0viFYNJRMBqDM4uWhptY5YxE03Hv9-xiHvghLy8rRt8ahNhdRSfOfWcxM5BUZD0ePkeQx1qMib81dGO2FSt_QAb2JWWh_k8ByJ_xsuRupyyAZgQl4zdJLam6NQCMHd36aDtKAUS5CXQCT0XCSO5_ZaAyD0mw-Qk7m9sl9EBBBI7rPd4S_cr11g-uWW9wabjgSqs_SgEjKNpIXVEJA1MXEhX3eSm1Un7fNEA==