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

标签 xcode macros preprocessor

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

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

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

我可以将 MACRO 设置为每个方案的不同值(例如调试与发布),这非常有用。但是,我不知道如何通过运行命令来设置它。

最佳答案

我能想到 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 > 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.hProject.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更改,生成的标题将被更新。

关于xcode - 使用 xcode,如何从命令的输出中定义预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933121/

相关文章:

objective-c - 如何在 iOS 中旋转时移动一个 UIView?

swift - 是否可以在 Swift 中禁用某些代码行?

c++ - 从编译器获取参数时,有没有办法避免预处理器宏?

ios - 带有 UIButton 的自定义 UITableView 单元不调用 didSelectRowAtIndexPath

ios - 创建开发人员配置文件但显示不合格

c - 宏未编译

c - C++ 的 C 预处理器宏中的 # 和 ## 意味着什么

c - 当宏在结构数组中时,如何将宏的名称转换为文字字符串?

c - 宏内容的长度有限制吗?

iphone - 您可以在 xcode 调试器中的任何位置看到 NSUserDefaults 的值吗?