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

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

コミット

このコミットは、Goプログラミング言語の初期ビルドシステムに関する重要な修正を行ったものです。Scott Lawrence(bytbox@gmail.com)によって2011年11月11日に行われ、env.bashスクリプトにおけるmake/gmakeの存在チェック機能を追加しました。

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

https://github.com/golang/go/commit/351daf878843dd782b8e42276f568d6130cf7c62

元コミット内容

commit 351daf878843dd782b8e42276f568d6130cf7c62
Author: Scott Lawrence <bytbox@gmail.com>
Date:   Fri Nov 11 14:56:18 2011 -0500

    env.bash: Check for presence of make/gmake
    
    Without this, a missing gmake will result in bogus error "Did not find
    Go environment variables".
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5369066

変更されたファイル

  • src/env.bash
    • 1行追加:$MAKE をPROGS配列に追加

変更の背景

2011年当時、Goプログラミング言語はまだ黎明期にあり、現在のような統合されたビルドシステム(go buildgo installコマンド)は存在していませんでした。代わりに、シェルスクリプトベースのビルドシステムが使用されており、env.bashスクリプトは必要なビルドツールの存在を確認する重要な役割を果たしていました。

この修正が行われる前、GNU makeが不足している環境では、実際の問題は「makeツールが見つからない」ことであるにも関わらず、「Go環境変数が見つからない」という誤解を招くエラーメッセージが表示されていました。これは開発者にとって非常に混乱を招く状況でした。

前提知識の解説

1. GNU makeとgmakeの違い

  • GNU make: GNUプロジェクトによって開発された、標準的なmakeツールの実装
  • gmake: 多くのUnixライクシステムでGNU makeを指すコマンド名
  • システムによって、GNU makeがmakeまたはgmakeとして利用可能

2. 2011年当時のGoビルドシステム

  • シェルスクリプトベース: make.bashall.bashenv.bashなどのスクリプトで構成
  • 依存関係管理: 必要なビルドツールの存在をスクリプトで確認
  • クロスコンパイル: 環境変数(GOOS、GOARCH)を使用してターゲットプラットフォームを指定

3. env.bashスクリプトの役割

env.bashは、Go開発環境の設定と検証を行うスクリプトで、以下の機能を持っていました:

  • 必要なビルドツールの存在確認
  • 環境変数の設定
  • プラットフォーム固有の設定

技術的詳細

PROGS配列の意味

env.bashスクリプト内のPROGS配列は、Goのビルドに必要な外部プログラムのリストを保持していました。この配列に含まれるプログラムは、ビルドプロセスの開始前に存在確認が行われます。

修正前の問題

# 修正前のPROGS配列(抜粋)
PROGS="
    gcc
    grep
    ls
    mkdir
    mv
    pwd
"

この状態では、$MAKE変数で指定されたmakeツールの存在確認が行われていませんでした。

修正後の状態

# 修正後のPROGS配列(抜粋)
PROGS="
    gcc
    grep
    ls
    $MAKE
    mkdir
    mv
    pwd
"

$MAKE変数を追加することで、環境に応じて適切なmakeツール(makeまたはgmake)の存在確認が行われるようになりました。

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

ファイル: src/env.bash

変更箇所: 22行目から28行目のPROGS配列定義

@@ -59,6 +59,7 @@ PROGS="
     gcc
     grep
     ls
+    $MAKE
     mkdir
     mv
     pwd

コアとなるコードの解説

1. $MAKE変数の動的解決

$MAKE変数は、実行時に現在の環境で利用可能なmakeツールに展開されます:

  • FreeBSDやOpenBSDでは通常gmake
  • Linuxでは通常make
  • macOSではmake(ただし、GNU makeがインストールされている場合はgmakeも利用可能)

2. 存在確認のメカニズム

env.bashスクリプトは、PROGS配列内の各プログラムに対して以下の処理を実行します:

  1. whichコマンドまたはtypeコマンドを使用してプログラムの存在確認
  2. 見つからない場合はエラーメッセージを出力
  3. 必要なプログラムがすべて揃っている場合のみビルドプロセスを継続

3. エラーハンドリングの改善

この修正により、makeツールが不足している場合に適切なエラーメッセージが表示されるようになりました:

修正前:

Error: Did not find Go environment variables

修正後:

Error: make (or gmake) not found

関連リンク

参考にした情報源リンク