Chinaunix首页 | 论坛 | 博客
  • 博客访问: 197525
  • 博文数量: 70
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 412
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-30 11:07
文章分类

全部博文(70)

文章存档

2014年(68)

2013年(2)

我的朋友

分类: LINUX

2014-03-19 18:51:30

最近学习linux的驱动编写,在网上普遍用类似以下的Makefile


点击(此处)折叠或打开

  1. obj-m += target.o
  2. KERNEL_DIR:=/path/to/the/kernel/source/dir
  3. target.ko : source.c
  4.  make -C $(KERNEL_DIR) M=$(PWD) modules


一直以为“M=”是make程序的参数,今天读内核的Makefile才知道原来是在这里面定义的,如下

点击(此处)折叠或打开

  1. # Use make M=dir to specify directory of external module to build
  2. # Old syntax make ... SUBDIRS=$PWD is still supported
  3. # Setting the environment variable KBUILD_EXTMOD take precedence
  4. ifdef SUBDIRS
  5.  KBUILD_EXTMOD ?= $(SUBDIRS)
  6. endif
  7. ifdef M
  8.  ifeq ("$(origin M)", "command line")
  9. KBUILD_EXTMOD := $(M)
  10. endif
  11. endif


解释:#?:测试操作.在一个确定的表达式中,用?来测试结果. (())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的一个.
              在"参数替换"中,?测试一个变量是否被 set 了.
              在 file globbing 中和在正则表达式中一样匹配任意的单个字符.
         # “ifdef”是条件关键字。语法是ifdef ; else ; endif
         # ifdef只检验一个变量是否被赋值,它并不会去推导这个变量,并不会把变量扩展到当前位置。 
         # “ifeq”与“ifdef”类似。
         # “ifeq”语法是ifeq (;, ;),功能是比较参数“arg1”和“arg2”的值是否相同。
# 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
# 语法是: $(origin ;)
# origin函数的返回值有:
# “undefined”从来没有定义过、“default”是一个默认的定义、“environment”是一个环境变量、
# “file”这个变量被定义在Makefile中、“command line”这个变量是被命令行定义的、
# “override”是被override指示符重新定义的、“automatic”是一个命令运行中的自动化变量


对make还是不熟,估计make的参数传递是传统的命令行传递格式,如-foo bar这样的,而Makefile的参数传递是以foo=bar这样的。

以上。

阅读(1774) | 评论(0) | 转发(1) |
0

上一篇:qt事件机制

下一篇:/proc/sys/kernel/printk

给主人留下些什么吧!~~