$(MAKE) -C $(KERNELDIR) M=`pwd` modules

在FL2440资料的LED驱动编程的编译makefile里面看到这样一句话,-C是表示进入$(KERNELDIR)目录执行makefile,而M不是makefile的选项,是内核根目录下的Makefile中使用的变量,modules是Makefile中的目标。

先插讲解析`pwd`,反引号: `pwd`  等同于  $(pwd),在Linux中反引号起着命令替换的作用,将反引号中的字符串做为命令来执行;

如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。

> echo The date is `date`

the date is 2015年 11月 25日 星期三 16:18:56 CST

shell中有两种方法作命令替换,除了反引号还可以用$(…)结构括起来,$(…)格式受到POSIX标准支持,也利于嵌套。但反引号内不能再引用反引号,而$()中可以引用反引号。

# Use make M=dir to specify directory of external module to build 
# Old syntax make ... SUBDIRS=$PWD is still supported 
# Setting the environment variable KBUILD_EXTMOD take precedence 
ifdef SUBDIRS 
KBUILD_EXTMOD ?= $(SUBDIRS) 
endif 
ifdef M //如果没有定义或赋值M,此处M未定义(undefined) 
ifeq ("$(origin M)", "command line") //如果定义了,此句用来判断M是否从命令行来 
KBUILD_EXTMOD := $(M) 
endif 
endif

KERN_DIR = /work/system/linux-2.6.22.6

all:
 make -C $(KERN_DIR) M=`pwd` modules

clean:
 make -C $(KERN_DIR) M=`pwd` modules clean
 rm -rf modules.order

obj-m += usbmouse_as_key.o

驱动模块Makefile解析

作者:王劲南,华清远见嵌入式学院讲师。

先看一下代码

ifeq ($(KERNELRELEASE),)
        KERNELDIR ?= /home/linux/linux-2.6.22.6
        PWD := $(shell pwd)
        modules:
                $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        modules_install:
                $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
        clean:
                rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
        .PHONY: modules modules_install clean
        else
                obj-m := myhello.o
        endif

其中有一些是我们常见或是见过的,第一个ifeq ($(KERNELRELEASE),)目前,并无用处,它的由来是指在Linux源码根目录下的Makefile编译内核时,KERNELRELEASE宏会被定义,那么如果是从源码根目录开始的make则会将myhello.o模块编译进内核。

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

PWD := $(shell pwd),这句是对PWD变量进行赋值,作用是将$(shell pwd)的返回结果既求得当前目录的路径赋值给PWD,这个变量我们在后面指代我们要编译的驱动程序所在的位置。

modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

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

modules_install:
                $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

这个命令是模块的安装,在Makefile中搜索“lib\/modules”可以看到下面的语句,通过阅读你不难找到这个“MODLIB”的用处,它是用来指定安装路径的,而变量“INSTALL_MOD_PATH”往往为空。

MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
        Export MODLIB

.PHONY: modules modules_install clean

这句话是的作用是保证modules,modules_install,clean这三个命令能正常完成。.PHONY 这是一个特殊目标名称,还有其它的,如:

.SUFFIXES,.DEFAULT,.PRECIOUS,.INTERMEDIATE,.SECONDARY,.SECONDEXPANSION,.DELETE_ON_ERROR,.IGNORE .LOW_RESOLUTION_TIME .SILENT .EXPORT_ALL_VARIABLES .NOTPARALLEL

它们的具体用法可以参考GNU手册中的Special Built-in Target Names章节。

.PHONY目标的具体意思是如果在Makefile的工作目录中有名如:modules,modules_install,clean等文件时命令会出错。它是防止这出错的方式。

转载:https://blog.csdn.net/wocao1226/article/details/7453761

最新文章

  1. 类选择器和所作用的标签一起写为什么不起作用? - CSDN博客
  2. 教程是php手工注入
  3. 零基础学Python(第十五章 日期时间datetime、time、Calendar)
  4. 【MFC系列-第13天】Windows系统对话框(对话框记事本逻辑)
  5. 2018-1-27:内存的划分
  6. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
  7. SXSSFWorkbook使用——使用excel模板
  8. 架设git服务器--使用git-daemon
  9. PowerShell 远程执行任务
  10. 记一次mysql千万订单汇总查询优化
  11. ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)
  12. C语言编程QQ管理系统,c语言制作学生管理系统srrpqq67.doc
  13. BCD码与十进制转换
  14. PHP多功能自动发卡平台源码 带手机版 带多套商户模板
  15. java毕业生设计资源循环利用计算机源码+系统+mysql+调试部署+lw
  16. FlinkKafkaProducer源码解读
  17. 色彩对比广告设计_为什么我们都需要使用色彩对比检查器
  18. bcdedit添加linux引导,强大的BCDEdit工具-启动项等相关问题-设置默认开机启动项
  19. 2019年安徽省大学生网络攻防赛赛前培训——Day2
  20. 论文《Context Contrasted Feature and Gated Multi-scale Aggregation for Scene Segmentation》笔记

热门文章

  1. 修改CentOS 7.2系统的主机名
  2. 敏捷转型历程 - Sprint3 回顾会
  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
  4. Polymorphic form--多态表单
  5. VC菜菜鸟:基于CFree的HelloWorld程序
  6. C++ Public, Protected, Private
  7. UA MATH571B 试验设计V 2K析因设计简介
  8. VS2010重构学习总结
  9. Vue.js 技术揭秘学习 (2) Vue 实例挂载的实现
  10. Ubuntu下在线安装mysql