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

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

このコミットは、Go言語のWindows向けパッケージングスクリプト(misc/windows)が、これまで386アーキテクチャ(32ビット)のみを対象としていた制限を解除し、amd64アーキテクチャ(64ビット)でも利用できるように拡張するものです。これにより、Windows環境で64ビット版Goのパッケージを生成するプロセスが簡素化され、より柔軟な開発・配布が可能になります。

コミット

  • Author: Alex Brainman alex.brainman@gmail.com
  • Date: Fri Oct 28 08:45:17 2011 +1100
  • Commit Message:
    misc/windows: allow to be used for amd64
    
    R=jdpoirier
    CC=golang-dev
    https://golang.org/cl/5305048
    

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

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

元コミット内容

misc/windows: allow to be used for amd64

R=jdpoirier
CC=golang-dev
https://golang.org/cl/5305048

変更の背景

Go言語は、クロスプラットフォーム対応を重視しており、Windows環境も主要なターゲットの一つです。しかし、このコミット以前のWindows向けパッケージングスクリプトは、主に32ビットアーキテクチャ(386)に特化していました。当時のGo言語の開発が進むにつれて、64ビットアーキテクチャ(amd64)の重要性が増し、Windows上での64ビット版Goのビルドとパッケージングの需要が高まっていました。

このコミットの背景には、以下の課題がありました。

  1. 32ビットアーキテクチャへの依存: 既存のパッケージングスクリプトは、生成されるZIPファイル名やインストーラーのバージョン名に386をハードコードしており、64ビット版のパッケージを適切に生成できませんでした。
  2. ドキュメントの不備: READMEファイルには、amd64アーキテクチャでのパッケージングに関する指示が不足しており、ユーザーが64ビット版をビルド・パッケージングする際に混乱を招く可能性がありました。
  3. 柔軟性の欠如: GOARCH環境変数の利用が考慮されておらず、アーキテクチャに依存しない汎用的なパッケージングプロセスが求められていました。

このコミットは、これらの課題を解決し、Windows環境でのGo言語のパッケージングプロセスをより堅牢で柔軟なものにすることを目的としています。

前提知識の解説

このコミットを理解するためには、以下の技術的用語や概念について知っておく必要があります。

  • GOARCH: Go言語のビルドシステムで使用される環境変数の一つで、ターゲットとするCPUアーキテクチャを指定します。例えば、386はIntel/AMDの32ビットアーキテクチャを、amd64はIntel/AMDの64ビットアーキテクチャを指します。Goのコンパイラは、このGOARCHの値に基づいて、指定されたアーキテクチャ向けのバイナリを生成します。
  • 386: Intel 80386プロセッサに由来する名称で、一般的に32ビットのx86アーキテクチャを指します。Windows環境では、32ビットアプリケーションがこのアーキテクチャで動作します。
  • amd64: AMDが開発した64ビットのx86アーキテクチャの拡張機能で、Intelも採用しているため、x86-64とも呼ばれます。現代のほとんどのデスクトップPCやサーバーで使用されている64ビットプロセッサのアーキテクチャです。
  • 7za: 7-Zipというオープンソースのファイルアーカイバのコマンドラインバージョンです。非常に高い圧縮率と多様なアーカイブ形式をサポートしており、このコミットではZIP形式のパッケージングに使用されています。
  • ISCC: Inno Setup Compilerの略で、Windowsインストーラーを作成するためのスクリプトベースのツールです。Go言語のWindows向けインストーラーの生成に利用されています。
  • msys: "Minimal SYStem"の略で、Windows上でUnixライクな環境を提供するツールセットです。BashシェルやGNUツールなどが含まれており、Go言語のビルドスクリプトがBashで書かれているため、Windows環境でのビルドに利用されていました。
  • GOROOT: Go言語のインストールディレクトリのルートパスを示す環境変数です。Goのソースコード、コンパイラ、標準ライブラリなどがこのディレクトリに配置されます。
  • GOBIN: Go言語のビルドシステムで使用される環境変数で、go installコマンドで生成された実行可能ファイルが配置されるディレクトリを指定します。通常は$GOROOT/binまたはユーザーの$HOME/go/binなどに設定されます。
  • hg up -r ...: Mercurial (hg) バージョン管理システムにおけるコマンドです。upは"update"の略で、指定されたリビジョン(-rオプションで指定)に作業ディレクトリを更新します。この文脈では、特定のGoのバージョン(リビジョン)を選択するために使用されていました。

