まず、プリプロセッサ変数の代わりにプレーンな文字列を使用すると、環境変数を文字列に読み込むことを忘れないでください。あなたはプリプロセッサ変数を持っている必要がある場合は、例えば、
#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を理解しておらず、それを却下しています)。