一步一步学习Linux驱动之驱动模块MakeFile解析

make命令执行时,需要一个
Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

一、使用条件判断

下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。

libs_for_gcc = -lgnu
normal_libs = 

foo: $(objects)
ifeq ($(CC),gcc)
     $(CC) -o foo $(objects) $(libs_for_gcc)
else
     $(CC) -o foo $(objects) $(normal_libs)
endif 

可见,在上面示例的这个规则中,目标“foo”可以根据变量“$(CC)”值来选取不同的函数库来编译程序。

我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。

libs_for_gcc = -lgnu
normal_libs = 

ifeq ($(CC),gcc)
    libs=$(libs_for_gcc)
else
    libs=$(normal_libs)
endif 

foo: $(objects)
     $(CC) -o foo $(objects) $(libs) 

下面是关于一段arm驱动程序的分析

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else

KERNELDIR :=/home/ZP1015/Desktop/linux-2.6.32.2

all:
	 make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
	rm -f *.o *.ko *.mod.o *.mod.c *.symvers modul*

endif

1、ifeq”语法是ifeq (<arg1>;, <arg2>;),功能是比较参数“arg1”和“arg2”的值是否相同。ifneq刚好相反,比较两者的值是否不同其中有一些是我们常见或是见过的,第一个ifneq
($(KERNELRELEASE),)目前,有用处,它的由来是指在Linux源码根目录下的Makefile编译内核时,KERNELRELEASE宏会被定义,那么如果是从源码根目录开始的make则会将hello.o模块编译进内核。

KERNELDIR
:=/home/ZP1015/Desktop/linux-2.6.32.2  这句是对KERNELDIR进行赋值,这个变量是后面我们用到的指代内核源码目录用的。

2、make
-C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

这句是Makefile的规则:这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make
modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。M不是makefile的选项,是内核根目录下的Makefile中使用的变量

时间: 2024-10-12 19:43:18

一步一步学习Linux驱动之驱动模块MakeFile解析的相关文章

Linux内核(17) - 高效学习Linux驱动开发

这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,然后也都会紧接着尽量的去进行解释清楚,中间的很多概念也有反复纠结过怎么解释能够更容易的理解,力求即使对于初学者也可以有很少阻碍的一气读完.同时我也把书中一部分自己的感悟抽出来整理了精华版,share出来.当然水平有限,错漏之处有发现而修订时遗漏的,也有尚没有发现的.这本书

转:学习linux驱动经典书籍

Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了.但万事总有一个开头,没有对Linux驱动整体框架的把握是很难做一个优秀的驱动开发者的.除了这本Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini合著的经典大作外,另一本理论

linux驱动系列之makefile

在linux环境下做嵌入式无论是编写应用程序还是驱动程序等等,都需要用make来进行程序的编译,就需要学会自己编写Makefile.一个简单的makefile文件如下: 1 hell:hello.c 2 gcc -o hello hello.c 3 clean: 4 rm -f hello 这个是最简单的makefile,makefile的作用就是写程序者可以决定哪些文件需要编译.上面的2.4行需要使用Tab键不能使用空格. makefile中可以定义变量和使用函数. makefile中定义变量

一步一步学习Linux驱动之自动创建设备节点

<span style="font-size:12px;">extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) __attribute__((format(printf, 5, 6)));</span> 函数功能: 函数device_create()用于动态的建立

Linux 驱动开发索引

1.嵌入开发环境搭建 Telnet 在 mini2440 上的移植 Opencv-2.4.9 在 mini2440 上的移植 搭建嵌入式开发环境总结 2.Linux 设备驱动 Linux 驱动程序头文件 一步一步学习Linux驱动之驱动模块MakeFile解析 一步一步学习 Linux 驱动之(Kconfig.Makefile) 一步一步学习 Linux 驱动之字符设备 LED 静态编译进 Linux 内核 内核怎么通过主设备号找驱动.次设备号找设备 Linux 驱动之内核空间分配内存 一步一步

Linux驱动学习步骤(转载)

1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现. 在ioctl里完成从用户空间向内核空间传递结构体的实现. 6. 写一bl

Linux驱动开发学习的一些必要步骤

1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现. 在ioctl里完成从用户空间向内核空间传递结构体的实现. 6. 写一bl

Linux驱动之准备

开始系统学习Linux驱动,以前断断续续也玩玩了一下,开贴来系统学习Linux驱动. 硬件平台是JZ2440-4.3 ARM9开发板,开发板运行系统版本Linux3.4.2内核(内核移植,下载等相关其他篇幅). 设置开发板系统IP,让开发板与主机.开发板与虚拟机互通. 查看开发板ip / # routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface127.0.0.0 * 255.255.2

驱动学习之驱动体验

1:什么是linux驱动 从本质上讲,驱动就是属于内核层面的程序代码,是直接和硬件打交道的.与裸机中直接操作寄存器去操作硬件的不同之处在于,裸机中操作的是物理内存,而我们在驱动中操作的是虚拟内存,驱动中还可以调用内核中提供的很多接口函数来简化我们操作硬件的过程. 2:linux设备驱动的分类 根据设备本身的读写操作特征的差别,linux驱动主要分为三类 (1)字符设备驱动 字符设备驱动的特点是软件在驱动设备是以字节为单位进行的,如LED.LCD.串口.蜂鸣器等 (2)块设备 块设备是相对于字符设