Я могу придумать 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
или любой другой команды.
Правило пользовательской сборки : Пользовательский сценарий, который обрабатывает входной файл и создает выходной файл. Аналогично Run Script фаза сборки, но немного лучше, потому что он будет запускать скрипт только после изменения входного файла. Например, создайте файл .macro
и обработайте его для обновления файла заголовка.
В Xcode> Target> Build rules добавьте новое пользовательское правило.
Процесс : *.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
изменяется, сгенерированный заголовок будет обновляться.