Linux字符设备驱动
+ -

LINUX驱动模块MakeFile详解

2024-04-15 2 0

MakeFile的写法一般如下:

CURRENT_PATH:=$(shell pwd)  #模块所在的当前路径
Linux_Kernel:=$(shell uname -r)   #linux内核代码的当前版本
Linux_Kernel_PATH:=/home/book/100ask_imx6ull-sdk/Linux-4.9.88  #linux内核路径
all:
    make -C $(Linux_Kernel_PATH) M=$(CURRENT_PATH) modules
clean:
    make -C $(Linux_Kernel_PATH) M=$(CURRENT_PATH) clean    
.PHONY:clean
obj-m+=hello_drv.o

或者如下:

Makefile:
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/

obj-m := test.o
module-objs := test.o

all:
       $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
       rm *.ko

或者:

ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif

在当前的Makefile目录下,执行make时,会自动调用当前Makefile文件

由于在Linux源文件目录下的Makefile会定义KERNELRELEASE, 故内容为空。这里的ifneq表示不相等时,明显这里执行时会相等,故执行else后的内容。
定义KDIR变量为/lib/modules/$(shell uname -r)/build 路径
-C 表示执行KDIR目录下的Makefile,然后M返回当前目录,再执行当前目录下的Makefile文件,由于在内核目录下的Makefile定义了KERNELRELEASE,故这里有效,会执行:

obj-m :=hello.o

给表示目录文件 为hello.o(实际为hello.ko,不过这里为固定写法,只能这样写)
然后生成的是由modules,表示生成模块文件

    make  M=$(PWD) modules

的意思就是生成当前目录下的所有模块,会调用当前目录下的Makefile来生成。
所以执行一次这个Makefile,去进的是2次。

# Use make M=dir to specify directory of external module to build 
# 186 # Old syntax make ... SUBDIRS=$PWD is still supported
# 187 # Setting the environment variable KBUILD_EXTMOD take precedence

# External module support.
#1467 # When building external modules the kernel used as basis is considered
#1468 # read-only, and no consistency checks are made and the make
#1469 # system is not used on the basis kernel. If updates are required
#1470 # in the basis kernel ordinary make commands (without M=...) must
#1471 # be used.
#1472 #
#1473 # The following are the only valid targets when building external
#1474 # modules.
#1475 # make M=dir clean     Delete all automatically generated files
#1476 # make M=dir modules   Make all modules in specified dir
#1477 # make M=dir           Same as 'make M=dir modules'
#1478 # make M=dir modules_install
#1479 #                      Install the modules built in the module directory
#1480 #                      Assumes install directory is already created
#1481 
#1482 # We are always building modules

#@echo  '  Building external modules.'
#1530         @echo  '  Syntax: make -C path/to/kernel/src M=$$PWD target'
#1531         @echo  ''
#1532         @echo  '  modules         - default target, build the module(s)'
#1533         @echo  '  modules_install - install the module'
#1534         @echo  '  clean           - remove generated files in module directory only'
#1535         @echo  ''

附一个简单的hello模块源代码可用于测试

#include <linux/module.h> //所有模块都需要的头文件
#include <linux/init.h>   // init&exit相关宏
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxx");      
MODULE_DESCRIPTION("hello world module");

static int __init hello_init(void)
{
      printk(KERN_WARNING "hello world.\n");
      return 0;
}
static void __exit hello_exit(void)
{
      printk(KERN_WARNING "hello exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);

0 篇笔记 写笔记

makefile概述
makefile概述什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的集成开发环境(integrated development environment,IDE)都为你做了这个工作,但我觉得要作一个好的和专业的程序员,makefile还是要懂。这就好像现......
makefile介绍
makefile介绍make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则,以便给大家一个感性认识。这个示例来源于gnu 的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写......
makefile规则
书写规则规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一......
makefile命令
书写命令每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以 Tab 键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。我们在......
makefile 变量
使用变量在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”, “命令”或是......
makefile 条件判断
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。示例下面的例子,判断 $(CC) 变量是否 gcc ,如果是的话,则使用GNU函数编译目标。libs_for_gcc = -lgnunormal_libs =foo: ......
makefile 函数
Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make 所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数的返回值可以当做变量来使用。函数的调用语法函数调用,很像变量的使用,也是以 $ 来标识的,其语法如下:$(
隐含规则在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是 .o 文件,Windows下是 .obj 文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规......
函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令 ar 来完成打包工作。函数库文件的成员¶一个函数库文件由多个文件组成。你可以用如下格式指定函数库文件及其组成:archive(member)这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用......
终于到写结束语的时候了,以上基本上就是GNU make的Makefile的所有细节了。其它的厂商的make基本上也就是这样的,无论什么样的make,都是以文件的依赖性为基础的,其基本是都是遵循一个标准的。这篇文档中80%的技术细节都适用于任何的make,我猜测“函数”那一章的内容可能不是其它make......
MakeFile的写法一般如下:CURRENT_PATH:=$(shell pwd) #模块所在的当前路径Linux_Kernel:=$(shell uname -r) #linux内核代码的当前版本Linux_Kernel_PATH:=/home/book/100ask_imx6ull......
新装的Ubuntu在执行menuconfig时,会出现一系统的问题。这是因为我们的系统中没有安装相应的工具导致,我们只需要安装提示,安装相应的工具​就行了。看到什么安装什么,直到最终的成功。Unable to find the ncurses packageusbzh@usbzh-pc:~/wor......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!