2014-11-02 77 views
0

我要生成Makefile中這樣定義規則的Makefile規則對於許多PROG使用定義生成與eval函數

CC = gcc 
LD = gcc 
CFLAGS = -g 
LDFLAGS = -g 

PROGS = test1 test2 

SRCS_test1 = test1.c 
SRCS_test2 = test2.c 

$(foreach prog, $(PROGS), $(eval OBJS_$(prog) = $(SRCS_$(prog):%.c=%.o))) 

.PHONY: all clean 

all: $(PROGS) 

define PROG_template 
$(1): $$(OBJS_$$(1)) 
    @echo ------------------ 
    @echo $(1) 
    @echo $$(OBJS_test1) $$(OBJS_test2) 
    @echo $$(OBJS_$(1)) 
    @echo $$^ 
    @echo ----------------- 
    $$(LD) $$(LDFLAGS) -o [email protected] $$^ 
endef 

$(foreach prog, $(PROGS), $(eval $(call PROG_template, $(prog)))) 

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

clean: 
    rm -f $(OBJS_test1) $(OBJS_test2) $(PROGS) 

輸出這樣

------------------ 
test1 
test1.o test2.o 


----------------- 
gcc -g -o test1 

GCC沒有提示輸入文件。 我的Makefile有什麼問題? 首先感謝。 對不起,我的英語很差。

+0

GNU使第4版是狡詐編寫腳本。你應該考慮這樣做。 – 2014-11-02 08:32:02

回答

0

您有兩個錯誤。第一個只是一個錯字;這條線:

$(1): $$(OBJS_$$(1)) 

應該是:

$(1): $$(OBJS_$(1)) 

(注意在第二$(1)消除不必要$

第二個錯誤是更加微妙:你必須要小心空格你的時候正在調用make中的函數,例如當你在參數call的參數中留下空格時,它可以嵌入到參數中。所以在這裏:

$(foreach prog, $(PROGS), $(eval $(call PROG_template, $(prog)))) 
                ^

該空格正在逐字使用作爲參數的一部分,因此'$1'相當於' test1',而不僅僅是'test1'。您可以通過info更換EVAL看什麼讓看到調試eval操作:

$(foreach prog, $(PROGS), $(info $(call PROG_template, $(prog)))) 

會告訴你:

test1: $(OBJS_ test1) 

注意額外的空間。

刪除多餘的空格,它會工作:

$(foreach prog, $(PROGS), $(eval $(call PROG_template,$(prog)))) 
                ^^ 
+0

非常感謝。我已經解決了問題 – uudiin 2014-11-02 11:42:43