Как я могу #ifdef переменную среды без изменения проекта Xcode?

Я хочу обнаружить переменную среды вне настроек Xcode. Я могу сделать это во время выполнения, проверяя среду, как указано в Определить, запущено ли приложение iOS в отладчике, но есть ли способ сделать это с помощью макроса препроцессора, подобного этому?

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

Моя переменная среды установлена, но она не достигает фазы компиляции файлов .m. Я хочу сделать это, не изменяя макропеременную препроцессора проекта, потому что я хочу, чтобы компиляция была разной для каждого пользователя, и им не нужно было ее изменять.


person Grzegorz Adam Hankiewicz    schedule 20.10.2011    source источник


Ответы (2)


Нет. Компиляция намеренно является детерминированным процессом и не зависит от внешней среды. Единственный способ, которым я знаю, чтобы компиляция отличалась в зависимости от того, кто компилирует, — это через предпочтение «Исходные деревья» в Xcode, и это явно предназначено для пользователей, чтобы хранить исходные деревья в разных местах на разных машинах, но чтобы настройка сборки была одинаковой (потому что это может ссылаться на местоположение исходного дерева, заданное в настройках).

person Lily Ballard    schedule 20.10.2011

Во-первых, не забудьте 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)
}

Если вам нужна переменная препроцессора, оболочка может установить ее при вызове компилятора, используя стандартные для POSIX флаги -D или -U. К сожалению, простой

gcc -DUSER_GRADHA=$USER_GRADHA file.c

вероятно, вызовет у вас проблемы, потому что, если переменная среды не определена, у вас будет пустая, но определенная переменная препроцессора. Поэтому может быть проще всего использовать условную оболочку, например

if [ $USER_GRADHA ] ; then ug="-D$USER_GADHA"; else ug="-U$USER_GRADHA"; fi
c99 $ug file.c

Это легко реализовать в make-файле или во многих других видах ловушек для выполнения произвольного кода оболочки для компиляции.

Наконец, всегда есть Autotools, который предназначен именно для этой задачи компиляции на основе информации об окружении. Вы спрашивали о Xcode, поэтому Autotools может не соответствовать вашему рабочему процессу (и многие люди не понимают Autotools и отвергают его сразу), но он есть, если вы хотите.

person bk.    schedule 27.01.2016