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


107

私は通常、 "make command line"から "makefile"にオプション-Dname = valueを使用してマクロ定義を渡します。定義はメイクファイル内からアクセスできます。

同様のコンパイラオプションを使用して、「makefile」から「ソースコード」にマクロ定義を渡します。-Dname = value(多くのコンパイラでサポートされています)。この定義は、ソースコードでアクセスできます。

私が今必要としているのは、メイクファイルのユーザーが、メイクファイルの内容を変更することなく、「make.exeコマンドライン」から「ソースコード」に任意のマクロ定義をすぐに渡せるようにすることです。

したがって、ユーザーは次のように入力できます。make -f mymakefile.mk -SOMEOPTION var = 5

次に、コードmain.cが直接varを参照できます。

int main()
{
  int i = var;
}

15
なぜ反対票か。私には完全に正当な質問のように見えます。
Thomas

回答:


99

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

make CFLAGS=-Dvar=42

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

または-Dvar=42CFLAGSとは別の変数を設定し、この変数をで再利用しCFLAGSて、を完全に上書きしないようにできますCFLAGS


8
「CFLAGS = $(CFLAGS)-Wall」は使用できません。これは再帰的な定義であり、makeはこれを許可しません。"CFLAGS:= $(CFLAGS)-Wall"または "CFLAGS + = -Wall"を使用できますが、コマンドラインでの割り当ての方が優先順位が高いため、これらも機能しません。「CFLAGS + = -Wallを上書きする」を使用することもできますが、通常は内部で異なる変数を選択することをお勧めします。GNUコーディング標準ではCFLAGSなどをユーザーに任せる必要があり、メイクファイルは「local_CFLAGS = $(CFLAGS)-Wall」のような別の変数を選択します。
MadScientist 2012年

2
@MadScientistのメモに追加するだけで、GNUコーディング標準は$(CFLAGS)最後に来る必要があることも述べているため、ユーザーが指定したオプションは、Makefileが内部的に設定したものをオーバーライドします。これは、たとえばを使用することを意味しlocal_CFLAGS = -Wall $(CFLAGS)ます。逆に、本当に優先したいものがある場合は$(CFLAGS)、@ MadScientistコメントのように、の後に置きます。
2016

1
これで複数のマクロを設定する方法は?
Woody Huang

2
@WoodyHuangCFLAGS="-Dvar1=42 -Dvar2=314"
ouah

1
CPPFLAGSCFLAGSまたはより良い適合を表す可能性がありますCXXFLAGSstackoverflow.com/a/53527858/2278206
psq

11

特定の変数を使用するだけです。

$ 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

10

コールが作るこの方法を

make CFLAGS=-Dvar=42

MakefileのCFLAGS(環境(Makefile変数に関して優先順位が低い)だけではなく)をオーバーライドする必要があるからです。


6

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

事前定義された変数について述べたいと思いますCPPFLAGS。これは、GNU Makeマニュアルで次のように説明されているため、CFLAGSまたはよりも適しCXXFLAGSています

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

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

  • n.on.cの形式のレシピで自動的に作成されます。
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.o自動的に作られているn.ccn.cppまたはn.Cフォームのレシピ:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

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

より詳しい情報


1
$猫x.mak
すべて:
    エコー$(オプション)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
エコー-DPASSTOC = 42
-DPASSTOC = 42

-4

要件を満たすために、以下でCファイルとMakefileの実装を見つけます

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

問題は、「makefileを変更せずに」makeコマンドラインから直接Cソースコードに任意の定義を渡すことです。そのため、これらの任意の定義を作成できるように、メイクファイルを一度変更したいと考えていました。
MohamedEzz 2015年

makeでは機能しません。つまり、make -DMAKE_DEFINE = 11は無効なオプションを示しています。
Ramakrishnan Kannan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.