如何#ifdef环境变量而不更改Xcode项目?

时间:2011-10-20 21:47:23

标签: objective-c ios xcode environment-variables

我想检测Xcode设置之外的环境变量。我可以在运行时检查Detecting if iOS app is run in debugger中指定的环境,但有没有办法用这样的预处理器宏来做?

#ifdef USER_GRADHA
    // do some stuff
#else
    // do other stuff
#endif

我的环境变量已设置,但未到达.m文件的编译阶段。我想在不必修改项目的预处理器宏变量的情况下完成此操作,因为我希望每个用户的编译都不同,而不必修改它。

2 个答案:

答案 0 :(得分:2)

没有。编译非常有意为确定性过程,并不依赖于外部环境。我知道编译的唯一方法是根据编译者的不同来自Xcode中的Source Trees首选项,这明确是为了让用户将源树保存在不同机器上的不同位置,但是构建设置是相同的(因为它可以参考首选项中设置的源树位置。

答案 1 :(得分:0)

首先,如果您可以使用普通字符串而不是预处理器变量,则不要忘记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并且无法解决它),但如果您需要它,那就在那里。