2008-12-08 99 views
7

如何安排Makefile以編譯具有多個.c文件的內核模塊?如何安排Makefile以編譯具有多個.c文件的內核模塊?

這是我目前的Makefile。它是由KDevelop

TARGET = nlb-driver 
OBJS = nlb-driver.o 
MDIR = drivers/misc 

EXTRA_CFLAGS = -DEXPORT_SYMTAB 
CURRENT = $(shell uname -r) 
KDIR = /lib/modules/$(CURRENT)/build 
PWD = $(shell pwd) 
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR) 

obj-m += $(TARGET).o 

default: 
    make -C $(KDIR) M=$(PWD) modules 

$(TARGET).o: $(OBJS) 
    $(LD) $(LD_RFLAG) -r -o [email protected] $(OBJS) 

ifneq (,$(findstring 2.4.,$(CURRENT))) 
install: 
    su -c "cp -v $(TARGET).o $(DEST) && /sbin/depmod -a" 
else 
install: 
    su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a" 
endif 

clean: 
    -rm -f *.o *.ko .*.cmd .*.flags *.mod.c 
    make -C $(KDIR) M=$(PWD) clean 

-include $(KDIR)/Rules.make 

回答

4

自動生成我會假設,在第二行會做的伎倆剛剛上市更多的目標文件。

3

$(TARGET).o的依賴項可以是多個目標文件,驅動程序中的每個源文件都有一個。 OBJS最初聲明後,許多其他驅動程序使用+ =運算符。例如,

OBJS = nlb-driver.o 
OBJS += file1.o 
OBJS += file2.o 
... 

目標規則會再展開是

$(TARGET).o: nlb-driver.o file1.o file2.o 
    $(LD) $(LD_RFLAG) -r -o [email protected] $(OBJS) 

如果有多個源文件比舒適貼合上線這是很好的。但是,如果只有少量的文件,你還可以定義在一行

OBJS = nlb-driver.o file1.o file2.o 
1

在我的情況下,項目由6個文件中的所有對象:

  • monter_main.cmonter_main.h
  • monter_cdev.cmonter_cdev.h
  • monter_pci.cmonter_pci.h

monter_main.c是我模塊的主要文件。

請記住,除非您已獲取該文件中的所有代碼,否則請不要使用與要創建的模塊名稱相同的文件(例如monter.cmonter.ko)。

這裏是我的Makefile:

  • 的Makefile

    KDIR ?= /lib/modules/`uname -r`/build 
    
    default: 
        $(MAKE) -C $(KDIR) M=$$PWD 
    
    install: 
        $(MAKE) -C $(KDIR) M=$$PWD modules_install 
    
    clean: 
        $(MAKE) -C $(KDIR) M=$$PWD clean 
    
  • 的kbuild

    obj-m := monter.o 
    monter-objs := monter_main.o monter_cdev.o monter_pci.o 
    
+0

w^hy有兩個單獨的文件`Makefile`和`Kbuild`? – 2017-08-01 03:06:06