我能想到 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 更改时,生成的标头都会更新。