首页 > 代码库 > Makefile学习笔记

Makefile学习笔记

1,什么是makefile?

  makefile是一个文件。这个文件用来做什么的?答:文件里面的内容,指明了工程编译的规则。比如:哪些文件先编译,哪些后编译,哪些需要更新,如何编译,链接到哪些库等等。

2,makefile的好处?

  如上所述,它能实现自动化编译,只需输入make命令,就能得到想要的执行文件。会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

3,makefile的规则: 

  target ... : prerequisites ...

 

  command

 

 

  target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

 

  prerequisites就是,要生成那个target所需要的文件或是目标。

 

  command也就是make需要执行的命令。(任意的Shell命令)

 

  这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

4,多说无益,先来个例:

 

  ##Makefile
  # If KERNELRELEASE is defined, we‘ve been invoked from the
  # kernel build system and can use its language.
  ifneq ($(KERNELRELEASE),)
     obj-m := hello.o

 

  # Otherwise we were called directly from the command
  # line; invoke the kernel build system
  else
     KERNEL_DIR ?= /lib/modules/`uname -r`/build
     MODULEDIR := $(shell pwd)

 

  default:
     make -C $(KERNEL_DIR) M=$(MODULEDIR) modules

 

  endif

 

  clean:
     rm -f *.o *.ko *.mod.c Module.* modules.*

 

 

分析:

  http://blog.csdn.net/isnipe/article/details/3933941  

  补充:

  KERNEL_DIR表示内核源码目录,目录中包含了内核驱动模块所需要的各种头文件及依赖。

  -C表示 指定进入指定的目录即KERNEL_DIR,是内核源代码目录,调用该目录顶层下的Makefile,目标为modules。

  M=$(shell pwd)选项让该Makefile在构造modules目标之前返回到模块源代码目录并在当前目录生成obj-m指定的xxx.o目标模块。

  疑问:obj-m := hello.o不是在ifneq里么?到底哪定义了hello.o?  makefile里有很多隐藏规则,这个难道是它里面隐藏的????

5,:= ,=,?=的区别
  :=不递归赋值
  =  递归赋值
  ?=默认值
  “:=” 的意思是,它右边赋得值如果是变量,只能使用在这条语句之前定义好的,而不能使用本条语句之后定义的变量;
  于此对应的是“=”,当它的右边赋值是变量时,这个变量的定义在本条语句之前或之后都可以;
  而“?=”是指,该符号左边的变量,如果在本条语句之前没有定义过,则执行本语句,如果已经定义,那么本语句什么都不做。

6,写得有点乱了,不知道该怎么写下去了,其中一些规则或变量什么的,蛮繁杂的。边看边记录吧。

7,第一次博客,失败。

Makefile学习笔记