makefile 中支持这四个命令:make,make install ,make clean和make uninstall

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命令就能够搞定了,过程是复制,加权限,更新时间戳。

相关文章
相关标签/搜索