[インデックス 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環境で動作するようになり、ユーザーエクスペリエンスが向上しました。
前提知識の解説
このコミットの変更内容を理解するためには、以下の前提知識が役立ちます。
- Xcode: Appleが提供するmacOS、iOS、watchOS、tvOSアプリケーション開発のための統合開発環境(IDE)です。C、C++、Objective-C、Swiftなどの言語をサポートし、デバッグ、UIデザイン、パフォーマンス分析などの機能を提供します。
- Xcodeのプラグイン/拡張機能: Xcodeは、その機能を拡張するためのメカニズムを提供しています。これにより、サードパーティの開発者が新しい言語のサポート、カスタムツール、ワークフローの改善などを追加できます。Go言語のシンタックスハイライトも、このような拡張機能の一つとして扱われます。
DVTFoundation.xcplugindata
: Xcodeの内部構造の一部であり、プラグインや言語仕様に関するメタデータが記述されているファイルです。Xcodeがどのファイルタイプをどの言語として認識し、どのようにシンタックスハイライトを適用するかなどの情報が含まれています。このファイルを適切に編集することで、Xcodeに新しい言語のサポートを追加できます。xcode-select
コマンド: macOSに標準で搭載されているコマンドラインツールです。複数のXcodeバージョンがインストールされている環境で、どのXcodeをコマンドラインツール(gcc
,make
など)のデフォルトとして使用するかを設定・確認するために使われます。xcode-select --print-path
: 現在アクティブなXcodeのDeveloperディレクトリのパスを出力します。例えば、/Applications/Xcode.app/Contents/Developer
のようなパスが返されます。xcode-select --install
: コマンドライン開発者ツールをインストールします。
- シェルスクリプト: 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
コマンドの利用可能性をチェックし、利用可能であればその出力に基づいて動的にパスを構築します。
-
xcode-select
の存在チェック:if type "xcode-select" > /dev/null; then # ... fi
type "xcode-select"
は、xcode-select
コマンドがシステムパス上に存在するかどうかを確認します。> /dev/null
は、コマンドの標準出力を破棄し、エラー出力のみを考慮することで、コマンドの存在チェックを効率的に行います。コマンドが存在すればif
ブロック内の処理が実行されます。 -
アクティブなDeveloperディレクトリの取得:
DVTFOUNDATION_DIR=`xcode-select --print-path`
xcode-select --print-path
は、現在システムでアクティブになっているXcodeのDeveloperディレクトリのパスを返します。例えば、/Applications/Xcode.app/Contents/Developer
のようなパスです。 -
DVTFoundation.framework
の検索:DVTFoundation.xcplugindata
はDVTFoundation.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
の絶対パスが取得されます。
-
最終的な
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
変数の設定ロジックです。
-
既存のデフォルトパス: 変更前は、
DVTFOUNDATION_DIR
が/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/
にハードコードされていました。これは、xcode-select
が利用できない場合のフォールバックパスとして残されています。 -
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 #5997: https://code.google.com/p/go/issues/detail?id=5997 (このコミットが修正した問題のトラッカー)
- Go CL 12741047: https://golang.org/cl/12741047 (このコミットに対応するGerrit Change-ID)
- Xcode: https://developer.apple.com/xcode/
- xcode-select man page:
man xcode-select
(macOSのターミナルで実行)
参考にした情報源リンク
- 上記の「関連リンク」セクションに記載されたGoのIssueおよびCLのページ。
xcode-select
コマンドの公式ドキュメント(man xcode-select
)。- 一般的なシェルスクリプトの構文とコマンドに関する知識。
- Xcodeのファイルシステム構造とプラグインメカニズムに関する一般的な情報。
find
コマンドの利用方法に関する情報。type
コマンドの利用方法に関する情報。