【问题标题】:How can I #ifdef an environment variable without changing Xcode project?如何在不更改 Xcode 项目的情况下 #ifdef 环境变量?
【发布时间】:2011-12-12 03:54:26
【问题描述】:
我想检测 Xcode 设置之外的环境变量。我可以在运行时检查Detecting if iOS app is run in debugger 中指定的环境,但是有没有办法使用这样的预处理器宏来做到这一点?
#ifdef USER_GRADHA
// do some stuff
#else
// do other stuff
#endif
我的环境变量已设置,但未达到 .m 文件的编译阶段。我想在不必修改项目的预处理器宏变量的情况下完成此操作,因为我希望每个用户的编译都不同,而不必修改它。
【问题讨论】:
标签:
objective-c
ios
xcode
environment-variables
【解决方案1】:
没有。编译是一个非常有意的确定性过程,不依赖于外部环境。我所知道的编译根据谁在编译而不同的唯一方法是通过 Xcode 中的 Source Trees 首选项,这明确旨在让用户将源树保存在不同机器上的不同位置但构建设置相同(因为它可以参考preferences中设置的源码树位置)。
【解决方案2】:
首先,不要忘记getenv 将环境变量读入字符串,如果您可以不使用纯字符串而不是预处理器变量的话。例如,
#include <stdlib.h>
char *ug = getenv("USER_GRADHA");
if (ug) {
//use the environment variable here
} else {
//it's NULL == undefined env variable (in all likelihood)
}
如果您需要一个预处理器变量,shell 可以在编译器调用时使用 POSIX 标准 -D 或 -U 标志设置一个。不幸的是,简单的
gcc -DUSER_GRADHA=$USER_GRADHA file.c
可能会给您带来麻烦,因为如果环境变量未定义,您将有一个空白但已定义的预处理器变量。所以使用shell条件可能是最简单的,比如
if [ $USER_GRADHA ] ; then ug="-D$USER_GADHA"; else ug="-U$USER_GRADHA"; fi
c99 $ug file.c
这很容易在 makefile 或许多其他类型的钩子中实现,以执行任意 shell 代码进行编译。
最后,总会有 Autotools,它专为这个基于环境信息的编译问题而设计。您询问了 Xcode,因此 Autotools 可能不适合您的工作流程(而且很多人不了解 Autotools 并且无法控制它),但如果您需要它,它就在那里。