Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497554
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 508
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-10 13:18
个人简介

Keep looking Donot settle

文章分类

全部博文(144)

文章存档

2019年(1)

2016年(31)

2015年(51)

2014年(61)

分类: LINUX

2014-12-03 14:30:55

最近学习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这样的。

以上。

阅读(864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~