2008-12-08 15 views
7

cómo organizar un Makefile para compilar un módulo del núcleo con múltiples archivos .c?cómo organizar un Makefile para compilar un módulo del núcleo con múltiples archivos .c?

Aquí es mi Makefile actual. Se auto generada por 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 

Respuesta

4

Supongo que simplemente lista más ficheros objeto en la segunda línea haría el truco.

3

Las dependencias de $ (TARGET) .o pueden ser múltiples archivos de objetos, uno para cada archivo de origen en el controlador. Muchos otros controladores usan el operador + = después de la declaración inicial de OBJS. Por ejemplo,

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

La regla objetivo sería entonces ampliar ser

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

Esto es bueno si hay más archivos de origen que caber cómodamente en una línea. Pero si sólo hay un pequeño número de archivos, también se puede definir todos los objetos en una sola línea

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

En mi caso, el proyecto consta de 6 archivos:

  • monter_main.c, monter_main.h
  • monter_cdev.c, monter_cdev.h
  • monter_pci.c, monter_pci.h

monter_main.c es el archivo principal de mi módulo.

Recuerde que no debe tener un archivo con el mismo nombre que el módulo que está tratando de compilar (por ejemplo, monter.c y monter.ko) a menos que tenga todo el código en ese archivo.

Éstos son mis 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 ¿Tiene dos archivos separados 'Makefile' y' Kbuild'? –

Cuestiones relacionadas