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

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

このコミットは、Go言語のXcodeサポートスクリプトである misc/xcode/4/go4xcode.sh の改善に関するものです。具体的には、Xcodeのインストールパスを動的に特定するために xcode-select コマンドを利用するように変更し、スクリプトの堅牢性を向上させています。

コミット

commit 47ecd52377f66d665060b2d05a447f2b970cda95
Author: Emil Hessman <c.emil.hessman@gmail.com>
Date:   Tue Aug 20 20:48:29 2013 +1000

    misc/xcode: use `xcode-select` to determine path
    
    If xcode-select is available, use it to determine the path to the
    DVTFoundation.xcplugindata file.
    
    Fixes #5997.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/12741047

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

https://github.com/golang/go/commit/47ecd52377f66d665060b2d05a447f2b970cda95

元コミット内容

このコミットは、Go言語のXcodeサポートスクリプト misc/xcode/4/go4xcode.sh を修正し、DVTFoundation.xcplugindata ファイルのパスを特定する際に、ハードコードされたパスではなく xcode-select コマンドを使用するように変更しました。これにより、Xcodeのインストール環境に依存しない、より柔軟なパス解決が可能になりました。この変更は、Issue #5997 で報告された問題を解決します。

変更の背景

Go言語のソースコードには、XcodeでGo言語のシンタックスハイライトを有効にするためのシェルスクリプト misc/xcode/4/go4xcode.sh が含まれていました。このスクリプトは、Xcodeの内部ファイルである DVTFoundation.xcplugindata を変更することで、Go言語の仕様をXcodeに認識させていました。

しかし、このスクリプトの以前のバージョンでは、DVTFoundation.xcplugindata が存在するディレクトリ (DVTFOUNDATION_DIR) が /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/ のようにハードコードされていました。

