GNU make学习笔记

make概述

make是一个命令工具,它解释Makefile中的规则。
make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做
以下几种文件在执行make时将会被编译

  • 所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;
  • 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译;
  • 头文件在上一次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make时将会被重新编译。

Makefile简介

Makefile是一种文件,由它来告诉make需要做什么,该怎么做。
一个简单的Makefile描述规则组成:

TARGET... : PREREQUISITES...
COMMAND
...

  • target:规则的目标。通常是程序中间或者最后需要生成的文件名。可以是.o文件、也可以是最后的可执行程序的文件名。另外,目标也可以是一个make执行的动作的名称,如目标“clean”,成这样的目标是“伪目标”。

  • prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。

  • command:规则的命令行。是make程序所有执行的动作(任意的shell命令或者可在shell下执行的程序)。

一个简单常见的makefile栗子

  1. #sample Makefile
  2. edit : main.o kbd.o command.o display.o \
  3. insert.o search.o files.o utils.o
  4. cc -o edit main.o kbd.o command.o display.o \
  5. insert.o search.o files.o utils.o
  6. main.o : main.c defs.h
  7. cc -c main.c
  8. kbd.o : kbd.c defs.h command.h
  9. cc -c kbd.c
  10. command.o : command.c defs.h command.h
  11. cc -c command.c
  12. display.o : display.c defs.h buffer.h
  13. cc -c display.c
  14. insert.o : insert.c defs.h buffer.h
  15. cc -c insert.c
  16. search.o : search.c defs.h buffer.h
  17. cc -c search.c
  18. files.o : files.c defs.h buffer.h command.h
  19. cc -c files.c
  20. utils.o : utils.c defs.h
  21. cc -c utils.c
  22. clean :
  23. rm edit main.o kbd.o command.o display.o \
  24. insert.o search.o files.o utils.o
  • 目标(target)包含:可执行文件“edit”和.o文件(main.o,kbd.o….),依赖(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。所有的.o文件既是依赖(相对于可执行程序edit)又是目标(相对于.c和.h文件)。命令包括 “cc –c maic.c”、“cc –c kbd.c”……
  • 在这个例子中,“edit”的依赖为8个.o文件;而“main.o”的依赖文件为“main.c”和“defs.h”。当“main.c”或者“defs.h”被修改以后,再次执行“make”时“main.o”就会被更新(其它的.o文件不会被更新),同时“main.o” 的更新将会导致“edit”被更新。
  • 目标“clean”不是一个文件,它仅仅代表了执行一个动作的标识。在执行make时,它所指定的动作不会被执行。Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)。执行“clean”目标所定义的命令,可在shell下输入:make clean。
posted @ 2014-12-03 11:13  i-小乐  阅读(372)  评论(0编辑  收藏  举报