2016-05-31 7 views
1

Ich versuche, ein Linux-Kernel-Modul mit dem Standard-Beispiel-Makefile zu kompilieren, das in Linux Kernel Module Programming Guide angegeben ist. Wenn das Makefile Makefile heißt, dann funktioniert alles. Wenn ich das Makefile zu Makefile.hello oder etwas anderem umbenenne, schlägt es fehl, da es den Pfad Makefile nicht finden kann. Ich habe mich gefragt, ob es einen Befehl oder eine Gruppe von Flags gibt, die ich zu meinem Makefile hinzufügen kann, um diese Funktion richtig zu machen. Ich muss das Makefile umbenennen, wie ich es von CMake anrufe. Cmake erstellt seine eigenen Makefiles und überschreibt häufig, was ich bereits habe.Linux-Kernelmodul mit Makefile mit anderem Pfadnamen erstellen

Ich ersetzte meinen Kernel-Modul-Code durch das Hallo Welt-Beispiel und replizierte das Problem. Ich kenne das Makefile.

Hallo Welt Beispiel hello.c

/* 
* hello−1.c − The simplest kernel module. 
*/ 
#include <linux/module.h> /* Needed by all modules */ 
#include <linux/kernel.h> /* Needed for KERN_INFO */ 
int init_module(void) 
{ 
    printk(KERN_INFO "Hello world 1.\n"); 
    /* 
    * A non 0 return means init_module failed; module can't be loaded. 
    */ 
    return 0; 
} 
void cleanup_module(void) 
{ 
    printk(KERN_INFO "Goodbye world 1.\n"); 
} 

Makefile

obj-m += hello.o 

ifeq (,$(KDIR)) 
    KDIR := /lib/modules/$(shell uname -r)/build 
endif 

PWD := $(shell pwd) 

all: 
    $(MAKE) -C $(KDIR) M=$(PWD) $(KCONFIG) modules 

clean: 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

Wenn Make-Datei Makefile genannt wird. (Baut erfolgreich)

$> make -f Makefile 
make -C /lib/modules/4.4.0-21-generic/build M=/home/msmith/Desktop/kernel-test modules 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-21-generic' 
    CC [M] /home/msmith/Desktop/kernel-test/hello.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
    CC  /home/msmith/Desktop/kernel-test/hello.mod.o 
    LD [M] /home/msmith/Desktop/kernel-test/hello.ko 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-21-generic' 

Make ausgegeben, wenn Make-Datei aufgerufen wird Makefile.hello (bauen ausfällt)

$> make -f Makefile.hello 
make -C /lib/modules/4.4.0-21-generic/build M=/home/msmith/Desktop/kernel-test modules 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-21-generic' 
scripts/Makefile.build:44: /home/msmith/Desktop/kernel-test/Makefile: No such file or directory 
make[2]: *** No rule to make target '/home/msmith/Desktop/kernel-test/Makefile'. Stop. 
Makefile:1396: recipe for target '_module_/home/msmith/Desktop/kernel-test' failed 
make[1]: *** [_module_/home/msmith/Desktop/kernel-test] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-21-generic' 
Makefile.hello:10: recipe for target 'all' failed 
make: *** [all] Error 2 

Ich habe versucht, die -f auf die internen MAKE Parameter angeben, aber die nur mehr Probleme verursacht.

+0

Ich bezweifle, dass Sie einfach ein Modul mit CMake erstellen können. Kernel verwendet sein eigenes Build-System namens KBuild. https://cmake.org/pipermail/cmake/2007-November/017320.html – 0andriy

Antwort

2

Verschieben Sie alle Kbuild-bezogene Logik in die Datei Kbuild. Das Build-System des Kernels prüft zuerst die Datei mit diesem Namen, so dass es nicht in Makefile, erstellt von CMake, schaut. Diese Funktion ist in Documentation/kbuild/makefiles.txt dokumentiert.

Ich verwende genau diesen Ansatz in meinen CMake-Projekten, die mit dem Linux-Kernel zusammenhängen.

+0

Das hat es gelöst. Danke für Ihre Hilfe. Lief wie am Schnürchen. – msmith81886

0

öffnen/script Makefile.build in Kernelbaum:

41 # The filename Kbuild has precedence over Makefile 
42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 
43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 
44 include $(kbuild-file) 

Dieser Teil des Codes (43-44) umfasst Makefile mit dem Namen 'Makefile'.

0

Das Standard-Makefile. Name = Makefile ... und Makefile-Hallo oder Makefile.hello.

obj-m := hello.o 

KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

default: 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 

clean: 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

$ make: OK

$ make -f Makefile-hello OK

$ make -f Makefile.hello auch OK.

Ihr Makefile: $ make -f Makefile.msmith OK, keine Fehler.