2015-11-04 59 views
0

我有工作,看起來像這樣一個makefile:的Makefile與通用中間規則

TARGET:=prog 
SOURCES:=a.c b.c 
CFLAGS:=-Wall -g -O2 

OBJECTS:=$(SOURCES:%.c=%.o) 

$(TARGET): $(OBJECTS) 
    gcc -o [email protected] $^ 

%.o: %.c 
    gcc $(CFLAGS) -c -o [email protected] $< 

clean: 
    rm -f $(TARGET) $(OBJECTS) 

用戶需要改變的唯一變量是目標名稱,並建立它所需的資源。需要生成的對象從源自動確定。我想擴展它以支持多個目標,每個目標都有自己的源代碼列表。儘管如此,我無法獲得正確的語法。這是總體思路:

TARGETS:=prog1 prog2 
SOURCES_prog1:=a.c b.c 
SOURCES_prog2:=a.c c.c 
CFLAGS:=-Wall -g -O2 

[email protected]=$([email protected]:%.c=%.o) 

$(TARGETS): $([email protected]) 
    gcc -o [email protected] $^ 

%.o: %.c 
    gcc $(CFLAGS) -c -o [email protected] $< 

clean: 
    rm -f $(TARGET) $(OBJECTS) 

但我不能讓對象列表正確生成。我也不確定如何編寫clean規則來清除所有對象。這可能嗎?

+0

沒有時間更多的時刻,但像這樣你需要動態地界定目標的/ etc東西寫上去。與['$(eval)'](http://www.gnu.org/software/make/manual/make.html#Eval-Function)和循環(可能[Canned Recipes](http:// www。 gnu.org/software/make/manual/make.html#Canned-Recipes)或者(或可能另外)[Secondary Expansion](http://www.gnu.org/software/make/manual/make.html# Secondary-Expansion)。除非你保存了所有對象/目標的列表(或者可以再次生成),否則'clean'規則將不起作用。 –

回答

1

我看到有兩種主要方式可以做到這一點。

第一個涉及使用$(eval) function動態創建目標/必備映射。

TARGETS:=prog1 prog2 
SOURCES_prog1:=a.c b.c 
SOURCES_prog2:=a.c c.c 
CFLAGS:=-Wall -g -O2 

$(TARGETS): 
     gcc -o [email protected] $^ 

$(foreach t,$(TARGETS),$(eval OBJECTS_$t := $(SOURCES_$t:.c=.o))$(eval $t: $(OBJECTS_$t))) 

第二涉及使用Secondary Expansion

TARGETS:=prog1 prog2 
SOURCES_prog1:=a.c b.c 
SOURCES_prog2:=a.c c.c 
CFLAGS:=-Wall -g -O2 

.SECONDEXPANSION: 

$(TARGETS): $$([email protected]) 
     gcc -o [email protected] $^ 

$(foreach t,$(TARGETS),$(eval OBJECTS_$t := $(SOURCES_$t:.c=.o))) 

clean目標變成兩種情況下:

clean: 
     rm -f $(TARGETS) $(foreach t,$(TARGETS),$(OBJECTS_$t))