JPMartha's Pancake

This blog is the way to brush up my poor English.

Xcode の Run Script について調べたこと ?

Updated: 2016-04-08

この記事Carthageextract-tool について書いたあといくつか疑問が残ったので調べました。

github.com

サンプル

こちらの 自作ツール をサンプルとします。

github.com

f:id:JPMartha:20160218041506p:plain

Shell

.(ドット)とは

. scripts/extract-tool
  • . FILENAME

    カレントシェルでコマンドを実行します。

    見た目わかりづらいですが .(ドット) + 半角スペース + scripts/extract-tool になっています。

    ?2016-04-08追記: こうしないと呼び出し側に結果を渡せません。

Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename. If filename does not contain a slash, file names in PATH are used to find the directory containing filename. The file searched for in PATH need not be executable. When bash is not in posix mode, the current directory is searched if no file is found in PATH.

bash(1) Mac OS X Manual Page

Input Files, Output Files

?2016-04-08追記: コマンドの出力を Input Files ? Run Script ? Output Files と渡します。

ビルドしたときの出力に次の内容が含まれます。

export SCRIPTS_FOLDER_PATH=pancake.app/Contents/Resources/Scripts

export SCRIPT_INPUT_FILE_0=/…略…/Release/pancake.app/Contents/MacOS/pancake

export SCRIPT_INPUT_FILE_COUNT=1

export SCRIPT_OUTPUT_FILE_0=/…略…/Release/pancake

export SCRIPT_OUTPUT_FILE_COUNT=1

ただシェルスクリプトを単独で実行($ . scripts/extract-tool)すると次のとおり変数が空でコピーできません。

cp: / and / are identical (not copied).

Input Files とは

$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)

サンプルでは /…略…/Release/pancake.app/Contents/MacOS/pancake です。

削除しても extract-tool は実行されますが SCRIPT_INPUT_FILE_0 がなく SCRIPT_INPUT_FILE_COUNT=0 になります。

export SCRIPTS_FOLDER_PATH=pancake.app/Contents/Resources/Scripts

export SCRIPT_INPUT_FILE_COUNT=0

export SCRIPT_OUTPUT_FILE_0=/…略…/Release/pancake

export SCRIPT_OUTPUT_FILE_COUNT=1

Output Files とは

$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_NAME)

サンプルでは /…略…/Release/pancake です。

削除しても extract-tool は実行されますが SCRIPT_OUTPUT_FILE_0 がなく SCRIPT_OUTPUT_FILE_COUNT=0 になります。

export SCRIPTS_FOLDER_PATH=pancake.app/Contents/Resources/Scripts

export SCRIPT_INPUT_FILE_0=/…略…/Release/pancake.app/Contents/MacOS/pancake

export SCRIPT_INPUT_FILE_COUNT=1

export SCRIPT_OUTPUT_FILE_COUNT=0

BUILT_PRODUCTS_DIR

ビルドしたときに Products のファイルを生成するフォルダです。

サンプルでは /…略…/Release になります。

Build Configuration を Release にしているためで Debug だと /…略…/Debug になります。

Directory path. Identifies the directory under which all the product’s files can be found. This directory contains either product files or symbolic links to them. Run Script build phases can use the value of this build setting as a convenient way to refer to the product files built by one or more targets even when these files are scattered throughout a directory hierarchy (for example, when DEPLOYMENT_LOCATION is set to YES.

Build Setting Reference

EXECUTABLE_PATH

サンプルでは pancake.app/Contents/MacOS です。

Bundle directory path. Specifies the path to the binary the target produces within its bundle.

Build Setting Reference

EXECUTABLE_NAME

サンプルでは pancake です。

Filename. Specifies the name of the binary the target produces.

Build Setting Reference

Run script

チェック項目があれば試したくなりますよね。?

デフォルトでは次のようになっています。

f:id:JPMartha:20160218124613p:plain

? Show environment variables in build log が ON のとき〜

f:id:JPMartha:20160218185401p:plain

以下長々と続きます。

? OFF のとき〜

f:id:JPMartha:20160218124910p:plain

f:id:JPMartha:20160218185955p:plain

? Run script only when installing が OFF のとき〜

この記事 のとおり Build したときに実行されます。

f:id:JPMartha:20160218191728p:plain

? ON のとき〜

f:id:JPMartha:20160218123052p:plain

Build しても Run custom shell script 'Extract CLI Tool' が実行されません。

f:id:JPMartha:20160218191410p:plain

$ make install コマンドを実行します。

  • 出力結果(一部)

いつRunするの?

/…略…/Release/pancake.app/Contents/MacOS/pancake -> /…略…/Release/pancake

シェルスクリプトecho "いつRunするの?" を追記していたので実行されたことがわかります。

参考