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





Я бы предположил, что просто перечисление дополнительных объектных файлов во второй строке поможет.
Зависимости для $ (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
В моем случае проект состоит из 6 файлов:
monter_main.c, monter_main.hmonter_cdev.c, monter_cdev.hmonter_pci.c, monter_pci.hmonter_main.c - это основной файл моего модуля.
Помните, что у вас не должно быть файла с тем же именем, что и у модуля, который вы пытаетесь построить (например, monter.c и monter.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
@CiroSantilli 刘晓波 死 六四 事件 法轮功 Можно сделать это в одном файле, но мне понравилось это решение - мне пришлось изменить Kbuild только во время разработки.
Просто предложение: вы можете использовать monter-objs := $(patsubst %.c, %.o, $(shell echo *.c)), чтобы он создавал файл .o, соответствующий каждому .c.
Почему два отдельных файла
MakefileиKbuild?