2011-10-20 12 views
2

Xcodeの設定以外の環境変数を検出したい。私は実行時にDetecting if iOS app is run in debuggerで指定されたような環境をチェックすることができますが、このようなプリプロセッサマクロで行う方法はありますか?Xcodeプロジェクトを変更せずに環境変数を#ifdefする方法はありますか?

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

私の環境変数は設定されていますが、.mファイルのコンパイル段階に達していません。私は、プロジェクトのプリプロセッサマクロ変数を変更しなくても、これを達成したいと思っています。なぜなら、各ユーザのためにコンパイルを変更する必要がなくなりたいからです。

答えて

2

いいえ、コンパイルは非常に意図的に決定的なプロセスであり、外部環境に依存しません。私が知っているのは、誰がコンパイルするのかを知る唯一の方法は、Xcodeのソースツリー環境設定を使用することです。これは、ソースツリーを別々のマシン上の別々の場所に保存し、ビルド設定を同じにする設定で設定されているソースツリーの場所を参照できます)。

0

まず、プリプロセッサ変数の代わりにプレーンな文字列を使用すると、環境変数を文字列に読み込むことを忘れないでください。あなたはプリプロセッサ変数を持っている必要がある場合は、例えば、

#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フラグを使用して、コンパイラの起動時の1を設定することができます。残念ながら、簡単な

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 

のように、条件付きのシェルを使用するのが最も簡単かもしれこれは、コンパイルのための任意のシェルコードを実行するために、メイクファイルまたはフックの他の多くの種類の中で実装することは容易です。

最後に、環境に関する情報に基づいてこの問題を正確に解決するために設計されたAutotoolsが常にあります。あなたはXcodeについて尋ねましたので、Autotoolsはあなたのワークフローに合わないかもしれません(そして、多くの人がAutotoolsを理解しておらず、それを却下しています)。

関連する問題