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

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

このコミットは、Goランタイムからmkversion.cという未使用のファイルを削除するものです。これは、Goのビルドプロセスにおけるバージョン情報の生成方法の進化を反映しています。

コミット

commit e880ab112e9eb4ff6f7c6f3410b68238f8e7403f
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Sun Jun 9 22:04:17 2013 +0800

    runtime: remove unused file mkversion.c
    
    R=golang-dev, iant
    CC=golang-dev
    https://golang.org/cl/10107044

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

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

元コミット内容

このコミットの元の内容は、src/pkg/runtime/mkversion.cというファイルを削除することです。コミットメッセージは「runtime: remove unused file mkversion.c」と簡潔に述べられており、このファイルがもはや使用されていないことを示しています。

変更の背景

Goの初期のビルドシステムでは、Goのバージョン情報やGOROOTのパスを埋め込むためにC言語のプログラムが使用されていました。mkversion.cはそのような目的のために存在し、Goのランタイムパッケージ内で使用される定数(defaultGoroottheVersionなど)を含むGoのソースファイルを生成していました。

しかし、Goのビルドシステムは時間の経過とともに進化し、よりGoネイティブなツールやスクリプトに移行していきました。特に、Go 1.4以降では、go tool distコマンドがビルドプロセスの中核となり、バージョン情報の生成もGoのツールチェーン自体によってより効率的に行われるようになりました。

このコミットが行われた2013年6月は、Go 1.1がリリースされた後であり、Go 1.2の開発が進められていた時期にあたります。この時期には、Goのビルドシステムやツールチェーンの改善が活発に行われており、mkversion.cのようなC言語ベースの補助スクリプトが不要になったことが背景にあります。つまり、このファイルはGoのビルドプロセスにおける役割を終え、冗長になったため削除されました。

前提知識の解説

Goのビルドプロセス

Goのプログラムは、go buildコマンドによってコンパイルされます。このプロセスには、ソースコードの解析、依存関係の解決、コンパイル、リンクが含まれます。Goのツールチェーンは、Goのソースコードだけでなく、Cやアセンブリ言語で書かれたランタイムコードもコンパイルして最終的なバイナリに含めます。

Goのバージョン情報とGOROOT

Goのバイナリには、コンパイル時に使用されたGoのバージョン情報(例: go1.2.1)や、Goの標準ライブラリがインストールされているパス(GOROOT)が埋め込まれることがあります。これは、デバッグや環境の特定に役立ちます。

mkversion.cの役割(過去)

mkversion.cは、Goのビルドプロセスの一部として実行されるCプログラムでした。その主な役割は、Goのランタイムパッケージ(package runtime)内で使用されるGoの定数を含むGoのソースファイルを生成することでした。具体的には、defaultGoroottheVersionという定数を定義するGoのコードを標準出力に出力し、それがファイルにリダイレクトされてGoのソースファイルとして保存されていました。

このファイルは、// +build ignoreというビルドタグを持っており、これは通常のGoのビルドプロセスではコンパイルされないことを意味します。代わりに、autogen.shのようなシェルスクリプトから明示的にコンパイル・実行されていました。

autogen.sh

Goの初期のビルドシステムでは、autogen.shというスクリプトがGoのソースコードから自動生成されるファイルを管理していました。mkversion.cはこのスクリプトによってコンパイル・実行され、バージョン情報を生成していました。

技術的詳細

削除されたmkversion.cファイルの内容は以下の通りです。

// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build ignore

#include <u.h>
#include <libc.h>

char *template =
	"// AUTO-GENERATED by autogen.sh; DO NOT EDIT\\n\\n"\
	"package runtime\\n"\
	"const defaultGoroot = `%s`\\n"\
	"const theVersion = \\\"%s\\\"\\n\";

void
main(void)
{
	print(template, getgoroot(), getgoversion());
	exits(0);
}

このCプログラムは、templateという文字列リテラルを定義しています。このテンプレートは、Goのソースコードの形式をしており、package runtimeconst defaultGorootconst theVersionという行を含んでいます。

main関数では、getgoroot()getgoversion()という関数を呼び出して、それぞれ現在のGOROOTパスとGoのバージョン文字列を取得しています。これらの値はtemplate文字列の%sプレースホルダーに挿入され、print関数によって標準出力に出力されます。

この出力は、通常、zversion.goのようなファイルにリダイレクトされ、Goのランタイムパッケージの一部としてコンパイルされていました。

このファイルが削除されたということは、getgoroot()getgoversion()のようなC関数を呼び出してバージョン情報を取得し、それをGoのソースファイルとして生成するというアプローチが、より新しい、おそらくGoネイティブなメカニズムに置き換えられたことを意味します。例えば、Goのビルドツール自体が、コンパイル時に必要なバージョン情報を直接埋め込むようになったり、Goのコードでバージョン情報を生成するようになったりしたと考えられます。

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

このコミットによる変更は、単一のファイルの削除です。

--- a/src/pkg/runtime/mkversion.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-#include <u.h>
-#include <libc.h>
-
-char *template =
-	"// AUTO-GENERATED by autogen.sh; DO NOT EDIT\\n\\n"\
-	"package runtime\\n"\
-	"const defaultGoroot = `%s`\\n"\
-	"const theVersion = \\\"%s\\\"\\n\";
-
-void
-main(void)
-{
-	print(template, getgoroot(), getgoversion());
-	exits(0);\n}

この差分は、src/pkg/runtime/mkversion.cファイルが完全に削除されたことを示しています。21行のコードが削除され、追加された行はありません。

コアとなるコードの解説

このコミットには、新しいコードの追加や既存コードの変更は含まれていません。唯一の変更は、mkversion.cというファイルがGoのリポジトリから削除されたことです。

この削除は、Goのビルドシステムが成熟し、バージョン情報の生成方法がより洗練されたことを示しています。C言語で書かれた補助ツールが不要になったことは、Goのツールチェーンが自己完結性を高め、Go言語自体でより多くのタスクを処理できるようになったことの証拠です。

この変更は、Goのビルドプロセスのクリーンアップと効率化に貢献しています。不要なファイルを削除することで、コードベースの複雑さを軽減し、メンテナンス性を向上させます。

関連リンク

参考にした情報源リンク

  • Goのコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • GoのIssue Tracker (GoLang.org): https://go.dev/issue
  • Goのソースコード内の関連ファイル(例: src/cmd/dist/build.goなど、ビルドプロセスを理解するために)
  • Goの初期のビルドシステムに関するブログ記事やドキュメント(もしあれば)
  • Goの// +buildタグに関するドキュメント: https://go.dev/cmd/go/#hdr-Build_constraints
  • Go 1.4リリースノート(go tool distの進化について言及がある可能性) 解説の生成が完了しました。