2016-05-31 15 views
1

Linux Kernel Module Programming Guideで指定されている標準のMakefileを使ってLinuxカーネルモジュールをコンパイルしようとしています。 MakefileがMakefileと指定されていれば、すべて動作します。 Makefileの名前をMakefile.helloなどに変更すると、パスが見つからないので失敗しますMakefile。私はこのコマンドを正しく機能させるためにMakefileに追加できるコマンドやフラグのセットがあるかどうか疑問に思っていました。私はCMakeから呼び出すので、Makefileの名前を変更する必要があります。 Cmakeは独自のMakefileを作成し、私がすでに持っているものを上書きします。異なるパス名のMakefileを使ってLinuxカーネルモジュールを構築する

カーネルモジュールのコードをhello worldの例に置き換えて、問題を再現しました。私はmakefileを知っている。

ハロー世界の例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 

メイクファイルをMakefile呼び出された場合。 (正常にビルド)

$> 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 -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 

(ビルドに失敗)Makefile.hello呼び出された場合の出力を行いますしかし私はちょうどより多くの問題を引き起こしたこと、内部MAKEパラメータに-fを追加してみました。

+0

私はCMakeを使って簡単にモジュールを作成することはできません。カーネルは、KBuildという独自のビルドシステムを使用しています。 https://cmake.org/pipermail/cmake/2007-November/017320.html – 0andriy

答えて

2

すべてのKbuild関連ロジックをファイルKbuildに移動します。カーネルのビルドシステムは、最初にこの名前のファイルをチェックするので、CMakeによって作成されたMakefileは検索されません。この機能はDocumentation/kbuild/makefiles.txtに記載されています。

私はLinuxカーネルに関連する私のCMakeプロジェクトでこのアプローチを正確に使用しています。カーネルツリーに

+0

解決しました。ご協力ありがとうございました。魅力のように働いた。 – msmith81886

0

オープンスクリプト/ Makefile.build:コード(43-44)の

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) 

この部分は名 'Makefile' のでMakefileを含んでいます。

0

デフォルトのMakefile。 Name = Makefile ...とMakefile-hello、または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もOK $。

メイクファイル:$ make -f Makefile.msmith OK、間違いなし。


関連する問題