使用xcode,如何从命令输出定义预处理器宏?

mic*_*ael 7 macros xcode preprocessor

正如主题所说,我希望能够在构建期间运行特定命令,并使其输出成为预处理器宏的定义.

现在,我有几个用户定义的变量(在project.pbxproj中),我可以使用它们的值来填充宏定义,如下所示:

GCC_PREPROCESSOR_DEFINITIONS =(
"STRINGIFY(x)= @#x",
"_ MACRO = STRINGIFY($ {MACRO})",
);
MACRO = foo;

我可以将MACRO设置为每个方案不同的值(例如Debug vs. Release),这非常有用.但是,我无法弄清楚如何通过运行命令来设置它.

djr*_*ero 11

我可以想到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
Run Code Online (Sandbox Code Playgroud)

在我的测试中,您需要一个空头文件才能正确编译.还有其他选项,例如使用sed或任何其他命令修改现有文件.

自定义构建规则:处理输入文件并创建输出文件的自定义脚本.与Run Script构建阶段类似,但略好一些,因为只有在修改输入文件时才会运行脚本.例如,创建一个.macro文件并对其进行处理以更新头文件.

在Xcode> Target> Build规则中,添加新的自定义规则.

流程:*.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
Run Code Online (Sandbox Code Playgroud)

输出文件:$(SRCROOT)/Project.h

Project.macro包含对MACRO=one-liner-command.像这两个无意义的例子:

COMMIT=git log --pretty=format:%h -n 1
BUILDYEAR=date +%Y
Run Code Online (Sandbox Code Playgroud)

生成的文件如下所示:

// Do not edit
#define COMMIT @"c486178"
#define BUILDYEAR @"2011"
// Updated on Sat Oct 29 14:40:41 CEST 2011
Run Code Online (Sandbox Code Playgroud)

每次Project.macro更改时,生成的标头都将更新.