私は3つのオプションを考えることができます:
環境変数:あなたは、コマンドラインからビルドする場合は、ビルドコマンドを呼び出す前に、変数(export ENVMACRO=superfoo
)をエクスポートし、Xcodeの設定ファイルOTHER_CFLAGS=-DMACRO=$(ENVMACRO)
でそれを使用することができます。ターゲットを.xcconfig
ファイルで設定する必要があります。
実行スクリプト作成フェーズ:ヘッダーファイルを生成するカスタムスクリプト。
MACROVALUE=$(run-command-to-obtain-value)
echo "#define MACRO ($MACROVALUE)" > $(SRCROOT)/path/to/header.h
私のテストでは、正しくコンパイルするためには、空のヘッダファイルが必要です。 sed
または他のコマンドを使用して既存のファイルを変更するなどの他のオプションがあります。
カスタムビルドルール:入力ファイルを処理して出力ファイルを作成するカスタムスクリプト。 に似ています。スクリプトは、入力ファイルが変更されたときにのみスクリプトを実行するため、段階的に構築されていますが、やや優れています。たとえば、.macro
ファイルを作成し、それを処理してヘッダーファイルを更新します。
[Xcode]> [ターゲット]> [ビルドルール]で、新しいカスタムルールを追加します。
プロセス:*.macro
カスタムスクリプト:
HEADER="${SRCROOT}/Config.h"
cd ${SRCROOT}
echo "// Do not edit" > $HEADER
cat "${INPUT_FILE_PATH}" | while read line
do
macro="`echo $line | cut -d= -f1`"
cmd="`echo $line | cut -d= -f2-`"
value=$($cmd)
echo "#define ${macro} @\"${value}\"" >> $HEADER
done
echo "// Updated on "`date` >> $HEADER
出力ファイル:$(SRCROOT)/Project.h
Project.macro
がペアMACRO=one-liner-command
が含まれています。これら二つの非センス例のように:
COMMIT=git log --pretty=format:%h -n 1
BUILDYEAR=date +%Y
生成されたファイルは、次のようになります。
// Do not edit
#define COMMIT @"c486178"
#define BUILDYEAR @"2011"
// Updated on Sat Oct 29 14:40:41 CEST 2011
たびProject.macro
変化を、生成されたヘッダが更新されます。
ありがとう - 2番目の選択肢は本質的に私が行ったことです - 私の場合、私はすべてのビルドでコマンドを実行したい。唯一の皺は、その内容が(依存関係の変更を避けるために)新しく生成された内容と同じでない場合、私は実際のヘッダファイルに書き込まないということです。私は特に同様に3番目のオプションが好きです。 – michael