2008-12-08 39 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

相关问题