2013-08-04 102 views
0

使用通配符我非常熟悉的Makefile文件和內核模塊,但最近我在我的Makefile的一個問題,即沒有任何意義 - 上使用通配符。 爲了演示這一點,我從頭開始編譯hello world內核模塊。 目錄結構是這樣的:無法在內核模塊的makefile

hello_mod/ 
    | 
    --- hello.c 
    | 
    --- Makefile 

下面是實際的生成文件:

CFILES := $(wildcard hello.c*) 
#CFILES := hello.c 
OBJS := $(CFILES:.c=.o) 

KSRC := /lib/modules/$(shell uname -r)/build 

obj-m += hello_world.o 
hello_world-y := $(OBJS) 

all:  
     @echo $(CFILES) 
     $(MAKE) -C $(KSRC) M=$$PWD modules 

clean: 
     $(MAKE) -C $(KSRC) M=$$PWD clean 

.PHONY: clean 

的問題是,即使評論$(CFILES)和註釋掉$(CFILES)是完全同樣,構建使用第一$(CFILES),出現以下錯誤失敗:

*** No rule to make target `/home/test/hello_mod/hello_world.c', needed by 
/home/test/hello_mod/hello_world.o'. Stop. 

如果評論$(CFILES)時,它完美的作品。

如果有人想測試這一點,我包括源爲世界你好源是hello.c中:

#include <linux/kernel.h> 
#include <linux/module.h> 

static int mod_init() 
{ 
     printk("Hello\n"); 
     return 0; 
} 

static void mod_exit() 
{ 
     printk("Bye world\n");  
} 

module_init(mod_init); 
module_exit(mod_exit); 

有誰知道爲什麼它表現爲這樣?我需要在makefile中使用通配符。任何幫助將不勝感激。

+0

您可能希望看到這個答案 http://stackoverflow.com/questions/6577176/makefiles-and-wildcards –

+0

這個問題無關與我,他/她在規則中使用「*」。我使用通配符運算符將源列出到變量中。 – bjxt

+0

爲什麼在'CFILES'定義中使用'$(dir)'?你用'remake -x'來調試你的'Makefile'嗎? –

回答

2

這裏發生了兩件事。第一個實際上只依賴KSRC變量和遞歸調用。第二化妝只需要CFILESOBJSobj-mhello_world-y變量,並且不利用all:目標。因此,您的調試顯示CFILES爲第一個Make設置正確,沒有被使用,並且沒有在第二個Make中顯示它,它在哪裏。

你是從不同目錄擴展的通配符,並沒有選擇正確的文件。嘗試此CFILES:

CFILES := $(notdir $(wildcard $M/hello.c*)) 
+0

好的這個作品!爲了澄清,'$(CFLAGS)'是一個簡單的擴展變量,根據make手冊'它包含了這個變量被定義時的值',那麼它爲什麼會再次擴大呢? – bjxt

+1

如果使用:=,右側將立即展開,並保留爲當前製作過程的剩餘部分。在這種情況下,kbuild系統需要第二次調用'make'。在第二次調用中,一切從頭開始。從第一個make到第二個的唯一信息就是在命令行上,如M = $$ PWD。這就是爲什麼我使用$ M來擴展第二個make過程中的目錄。 – Peter

0
SRCDIRS := subdir1 subdir2 
CFILES := $(strip $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))) 

也許應該是(見foreachexample in documentation

SRCDIRS := subdir1 subdir2 
CFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)) 

(無需$(strip),......或許

CFILES := $(wildcard {subdir1,subdir2}/*.c) 

使用remake,可能是因爲remake -x,以調試這些問題。

+0

這是否適合你?我已經測試了不帶'strip',它不起作用。 – bjxt