技術的詳細

このコミットの技術的な変更は、主に以下の2つのファイルに集中しています。

  1. misc/windows/README:

    • このファイルは、Windows向けGoパッケージのビルドとパッケージングに関する手順を説明するドキュメントです。
    • 変更前は、GOBIN$GOROOT\binである場合に「空であること」を要求していましたが、変更後は「空であるか、または$GOROOT\binであること」というより柔軟な表現に変更されました。これは、GOBINがデフォルトで$GOROOT\binに設定される場合があるため、その状態でも問題なく動作するようにするためです。
    • 最も重要な変更は、GOARCH=386という前提条件が削除され、代わりに「$GOARCH=386または$GOARCH=amd64であることを確認する」という指示が追加された点です。これにより、ユーザーはGOARCH環境変数を設定することで、32ビット版と64ビット版のどちらのパッケージも生成できることが明確になりました。
  2. misc/windows/package.bash:

    • このシェルスクリプトは、Go言語のWindows向けパッケージ(ZIPファイルとインストーラー)を実際に生成する役割を担っています。
    • 変更前は、7zaコマンドで生成されるZIPファイル名がgowin386_"$ver".zipとハードコードされており、インストーラーのバージョン名も386_"$ver"となっていました。
    • 変更後は、これらのハードコードされた386の部分が、環境変数$GOARCHに置き換えられました。具体的には、ZIPファイル名はgowin$GOARCH_"$ver".zipに、インストーラーのバージョン名は$GOARCH_"$ver"に変更されました。
    • この変更により、スクリプトを実行する前にGOARCH環境変数を386またはamd64に設定することで、それぞれに対応するアーキテクチャのパッケージが動的に生成されるようになりました。例えば、GOARCH=amd64と設定してスクリプトを実行すれば、gowinamd64_"$ver".zipというファイル名で64ビット版のパッケージが生成されます。

これらの変更は、Go言語のWindows向けビルドおよびパッケージングプロセスにおけるGOARCHの利用を標準化し、32ビットと64ビットの両方のアーキテクチャをシームレスにサポートするための重要なステップでした。

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

diff --git a/misc/windows/README b/misc/windows/README
index a7e0d3fc4b..45cd0df8b9 100644
--- a/misc/windows/README
+++ b/misc/windows/README
@@ -11,12 +11,9 @@ Unzip and place 7za.exe in msys\' bin directory.\
 \
 Packaging
 =========
-1) have a go tree at $GOROOT
-2) make sure $GOBIN=$GOROOT\\bin is empty
-3) select appropriate version "hg up -r ..."\
-4) build go "cd $GOROOT/src; ./all.bash"\
-5) create Windows packages "cd $GOROOT/misc/windows; ./package.bash"\
-\
-\
-\
-\
+- have a go tree at $GOROOT
+- make sure $GOBIN=$GOROOT\\bin or is empty
+- make sure $GOARCH=386 or $GOARCH=amd64
+- select appropriate version "hg up -r ..."\
+- build go "cd $GOROOT/src; ./all.bash"\
+- create Windows packages "cd $GOROOT/misc/windows; ./package.bash"\
diff --git a/misc/windows/package.bash b/misc/windows/package.bash
index 92e9093171..99670e8542 100755
--- a/misc/windows/package.bash
+++ b/misc/windows/package.bash
@@ -36,9 +36,9 @@ cp -a ../../pkg go/pkg\
 cp -a ../../bin go/bin\
 \
 echo "%%%%% Starting zip packaging %%%%%" 1>&2\
