使用具有不同路径名

时间:2016-05-31 18:33:19

标签: c linux makefile linux-kernel

我正在尝试使用Linux Kernel Module Programming Guide中指定的标准示例Makefile编译Linux内核模块。如果Makefile被称为Makefile,那么一切正常。如果我将Makefile重命名为Makefile.hello或其他内容,则会失败,因为找不到路径Makefile。我想知道是否有一个命令或一组标志我可以添加到我的Makefile中以使这个功能正常。我需要重命名Makefile,因为我从CMake调用它。 Cmake创建了自己的Makefile,并且通常会覆盖我已有的。

我用hello world示例替换了我的内核模块代码并复制了问题。我知道它的makefile。

hello world example 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");
}

生成文件

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

如果调用makefile Makefile.hello(无法构建)

,则输出
$> 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

我尝试将-f添加到内部MAKE参数,但这只会导致更多问题。

3 个答案:

答案 0 :(得分:2)

将所有与Kbuild相关的逻辑移动到文件Kbuild中。内核的构建系统首先检查具有此名称的文件,因此它不会查看由CMake创建的MakefileDocumentation/kbuild/makefiles.txt中记录了此功能。

我在我的CMake项目中使用了这种方法,与Linux内核相关。

答案 1 :(得分:0)

将脚本/ Makefile.build打开到内核树中:

Control.Monad.IO.Class

这部分代码(43-44)包括带有名称的Makefile&#39; Makefile&#39;。

答案 2 :(得分: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:好的

$ make -f Makefile-hello确定

$ make -f Makefile.hello也行。

你的Makefile:$ make -f Makefile.msmith好的,没有错误。