1.makefile文件的主要结构简介:linux
makefile文件里面主要有三种内容:shell
1.变量声明:工具
变量声明就是一种基本的严格字符替换的操做。ui
好比在前面声明了:objects=program.o foo.o utils.o翻译
那么在后面出现的全部$(objects)或者${objects}都会被自动替换成上面的那个字符序列,并且是严格替换,即不带空格的。blog
2.映射法则继承
3.命令:get
映射法则和命令一般都是联合起来组成这样的结构形式:emacs
target... : prerequisites..it
command
能够简单地理解为经过prerequisites,也就是先决的依赖文件,采起后面描述的相应的命令(这里的命令都是linux里的shell命令)command以后(通常是)生成了文件target。命令的前面都要按如下tab建留一段空白来表示它是命令。
有的target后面并无先决条件,也就是后面的命令是无条件执行的。
这个结构总的做用就是告诉make,target是否是out of date,具体视它的依赖文件而定,target不存在也视为out of date。而后就是若是过时了,那么更新,就是运行下面的命令来更新。
2.前面那篇文章emacs中咱们创建了两个makefile文件,可是是空的,尚未任何内容。如今咱们填上以下内容:(这个是一个最简单的例子,不过是一个不错的入门。)
在/project/hello的主目录下面的makefile文件的内容以下:
prefix = /usr/local
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
export prefix
export exec_prefix
export bindir
all clean install uninstall :
cd src && $(MAKE) $@
.PHONY: all clean install uninstall
在/project/hello/src目录下面的makefile文件内容以下:
all: hello
hello: main.c
$(CC) -o $@ main.c
clean:
rm hello
install:
install -d $(bindir)
install -m 0755 hello $(bindir)
uninstall:
rm $(bindir)/hello
.PHONY: all clean install uninstall
咱们等下详细说明,先看下运行状况:
如今makefile支持这四个命令:make,make install ,make clean和make uninstall。
咱们从上图能够看出能够直接从终端调用咱们生成的程序hello,而后返回“hello,the world!”。
首先咱们看主目录下的makefile文件,前面那部分是变量声明,这个等下还会说到。而后是export 变量,这个就是主目录下的主makefile文件可使用这个命令,意思是将变量和子一级目录下的makefile共享。
而后咱们看到
all clean install uninstall :
cd src && $(MAKE) $@
.PHONY: all clean install uninstall
这其实是一个跳转结构,首先介绍下.PHONY是个什么意思,前面说了每个target默认都是一个待生成文件,可是.PHONY:后面跟着的target的意思是这些target不用生成文件。那么总的来讲这里的all,clean,install,uninstall在这里是些没有依赖文件的不用生成最终target文件的执行命令了。这些执行命令就是前面说的make,make install ,make clean和make uninstall。make的意思实际上就是make all,这两个命令是没有区别的。
而后咱们看到命令,cd src这个很容易理解,就是跳转到src目录中去了。而后&&符号的意思是逻辑与,即前一命令执行完以后再执行后面的命令。然后面的$(MAKE)多是一个具备系统默认值的变量,在这里应该就是make。而$@符号的意思则是指代当前的target。好比说我如今make clean ,那么命令最终就成了这个样子:
cd src &&make clean
而后下一个make clean的命令其实是对src子目录下的makefile文件说的,咱们看到这里简单的:
clean:
rm hello
即把生成的可执行文件hello删掉便可。
而后咱们再来看子目录下那个makefile文件如何处理make all 命令:
all: hello
hello: main.c
$(CC) -o $@ main.c
咱们看到,这里首先说明all依赖于hello,而后hello依赖于main.c,而要生成或者更新hello的话须要执行下面的命令:
cc -o hello main.c
上面的$(CC)也是具备系统默认值的变量,就是cc,不过在GNU/LINUX体系下可能调用的是gcc工具。后面的选项-o的意思是编译链接而后生成后面的那个名字的文件。名字在这里就是hello。
而后咱们再来看make install命令执行的状况:
install:
install -d $(bindir)
install -m 0755 hello $(bindir)
前面说过了这个变量是继承自主目录makefile文件中的定义,而后翻译出来$(bindir)就是/usr/local/bin。linux系统在终端能够直接调用的命令存放点有两个位置,另外的一个是/usr/bin。/usr/local文件夹内部的结构和/usr内部的结构很是类似。彷佛讲起来/usr是供系统内部的软件使用的空间,但这个规矩并非死的。
uninstall命令咱们看到就是一个删除对应位置hello文件的操做。因此如今就把linux中的install命令讲讲就能够了。
第一个install命令接着-d的选项的意思就是目录确认,在这里我以为有点多余。
第二个install命令接着-m的选项的意思就是把hello复制到指定的目录中去,而后相应文件也就是hello文件的权限设置成为0755.关于权限我以为在这里彷佛也没有什么好说的。在这里用第二个install命令就能够搞定了,过程是复制,加权限,更新时间戳。