web-dev-qa-db-ja.com

「make」コマンドライン引数(-D)からCソースコードにマクロ定義を渡す方法は?

通常、-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;
}
93
MohamedEzz

この方法でmakeコマンドを呼び出します。

make CFLAGS=-Dvar=42

Makefileのコンパイルコマンドで$(CFLAGS)を必ず使用してください。 @jørgensenが言及したように、makeコマンドの後に変数の割り当てを置くと、Makefileで既に定義されているCFLAGS値がオーバーライドされます。

または、CFLAGS以外の変数に-Dvar=42を設定し、CFLAGSでこの変数を再利用して、CFLAGSを完全にオーバーライドしないようにすることもできます。

88
ouah

そのために特定の変数を使用するだけです。

$ 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
9
Mat

Make this wayを呼び出します

make CFLAGS=-Dvar=42

これは、環境(Makefile変数に関して優先度が低い)だけでなく、MakefileのCFLAGSをオーバーライドするためです。

9
jørgensen

評判が低いため、受け入れられた答えにコメントすることはできません。

定義済みの変数CPPFLAGSに言及したいと思います。 GNU Makeマニュアルでは次のように記述されているため、CFLAGSCXXFLAGSよりも適切な場合があります。

Cプリプロセッサーおよびそれを使用するプログラム(CおよびFortranコンパイラー)に与える追加フラグ。

CPPFLAGSを使用する組み込みの暗黙のルールの例

  • n.oは、次の形式のレシピでn.cから自動的に作成されます。
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.oは、次の形式のレシピでn.ccn.cpp、またはn.Cから自動的に作成されます。
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

コマンドmake CPPFLAGS=-Dvar=123を使用して、目的のマクロを定義します。

詳細情報

3
psq
 $ cat x.mak 
 all:
 echo $(OPTION)
 $ make -f x.mak 'OPTION = -DPASSTOC = 42' 
 echo -DPASSTOC = 42 
-DPASSTOC = 42 
1
pmg