このハードコードされたパスは、Xcodeのバージョンやインストール場所によって異なる場合があり、ユーザーの環境によってはスクリプトが正しく動作しないという問題が発生していました(Issue #5997)。例えば、Xcodeが /Applications 以外の場所にインストールされている場合や、異なるバージョンのXcodeが使用されている場合などです。

この問題を解決するため、コミットは xcode-select コマンドを利用して、現在アクティブなXcodeのインストールパスを動的に取得し、それに基づいて DVTFoundation.xcplugindata の正確なパスを特定するように変更されました。これにより、スクリプトはより多くのXcode環境で動作するようになり、ユーザーエクスペリエンスが向上しました。

前提知識の解説

このコミットの変更内容を理解するためには、以下の前提知識が役立ちます。

  1. Xcode: Appleが提供するmacOS、iOS、watchOS、tvOSアプリケーション開発のための統合開発環境(IDE)です。C、C++、Objective-C、Swiftなどの言語をサポートし、デバッグ、UIデザイン、パフォーマンス分析などの機能を提供します。
  2. Xcodeのプラグイン/拡張機能: Xcodeは、その機能を拡張するためのメカニズムを提供しています。これにより、サードパーティの開発者が新しい言語のサポート、カスタムツール、ワークフローの改善などを追加できます。Go言語のシンタックスハイライトも、このような拡張機能の一つとして扱われます。
  3. DVTFoundation.xcplugindata: Xcodeの内部構造の一部であり、プラグインや言語仕様に関するメタデータが記述されているファイルです。Xcodeがどのファイルタイプをどの言語として認識し、どのようにシンタックスハイライトを適用するかなどの情報が含まれています。このファイルを適切に編集することで、Xcodeに新しい言語のサポートを追加できます。
  4. xcode-select コマンド: macOSに標準で搭載されているコマンドラインツールです。複数のXcodeバージョンがインストールされている環境で、どのXcodeをコマンドラインツール(gcc, make など)のデフォルトとして使用するかを設定・確認するために使われます。
    • xcode-select --print-path: 現在アクティブなXcodeのDeveloperディレクトリのパスを出力します。例えば、/Applications/Xcode.app/Contents/Developer のようなパスが返されます。
    • xcode-select --install: コマンドライン開発者ツールをインストールします。
  5. シェルスクリプト: Unix/Linux系のオペレーティングシステムで、コマンドの実行や自動化を行うためのスクリプト言語です。このコミットで変更されている go4xcode.sh はBashシェルスクリプトであり、if 文、type コマンド、find コマンド、変数操作などの基本的なシェルスクリプトの知識が必要です。
    • type command: 指定されたコマンドがどのように解釈されるか(エイリアス、関数、組み込みコマンド、ファイルパスなど)を表示します。type "xcode-select" > /dev/null は、xcode-select コマンドがシステムに存在するかどうかをチェックする一般的な方法です。
    • find path -name pattern: 指定されたパス以下で、特定のパターンに一致するファイルやディレクトリを検索します。

技術的詳細

このコミットの主要な技術的変更は、go4xcode.sh スクリプトが DVTFoundation.xcplugindata ファイルのパスを決定する方法を改善した点にあります。

以前のスクリプトでは、DVTFOUNDATION_DIR 変数が以下のようにハードコードされていました。

DVTFOUNDATION_DIR="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"

このパスは、Xcodeの標準的なインストール場所を前提としていましたが、ユーザーがXcodeを別の場所にインストールした場合や、将来のXcodeのバージョンで内部パス構造が変更された場合に問題を引き起こす可能性がありました。

新しい実装では、xcode-select コマンドの利用可能性をチェックし、利用可能であればその出力に基づいて動的にパスを構築します。

  1. xcode-select の存在チェック:

    if type "xcode-select" > /dev/null; then
        # ...
    fi
    

    type "xcode-select" は、xcode-select コマンドがシステムパス上に存在するかどうかを確認します。> /dev/null は、コマンドの標準出力を破棄し、エラー出力のみを考慮することで、コマンドの存在チェックを効率的に行います。コマンドが存在すれば if ブロック内の処理が実行されます。

  2. アクティブなDeveloperディレクトリの取得:

    DVTFOUNDATION_DIR=`xcode-select --print-path`
    

    xcode-select --print-path は、現在システムでアクティブになっているXcodeのDeveloperディレクトリのパスを返します。例えば、/Applications/Xcode.app/Contents/Developer のようなパスです。

  3. DVTFoundation.framework の検索: DVTFoundation.xcplugindataDVTFoundation.framework の内部に存在するため、まずこのフレームワークのパスを特定する必要があります。

    DVTFOUNDATION_DIR+="/.."
    FRAMEWORK_NAME="DVTFoundation.framework"    
    DVTFOUNDATION_DIR=`find $DVTFOUNDATION_DIR -name $FRAMEWORK_NAME -print`
    
    • DVTFOUNDATION_DIR+="/..": xcode-select --print-path が返すパスは通常 .../Contents/Developer です。DVTFoundation.framework.../Contents/SharedFrameworks の下に存在するため、まずパスを一つ上の階層(.../Contents)に移動させます。
    • find $DVTFOUNDATION_DIR -name $FRAMEWORK_NAME -print: find コマンドを使用して、DVTFOUNDATION_DIR(この時点では .../Contents)以下から DVTFoundation.framework という名前のディレクトリを検索します。これにより、DVTFoundation.framework の絶対パスが取得されます。
  4. 最終的な Resources ディレクトリのパス構築:

    DVTFOUNDATION_DIR+="/Versions/A/Resources"
    

    DVTFoundation.framework のパスが特定された後、その内部にある Versions/A/Resources ディレクトリのパスを結合します。この Resources ディレクトリ内に DVTFoundation.xcplugindata が存在します。

この一連の処理により、xcode-select が利用可能な環境では、Xcodeのインストール場所がどこであっても DVTFoundation.xcplugindata の正確なパスを動的に特定できるようになりました。これにより、スクリプトの移植性と堅牢性が大幅に向上しています。

また、スクリプトのコメントも更新され、xcode-select の利用について言及し、Xcode 4.x だけでなく「Xcode 4+」に対応していることを明確にしています。バックアップメッセージもより詳細になりました。

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

変更は misc/xcode/4/go4xcode.sh ファイルに集中しています。

--- a/misc/xcode/4/go4xcode.sh
+++ b/misc/xcode/4/go4xcode.sh
@@ -3,7 +3,7 @@
  # Use of this source code is governed by a BSD-style
  # license that can be found in the LICENSE file.
  
-# Illustrates how a Go language specification can be installed for Xcode 4.x.,
+# Illustrates how a Go language specification can be installed for Xcode 4+,
  # to enable syntax coloring, by adding an entry to a plugindata file.\
  #
  # FIXME: Write a decent Xcode plugin to handle the file type association and\
@@ -14,21 +14,33 @@ set -e
  # Assumes Xcode 4+.\
  XCODE_MAJOR_VERSION=`xcodebuild -version | awk 'NR == 1 {print substr($2,1,1)}'`
  if [ "$XCODE_MAJOR_VERSION" -lt "4" ]; then
-\techo "Xcode 4.x not found."
+\techo "Xcode 4+ not found."
  \texit 1
  fi
  \
-# DVTFOUNDATION_DIR may vary depending on Xcode setup. Change it to reflect
-# your current Xcode setup. Find suitable path with e.g.:
+# DVTFOUNDATION_DIR may vary depending on Xcode setup. If Xcode has installed
+# the `xcode-select` command, it will be determined automatically. Otherwise,
+# change it to reflect your current Xcode setup. Find suitable path with e.g.:
  #
  #\tfind / -type f -name 'DVTFoundation.xcplugindata' 2> /dev/null
  #
-# Example of DVTFOUNDATION_DIR's from "default" Xcode 4.x setups;
+# Example of DVTFOUNDATION_DIR's from "default" Xcode 4+ setups;
  #
  #\tXcode 4.1: /Developer/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/
  #\tXcode 4.3: /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/
-#
+\
+# Defaults to Xcode 4.3's DVTFOUNDATION_DIR. Path is modified automatically if
+# `xcode-select` command is available, as mentioned above.
  DVTFOUNDATION_DIR="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"
+\
+if type "xcode-select" > /dev/null; then
+    DVTFOUNDATION_DIR=`xcode-select --print-path`
+    DVTFOUNDATION_DIR+="/.."
+    FRAMEWORK_NAME="DVTFoundation.framework"    
+    DVTFOUNDATION_DIR=`find $DVTFOUNDATION_DIR -name $FRAMEWORK_NAME -print`
+    DVTFOUNDATION_DIR+="/Versions/A/Resources"
+fi
+\
  PLUGINDATA_FILE="DVTFoundation.xcplugindata"
  \
  PLISTBUDDY=/usr/libexec/PlistBuddy
@@ -84,7 +96,7 @@ GO_LANG_ENTRY="\
  \t</plist>\
  "\
  \
-echo "Backing up plugindata file."
+echo "Backing up plugindata file (copied to $PLUGINDATA_FILE.bak)."
  cp $DVTFOUNDATION_DIR/$PLUGINDATA_FILE $DVTFOUNDATION_DIR/$PLUGINDATA_FILE.bak
  \
  echo "Adding Go language specification entry."

コアとなるコードの解説

変更の核となるのは、DVTFOUNDATION_DIR 変数の設定ロジックです。

  1. 既存のデフォルトパス: 変更前は、DVTFOUNDATION_DIR/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/ にハードコードされていました。これは、xcode-select が利用できない場合のフォールバックパスとして残されています。

  2. xcode-select を利用した動的なパス解決:

    if type "xcode-select" > /dev/null; then
        DVTFOUNDATION_DIR=`xcode-select --print-path`
        DVTFOUNDATION_DIR+="/.."
        FRAMEWORK_NAME="DVTFoundation.framework"    
        DVTFOUNDATION_DIR=`find $DVTFOUNDATION_DIR -name $FRAMEWORK_NAME -print`
        DVTFOUNDATION_DIR+="/Versions/A/Resources"
    fi
    

    この if ブロックが追加されました。

    • type "xcode-select" > /dev/null: xcode-select コマンドがシステムに存在するかどうかをチェックします。
    • DVTFOUNDATION_DIR=\xcode-select --print-path`: xcode-select が存在する場合、現在アクティブなXcodeのDeveloperディレクトリのパスを取得し、DVTFOUNDATION_DIR` に設定します。
    • DVTFOUNDATION_DIR+="/..": 取得したパスから一つ上のディレクトリに移動します。これは、DVTFoundation.framework がDeveloperディレクトリの親ディレクトリ(通常は Contents)の下にあるためです。
    • FRAMEWORK_NAME="DVTFoundation.framework": 検索対象のフレームワーク名を定義します。
    • DVTFOUNDATION_DIR=\find $DVTFOUNDATION_DIR -name $FRAMEWORK_NAME -print`: find コマンドを使って、DVTFOUNDATION_DIR(この時点では Contentsディレクトリ)以下からDVTFoundation.frameworkを検索し、その絶対パスをDVTFOUNDATION_DIR` に再設定します。
    • DVTFOUNDATION_DIR+="/Versions/A/Resources": 最後に、DVTFoundation.framework のパスに Versions/A/Resources を追加し、DVTFoundation.xcplugindata が存在する最終的なディレクトリパスを完成させます。

この変更により、スクリプトはXcodeのインストール環境に柔軟に対応できるようになり、より多くのユーザー環境でGo言語のシンタックスハイライト設定が成功するようになりました。

また、以下のコメントと出力メッセージも更新されています。

  • スクリプトの目的を示すコメントが「Xcode 4.x」から「Xcode 4+」に修正され、より広範なバージョンに対応していることを示唆しています。
  • Xcodeのバージョンチェックメッセージも「Xcode 4.x not found.」から「Xcode 4+ not found.」に変更されています。
  • バックアップファイルのメッセージが「Backing up plugindata file.」から「Backing up plugindata file (copied to $PLUGINDATA_FILE.bak).」に変更され、より詳細な情報を提供するようになりました。

関連リンク

参考にした情報源リンク

  • 上記の「関連リンク」セクションに記載されたGoのIssueおよびCLのページ。
  • xcode-select コマンドの公式ドキュメント(man xcode-select)。
  • 一般的なシェルスクリプトの構文とコマンドに関する知識。
  • Xcodeのファイルシステム構造とプラグインメカニズムに関する一般的な情報。
  • find コマンドの利用方法に関する情報。
  • type コマンドの利用方法に関する情報。