web-dev-qa-db-ja.com

Makefileを使用して異なるCFLAGSで異なるcファイルをコンパイルする方法は?

すべて。 Ac、Bc、....、ZcなどのCソースファイルの長いリストを含むプログラムがあるとしましょう。次に、特定のCFLAGSを使用してAc、Bcをコンパイルし、ソースファイルの残りの部分を別のCFLAGSでコンパイルします。 CFLAGS値。

上記の仕事をするためにMakefileを書く方法は?現在、Makefileで行っていることは次のとおりです。

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o]
SPECIAL_OBJS=A.o B.o

all: $(OBJ) $(SPECIAL_OBJS)

$(SPECIAL_OBJS): 
     @echo [Compiling]: $(@:.o=.c)
     $(CC) [SOME OTHER GCC OPTIONS HERE] $(CFLAGS) -c $(@:.o=.c) -o $@

%.o: %.c
     @echo [Compiling]: $<
     $(CC) $(CFLAGS) -o $@ -c $<

それは動作しますが、愚かで複雑に見えます。 Makefileでこれを行うための推奨される方法を誰かが指摘するのを手伝ってもらえますか?ありがとう!

36
Lei

ターゲット固有の変数を使用してみてください。ターゲット固有の変数は次のように宣言されます。

TARGET: VAR := foo  # Any valid form of assignment may be used ( =, :=, +=, ?=)

これで、TARGETという名前のターゲットが作成されると、VARという名前の変数の値は「foo」になります。

ターゲット固有の変数を使用して、これを行うことができます。次に例を示します。

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o]
SPECIAL_OBJS=A.o B.o

all: $(OBJ) $(SPECIAL_OBJS)

$(SPECIAL_OBJS): EXTRA_FLAGS := -std=c99   # Whatever extra flags you need

%.o: %.c
     @echo [Compiling]: $<
     $(CC) $(CFLAGS) $(EXTRA_FLAGS) -o $@ -c $<
48
Dan Moulding

Linuxカーネルビルドシステムが採用したアプローチ:

CFLAGS += $(CFLAGS-$@)

その後、

CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA
13
Mykyta

生のmakefileの質問に答えることはできませんが、automakeを使用する場合は、簡単です。

 foo_CFLAGS = [fooをビルドするときにのみCCに渡されるオプション] 
2
William Pursell