我可以想到三个选项:
环境变量:如果你从命令行构建,你可以在调用构建命令之前导出一个变量(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 > 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=一行命令
。例如这两个毫无意义的例子:
COMMIT=git log --pretty=format:%h -n 1
BUILDYEAR=date +%Y
生成的文件将如下所示:
// Do not edit
// Updated on Sat Oct 29 14:40:41 CEST 2011
每次
Project.macro
更改时,生成的头文件将会更新。