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

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

このコミットは、Go言語の初期のコンパイラビルドプロセスにおけるMakefileの変更に関するものです。具体的には、sysimport.cというファイルがビルド中に生成または更新される際に、Perforce (P4) バージョン管理システム下でファイルが書き込み可能であることを保証するためのp4 openコマンドを追加しています。これにより、ビルドプロセスがファイルへの書き込み権限の問題で失敗するのを防ぎます。

コミット

commit cbff09d6666bf4c2e4152fba5c858ae481a263d5
Author: Russ Cox <rsc@golang.org>
Date:   Fri Dec 19 09:03:44 2008 -0800

    g4 open sysimport.c before writing it
    
    R=r
    DELTA=1  (1 added, 0 deleted, 0 changed)
    OCL=21577
    CL=21603
---
 src/cmd/gc/Makefile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/cmd/gc/Makefile b/src/cmd/gc/Makefile
index 10afbc5d97..6c8834d2f2 100644
--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -46,6 +46,7 @@ y.tab.c: y.tab.h
 # than sys.go (or unsafe.go or mksys.c).
 sysimport.c:\tsys.go unsafe.go mksys.c
 \tif test -x $(BIN)/6g; then \\\
+\t\tp4 open sysimport.c; \\\
 \t\tgcc -o mksys mksys.c; \\\
 \t\t6g sys.go; \\\
 \t\t6g unsafe.go; \\\

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

https://github.com/golang/go/commit/cbff09d6666bf4c2e4152fba5c858ae481a263d5

元コミット内容

このコミットの元のメッセージは「g4 open sysimport.c before writing it」です。これは、sysimport.cというファイルを書き込む前に、g4コマンド(Google内部で使用されていたPerforceのラッパーまたはエイリアス)を使ってファイルを開き、書き込み可能にする必要があることを示しています。

変更の背景

Go言語の開発初期段階では、Google社内で広く使われていたバージョン管理システムであるPerforce (P4) が利用されていました。Perforceでは、通常、リポジトリから取得したファイルは読み取り専用(read-only)として扱われます。ファイルを編集したり、ビルドプロセスで生成・更新したりする際には、明示的にp4 openコマンドを実行してファイルを書き込み可能にする必要があります。

このコミットが行われた当時、Goコンパイラのビルドプロセスにおいてsrc/cmd/gc/Makefile内でsysimport.cというファイルが生成または更新されていました。もしsysimport.cがPerforceによって管理されており、かつ読み取り専用のままであった場合、ビルドスクリプトがこのファイルに書き込もうとした際に権限エラーが発生し、ビルドが失敗する可能性がありました。

この変更は、このようなビルドエラーを防ぐために導入されました。sysimport.cを生成する前にp4 openを実行することで、ファイルが確実に書き込み可能になり、ビルドプロセスがスムーズに進行するようになります。

前提知識の解説

Perforce (P4)

Perforceは、大規模なソフトウェア開発プロジェクトで利用される集中型バージョン管理システム(CVCS)です。Gitのような分散型バージョン管理システム(DVCS)とは異なり、中央のリポジトリサーバーがすべてのバージョン履歴を管理します。

  • 集中型モデル: すべての変更は中央サーバーにコミットされます。
  • ファイルのロックと書き込み権限: Perforceでは、通常、クライアントワークスペースに同期されたファイルはデフォルトで読み取り専用属性が設定されます。これは、複数の開発者が同時に同じファイルを編集して競合が発生するのを防ぐための一つの戦略です。ファイルを編集するには、開発者はp4 edit(またはp4 open)コマンドを実行してファイルを「開く」必要があります。これにより、Perforceサーバーにそのファイルを編集する意図が通知され、ファイルが書き込み可能になります。
  • p4 openコマンド: このコマンドは、指定されたファイルを編集のために開きます。これにより、ファイルの読み取り専用属性が解除され、ローカルで変更を加えることができるようになります。変更後、p4 submitで中央リポジトリにコミットします。

Goコンパイラ (6g, gc)

Go言語の初期のコンパイラは、ターゲットアーキテクチャに応じて異なる名前を持っていました。例えば、6gは64ビットIntelアーキテクチャ(amd64)向けのGoコンパイラを指します。gcはGo Compilerの略で、Go言語の公式コンパイラツールチェーン全体を指すこともあります。このコミットが行われた2008年当時、Go言語はまだ開発初期段階であり、ビルドシステムも現在とは異なる部分が多くありました。

Makefile