-7za a -tzip -mx=9 gowin386"_"ver.zip "go/" >/dev/null\
+7za a -tzip -mx=9 gowin$GOARCH"_"ver.zip "go/" >/dev/null\
 \
 echo "%%%%% Starting installer packaging %%%%%" 1>&2\
-"$ISCC" //dAppName=Go //dAppVersion=386"_"ver //dAppNameLower=go installer.iss  >/dev/null\
+"$ISCC" //dAppName=Go //dAppVersion=$GOARCH"_"ver //dAppNameLower=go installer.iss  >/dev/null\
 \
 \

コアとなるコードの解説

misc/windows/README の変更

  • 変更前:

    -2) make sure $GOBIN=$GOROOT\\bin is empty
    -3) select appropriate version "hg up -r ..."
    -4) build go "cd $GOROOT/src; ./all.bash"
    -5) create Windows packages "cd $GOROOT/misc/windows; ./package.bash"
    

    この部分では、GOBINが空であることを要求し、特定のアーキテクチャに関する言及はありませんでした。

  • 変更後:

    +- make sure $GOBIN=$GOROOT\\bin or is empty
    +- make sure $GOARCH=386 or $GOARCH=amd64
    +- select appropriate version "hg up -r ..."
    +- build go "cd $GOROOT/src; ./all.bash"
    +- create Windows packages "cd $GOROOT/misc/windows; ./package.bash"
    
    • GOBINに関する記述が「空であるか、または$GOROOT\binであること」に緩和されました。これは、GoのビルドシステムがデフォルトでGOBIN$GOROOT\binに設定する場合があるため、その状態でもパッケージングプロセスが中断しないようにするためです。
    • 新たに「$GOARCH=386または$GOARCH=amd64であることを確認する」という重要な指示が追加されました。これにより、ユーザーはパッケージング前にGOARCH環境変数を適切に設定する必要があることが明確になり、32ビット版と64ビット版のどちらのパッケージも生成できることが示唆されています。

misc/windows/package.bash の変更

  • ZIPファイル名の変更:

    • 変更前: 7za a -tzip -mx=9 gowin386"_"ver.zip "go/" >/dev/null
      • ZIPファイル名がgowin386_"$ver".zipとハードコードされており、常に32ビット版のパッケージ名が生成されていました。
    • 変更後: 7za a -tzip -mx=9 gowin$GOARCH"_"ver.zip "go/" >/dev/null
      • 386の部分が環境変数$GOARCHに置き換えられました。これにより、GOARCHの値に応じて動的にファイル名が決定されます。例えば、GOARCH=amd64であればgowinamd64_"$ver".zipが生成されます。
  • インストーラーバージョン名の変更:

    • 変更前: "$ISCC" //dAppName=Go //dAppVersion=386"_"ver //dAppNameLower=go installer.iss >/dev/null
      • Inno Setup Compiler (ISCC) に渡されるアプリケーションバージョン名が386_"$ver"とハードコードされていました。
    • 変更後: "$ISCC" //dAppName=Go //dAppVersion=$GOARCH"_"ver //dAppNameLower=go installer.iss >/dev/null
      • 同様に、386の部分が環境変数$GOARCHに置き換えられました。これにより、インストーラーのバージョン名もGOARCHの値に連動するようになり、生成されるインストーラーがどのアーキテクチャ向けであるかを明確に示せるようになりました。

これらの変更は、Go言語のWindows向けパッケージングプロセスをアーキテクチャに依存しない汎用的なものにするための、シンプルかつ効果的な修正です。環境変数GOARCHを活用することで、スクリプトの再利用性が高まり、将来的なアーキテクチャの追加にも対応しやすくなりました。

関連リンク

参考にした情報源リンク