通常、-Dname = valueオプションを使用して、「makeコマンドライン」から「makefile」にマクロ定義を渡します。定義は、メイクファイル内からアクセスできます。
同様のコンパイラオプション-Dname = value(多くのコンパイラでサポートされています)を使用して、「makefile」から「ソースコード」にマクロ定義を渡します。この定義は、ソースコードでアクセスできます。
ここで必要なのは、makefileのユーザーがmakefileを変更せずに、「make.exeコマンドライン」から「ソースコード」に任意のマクロ定義をすぐに渡せるようにすることです。
ユーザーは次のように入力できます:make -f mymakefile.mk -SOMEOPTION var = 5
次に、コードmain.cは直接varを見ることができます:
int main()
{
int i = var;
}
この方法でmake
コマンドを呼び出します。
make CFLAGS=-Dvar=42
Makefileのコンパイルコマンドで$(CFLAGS)
を必ず使用してください。 @jørgensenが言及したように、make
コマンドの後に変数の割り当てを置くと、Makefileで既に定義されているCFLAGS
値がオーバーライドされます。
または、CFLAGS
以外の変数に-Dvar=42
を設定し、CFLAGS
でこの変数を再利用して、CFLAGS
を完全にオーバーライドしないようにすることもできます。
そのために特定の変数を使用するだけです。
$ cat Makefile
all:
echo foo | gcc $(USER_DEFINES) -E -xc -
$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc -
...
one
$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc -
...
bar
$ make
echo foo | gcc -E -xc -
...
foo
Make this wayを呼び出します
make CFLAGS=-Dvar=42
これは、環境(Makefile変数に関して優先度が低い)だけでなく、MakefileのCFLAGSをオーバーライドするためです。
評判が低いため、受け入れられた答えにコメントすることはできません。
定義済みの変数CPPFLAGS
に言及したいと思います。 GNU Makeマニュアルでは次のように記述されているため、CFLAGS
やCXXFLAGS
よりも適切な場合があります。
Cプリプロセッサーおよびそれを使用するプログラム(CおよびFortranコンパイラー)に与える追加フラグ。
CPPFLAGS
を使用する組み込みの暗黙のルールの例n.o
は、次の形式のレシピでn.c
から自動的に作成されます。$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
は、次の形式のレシピでn.cc
、n.cpp
、またはn.C
から自動的に作成されます。$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
コマンドmake CPPFLAGS=-Dvar=123
を使用して、目的のマクロを定義します。
$ cat x.mak all: echo $(OPTION) $ make -f x.mak 'OPTION = -DPASSTOC = 42' echo -DPASSTOC = 42 -DPASSTOC = 42