Makefileは、Unix系システムでソフトウェアのビルドプロセスを自動化するためのファイルです。makeユーティリティによって解釈され、ソースコードのコンパイル、リンク、テストなどのタスクを定義します。Makefileは、依存関係に基づいてタスクの実行順序を決定し、変更されたファイルのみを再ビルドすることで、効率的なビルドを実現します。

sysimport.c

sysimport.cは、Goコンパイラのビルドプロセス中に生成されるC言語のソースファイルであると推測されます。Go言語のランタイムや標準ライブラリがC言語のコードと連携する際に、システム固有のインポートや定義、あるいはGoとCの間のインターフェースに関するコードが含まれる可能性があります。このようなファイルは、ビルド環境やGoのバージョンによって内容が動的に生成されるため、ビルド時に書き込み権限が必要となります。

技術的詳細

このコミットは、src/cmd/gc/Makefile内のsysimport.cを生成するルールに一行追加するものです。

元のMakefileのルールは以下のようになっています。

sysimport.c:	sys.go unsafe.go mksys.c
	if test -x $(BIN)/6g; then \
		gcc -o mksys mksys.c; \
		6g sys.go; \
		6g unsafe.go; \
		# ... (sysimport.cを生成するコマンドが続く)
	fi

このルールは、sysimport.csys.gounsafe.gomksys.cに依存していることを示しています。$(BIN)/6g(Goコンパイラ)が存在する場合に、一連のコマンドが実行されます。これらのコマンドには、mksysという実行可能ファイルのコンパイル、sys.gounsafe.goのコンパイルが含まれており、最終的にsysimport.cが生成されるか、その内容が更新されることが期待されます。

追加された行は、この一連のコマンドの冒頭にp4 open sysimport.c;を挿入するものです。

--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -46,6 +46,7 @@ y.tab.c: y.tab.h
 # than sys.go (or unsafe.go or mksys.c).
 sysimport.c:\tsys.go unsafe.go mksys.c
 \tif test -x $(BIN)/6g; then \\\
+\t\tp4 open sysimport.c; \\\
 \t\tgcc -o mksys mksys.c; \\\
 \t\t6g sys.go; \\\
 \t\t6g unsafe.go; \\\

この変更により、sysimport.cを生成する処理が開始される前に、Perforceに対してsysimport.cを編集のために開くよう指示が出されます。これにより、Perforceが管理するファイルが読み取り専用属性であっても、ビルドプロセスがそのファイルに書き込むことが可能になります。これは、ビルドの信頼性を高め、権限関連のビルド失敗を防ぐための重要な修正です。

g4はGoogle内部でのPerforceコマンドのエイリアスまたはラッパーであり、p4 openと機能的には同等です。このコミットは、Go言語がGoogleのインフラストラクチャ上で開発されていた初期の状況を反映しています。

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

変更はsrc/cmd/gc/Makefileファイルの一箇所のみです。

--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -46,6 +46,7 @@ y.tab.c: y.tab.h
 # than sys.go (or unsafe.go or mksys.c).
 sysimport.c:\tsys.go unsafe.go mksys.c
 \tif test -x $(BIN)/6g; then \\\
+\t\tp4 open sysimport.c; \\\
 \t\tgcc -o mksys mksys.c; \\\
 \t\t6g sys.go; \\\
 \t\t6g unsafe.go; \\\

具体的には、sysimport.cターゲットのビルドコマンドブロック内に、p4 open sysimport.c;という行が追加されています。

コアとなるコードの解説

追加された行は以下の通りです。

p4 open sysimport.c; \

この行は、Makefileのルール内でシェルコマンドとして実行されます。

  • p4 open sysimport.c: これはPerforceのコマンドであり、sysimport.cというファイルを編集のために開くことを意味します。Perforceが管理するファイルはデフォルトで読み取り専用であるため、このコマンドを実行することで、ファイルシステム上のsysimport.cの読み取り専用属性が解除され、後続のビルドコマンドがこのファイルに書き込めるようになります。
  • ; \: セミコロンは前のコマンドの終了を示し、バックスラッシュはMakefileの行継続を示します。これにより、このコマンドが次の行のコマンドと論理的に連結され、一連のシェルスクリプトとして実行されます。

この変更は、sysimport.cが生成される前に、そのファイルがPerforceによって適切に「チェックアウト」され、書き込み可能状態になることを保証します。これにより、ビルドプロセスがファイルへの書き込み権限の問題で中断されることを防ぎ、ビルドの堅牢性が向上します。

関連リンク

参考にした情報源リンク