makefile学习笔记1

来源:互联网 发布:软件取得的阶段性成果 编辑:程序博客网 时间:2024/06/04 19:05

参考:http://blog.csdn.net/ruglcc/article/details/7814546/

makefile教程:(makefile零散的知识)
makefile 作用是自动化编译。一个大的工程涉及文件很多,makefile设定规则哪些文件先编译,哪些后编译,等更复杂的编译规则。

链接库参考:http://blog.sina.com.cn/s/blog_842bf5cd010163up.html
gcc常用命令:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html

makefile的核心,只要有一个以上的依赖文件比目标文件新(比较文件日期),就会执行下面的命令。
提一句:依赖文件可以是任何东西,包括伪目标,最终要生成的目标。

.PHONY:clean
.PHONY表示clean是一个伪目标,可能有的文件名也叫clean,.PHONY就说明了不论有没有这个clean文件,我makefile文件中这里的这个clean都是一个伪目标。
示例:
.PHONY:clean
clean:
-rm -rf ${TARGET} .i .s *.o
说明: -rm 前面跟的-是说可能某些文件有问题,不用管,跳过去继续执行后面的。
伪目标是不会被执行的,必须在make后面指明才行: make clean
伪目标一般是没有依赖文件的,但是也可以有依赖文件。
比如:一般一个makefile 最终只生成一个最终文件,这样就在第一行写这个最终目标。但是有时候也想生成多个目标文件,这时候就可以用伪目标做。比如我这个makefile文件最终要生成三个目标文件:main obj target
可以这么写:
all : main obj target
.PHONY : all

main : main.c
gcc -o main main.c
obj : obj.c
gcc -o obj obj.c
target : target.c
gcc -o target target.c
all是伪目标,把它放在最开头(注意一定是最开头,因为伪目标放在后面是不会被自动执行的,只有放在最开头的伪目标会被第一个自动执行,放在后面的伪目标必须显示写出来才会执行),它依赖后面三个最终要生成的目标文件,这样就会一下子生成三个目标文件。

make的隐晦规则,make可以自动推导命令。生成每一个.o文件,不需要写后面的命令,会自己对应找源文件,但是这样写不明了,不要这么用。如果工程很大,这么做不清楚。
 main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
这样写,它会自己补全命令,但是这样不清楚表达,不要这样写。

以上学习小结:
1 如何写一个简单的makefile
2 了解makefile工作原理。就是make 工具的原理,检查文件时间属性,需要时才会执行命令。
3 clean伪目标如何写。
4 makefile中变量怎么用
5 makefile中不要使用隐晦的规则,不清楚。

makefile包含5个内容:
1 显示规则
2 隐晦规则
3 变量使用
4 文件指示
  (1)可以包含另一个makefile,就像c语言的include
  (2)根据情况指定有效部分,就像#if
  (3)定义多行命令
5 只有行注释

make工具使用自命名的makefile
比如makefile名字是linux_makefile
这样使用: make -f linux_makefile

makefile的包含规则:(就像c语言中include)
makefile中使用include包含其他的makefile文件
包含其他makefile文件的查找路径:
(1) 在本目录下
(2) 在make -I path 指定的path中查找
(3) 在系统的include路径下查找。比如/usr/include
如果在这些路径中都找不见文件,make会报错。
但是如果这样写:-include a.mk, -代表如果找不见包含的文件,跳过继续执行后面的。

makefile的include可以一次包含多个
比如:有a.mk b.mk foo.make 还有一个变量$(boo)
可以这样: include a.mk b.mk foo.make $(boo)

make的工作方式:
make 读入makefile文件,对于文件中的变量会做替换,但是它会分析依赖关系,如果依赖关系中依赖的文件和目标没有变化,说明后面的命令不会执行,这样它就不会展开这个变量。和c语言中的宏类似。

make会用shell执行命令。

makefile支持的通配符:
*
?
[…]

+++++++++++++++++
不理解:
1 文件搜寻  vpath
2 多目标
3 静态模式
4 自动生成依赖性

+++++++++++++++++

(总)
makefile的书写规则:
在命令前加@就不会终端显示输出了。
make的可选参数:make -s 全面禁止终端输出,和加@一个效果。

make -n 或者 –just-print 表示只是显示如果执行make时将会怎么执行命令,实际不会真正执行。
make –jobs 和 make 一样

命令执行
如果要第一条命令的执行结果应用于第二条命令中,则第二条命令必须分号跟在第一条命令后面,不能写在下一行。

命令出错:
make使用的标准的shell执行命令,就是 /bin/sh,命令的执行结果有返回值,执行正确返回0,否则返回非0.
如果命令的执行结果无论是什么我们都不关心,那么就在前面加-,比如:
clean:
-rm -rf .o   因为无论命令执行结果是什么我们都要删除中间文件,如果*.o不存在命令执行错误,但是也不管,没问题。
make -i 忽略所有命令执行时发生的错误。
make -k 当这个规则中的命令执行出错时,不用管它,继续执行后面的命令。

嵌套执行make
子模块目录中也有自己的makefile,在顶层的makefile中这样写
比如:子模块目录叫 arm
顶层makefile中定义一个伪目标subsystem
subsystem:
$(MAKE) -C arm
或者
subsystem:
cd arm && $(MAKE)
#(MAKE) 是自定义的一个变量,像宏一样的,因为考虑到make需要一些参数
可以直接使用make命令,make -C arm
顶层的makefile的变量不会传递到下层,使用export传递。unexport 不传递。
比如:
MAKE = make
export
这样就把所有的变量都传递到了下层的makefile中。

++++学习到4.4节嵌套执行make+++++

0 0
原创粉丝点击