gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:56:20 28 4
gpt4 key购买 nike

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

现在,我有几个用户定义的变量(在 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.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更改,生成的标题将被更新。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com