Как организовать Makefile для компиляции модуля ядра с несколькими файлами .c? - PullRequest
7 голосов
/ 08 декабря 2008

Как организовать 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 $@ $(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

Ответы [ 3 ]

4 голосов
/ 08 декабря 2008

Я бы предположил, что простое перечисление большего количества объектных файлов во второй строке поможет.

3 голосов
/ 08 декабря 2008

Зависимости для $ (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 $@ $(OBJS)

Это хорошо, если в строке больше исходных файлов, чем удобно помещается. Но если файлов всего несколько, вы также можете определить все объекты в одной строке

OBJS = nlb-driver.o file1.o file2.o
1 голос
/ 25 апреля 2017

В моем случае проект состоит из 6 файлов:

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

monter_main.c - это основной файл моего модуля.

Помните, что вы не должны иметь файл с тем же именем, что и модуль, который вы пытаетесь построить (например, monter.c и monter.ko), если у вас нет всего кода в этом одном файле.

Вот мои Makefiles:

  • 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
    
...