2012-02-29 10 views
0

1つのGNU Makefileで2つのプログラムをmake prog1またはmake prog2のいずれかで作成しようとしました。ターゲット固有の変数を使用してターゲットに排他的なソースファイルを指定しようとしましたが、test1.cもtest2.cもビルドされています。実行可能ファイルのリンク時にのみ参照されます。 test1.cまたはtest2.cをコンパイルするためにMakefileを入手するには?あなたの助けを事前にGNU Makeターゲット固有の変数からのソースファイルを含める

... 
prog1: PASRC = test1.c 
prog2: PASRC = test2.c 
... 
ASRC = $(PASRC) common.c 
... 
OBJS = $(ASRC:.c=.o) 
... 
prog1: $(OBJS) prog1.elf 
prog2: $(OBJS) prog2.elf 
... 
%elf: $(OBJS) 
    $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o [email protected] 

おかげ

答えて

2

ターゲット固有の変数を使用する必要はありません。ここで

は私のMakefileからの抜粋です。定期的な依存関係が十分でなければなりません:

all : prog1 prog2 # default target 

prog1 : test1.o 
prog2 : test2.o 
prog1 prog2 : common.o 

%.o : %.C# how to build any .o from a corresponding .c 
    $(CC) -c -o [email protected] $(CPPFLAGS) $(CFLAGS) $< 

prog1 prog2 : % : 
    $(CC) $^ $(LDFLAGS) $(LDLIBS) -o [email protected] 
0

あなたが述べられていない特定の要件のいくつかの並べ替えを持っていない限り、私はあなた(デフォルトのルールとフラグ)のために仕事を作るせることをお勧めします。

PROGS = prog1 prog2 
COMMON_OBJS = common.o 

all: $(PROGS) 
prog1 prog2: % : %.o $(COMMON_OBJS) 

clean: 
     rm -f $(PROGS) $(PROGS:%=%.o) $(COMMON_OBJS) 

あなたはまだCLFAGS、LDFLAGSなど(コマンドラインまたはメイクファイル内)を設定することができ、デフォルトのルールは、それらをピックアップします。

あなたはGNUを使用している場合は、実行して、すべての生成や自動ルールを参照することができます

make -n -p 

これは、大量の出力ですので、私は選択のあなたのポケットベルに配管にそれを示唆しています。

関連する問題