2013-04-27 104 views
1

我有點使用makefiles的初學者,我正在嘗試爲gcc編寫一個makefile,它接受來自兩個不同目錄(在我的情況下稱爲內核和驅動程序)的輸入,並輸出目標文件一個使用通配符的不同目錄(稱爲tmp)。Makefiles輸出目錄

我寫了這個代碼來獲取輸入文件的名稱和輸出文件

C_SOURCES = $(wildcard $(KERNEL_DIR)/*.c $(DRIVERS_DIR)/*.c) 

#Creating a list for object files names 
C_OBJ = $(C_SOURCES:.c=.o) 

,我使用下面的規則

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

,但我不能讓輸出目標文件在所需的目錄。文件

回答

2

像這樣的例子應該爲你做。我分裂了一點東西的可讀性,但我敢肯定你會得到的想法:

KERNEL_SOURCES = $(wildcard $(KERNEL_DIR)/*.c) 
DRIVER_SOURCES = $(wildcard $(DRIVER_DIR)/*.c) 

OBJECTS = $(patsubst $(KERNEL_DIR)/%.c,tmp/%.o,$(KERNEL_SOURCES)) 
OBJECTS += $(patsubst $(DRIVER_DIR)/%.c,tmp/%.o,$(DRIVER_SOURCES)) 

當心具有相同名稱的源文件都KERNEL_DIRDRIVER_DIR

+0

以及如何我應該修改規則嗎? 我用下面的一個 '%的.o:%.c的 \t $(CC)$(CFLAGS)-c $ <-o $ @' – 2013-04-27 17:41:07

+0

@PatrickJane,這是一個困難的。既然你只需要一個輸出目錄,那就很困難。我建議你不要那樣做,而是在'tmp'中鏡像輸入目錄結構 - 然後你將每個'.o'文件映射到一個'.c'文件並使你的生活更輕鬆。 – 2013-04-27 17:44:48

2

你必須做一個單獨的規則對於每個子目錄,像這樣:

SOURCES := $(wildcard $(KERNEL_DIR)/*.c $(DRIVER_DIR)/*.c) 
OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/%.o,$(notdir $(SOURCES))) 

all: $(OBJECTS) 

$(OBJECT_DIR)/%.o : $(KERNEL_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

$(OBJECT_DIR)/%.o : $(DRIVER_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

顯然你就會有很大的問題,如果你有一個foo.c文件在這兩個源目錄...