Как организовать 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 $@ $(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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
11 879
3

Ответы 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 $@ $(OBJS)

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

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

В моем случае проект состоит из 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), если у вас нет всего кода в этом одном файле.

Вот мои файлы 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
    

Почему два отдельных файла Makefile и Kbuild?

Ciro Santilli新疆棉花TRUMP BAN BAD 01.08.2017 06:06

@CiroSantilli 刘晓波 死 六四 事件 法轮功 Можно сделать это в одном файле, но мне понравилось это решение - мне пришлось изменить Kbuild только во время разработки.

Mateusz Piotrowski 01.08.2017 11:39

Просто предложение: вы можете использовать monter-objs := $(patsubst %.c, %.o, $(shell echo *.c)), чтобы он создавал файл .o, соответствующий каждому .c.

LRDPRDX 07.02.2020 12:27

Другие вопросы по теме