2009-08-20 8 views
30

私はAc、Bc、....、ZcのCソースファイルの長いリストを含むプログラムを持っているとしましょう.Ac、Bcを特定のCFLAGSでコンパイルし、ソースファイルの残りの部分を別のCFLAGS値。Makefileを使って異なるCFLAGSで異なるcファイルをコンパイルするには?

上記の仕事をするための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 [email protected] 

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

これはうまくいくものの、愚か/複雑に見えます。 Makefileでこれを行うために推奨される方法は何ですか?ありがとう!

答えて

45

ターゲット固有の変数を使用してみてください。ターゲット固有の変数は、次のように宣言されている:TARGETという名前のターゲットがなされているとき

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

さて、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 [email protected] -c $< 
+1

デフォルトの.c - > .oコンパイルルールを再定義しない場合は、 'CFLAGS + = $ (EXTRA_CFLAGS) 'も(少なくともGNU makeでは)うまくいくでしょう。 – sstn

+0

CFLAGSに直接追加することもできます: '$(SPECIAL_OBJS):CFLAGS + = - std = c99'(GNU makeをやり直してください)。 – sstn

+0

@sstn上記のように、任意の有効な形式の割り当てを使用することができます。 –

1

私は生のmakefileのための質問に答えることはできませんが、automakeはを使用して喜んでいる場合、それは簡単です:

 
foo_CFLAGS = [options passed to CC only when building foo] 
+0

このようなautomakeを使用する場合、 "foo"はどんな種類のターゲット(オブジェクトファイルなど)でもかまいませんか、それとも最終的なターゲット(実行可能またはライブラリ)でなければなりません? –

+1

このようなプライマリの使用は、最終ターゲットとすべての中間ターゲットに適用されます。中間のターゲット(例:.oファイル)にのみ適用するには、Makefile.amに明示的なルールを書くことができます –

10

Linuxカーネルのビルドシステムによって取られたアプローチ:その後、

CFLAGS += $([email protected]) 

そして、

CFLAGS-A.o += -DEXTRA 
CFLAGS-B.o += -DEXTRA 
関連する問題