Makefile学习

来源:互联网 发布:关于大数据的电子书 编辑:程序博客网 时间:2024/05/18 18:02

一、make是如何工作的

    1、make在当前目录找“Makefile”或“makefile”的文件
    2、如果找到,接着找第一个目标,作为终极目标
    3、如果不存在,或者目标后面所依赖的[.o]文件的修改时间比目标新,将执行命令生成目标
    4、如果目标依赖的[.o]文件也存在,那么make将找[.o]的依赖,并按规则生成[.o]文件(有点像堆栈)
    5、当然C文件和H文件是存在的,于是make会生成.o文件,然后再用.o文件生成make的终极目标,也就是可执行文件
    make只管文件的依赖性,一层一层去找文件的依赖关系,直到生成第一个目标

二、Makefile的基本规则

    target ... : prerequistes ...
        command                        #必须以[tab]键开始    
        ...
        ...
    例子:
    edit :main.o display.o
        cc -o edit main.o display.o    

    main.o : main.c play.h
        cc -c main.c -I ./

    display.o : display.c play.h
        cc -c display.c -I ./

    .PHONY:clean

    clean:                         # 一般将clean放在最后面,因为谁也不可能将clean作为终极目标(#注释)
        rm -fr main.o display.o

三、make中使用变量

    obj = main.o \
          display.o
    edit : $(obj)
        cc -o edit $(obj)
        于是又新的.o加入只需要修改obj(类似于宏)

    PWD=$(shell pwd)  使用shell函数语句

四、make的自动推导

    make看到一个.o文件,会自动识别将.c文件加在依赖之中。并自己推导命令
    上面的例子可写成:
    edit :main.o display.o
        cc -o edit main.o display.o    

    main.o : play.h
    display.o : play.h
                

五、总述

    1、makefile里面的五个东西:
        显示规则:显示说明了,如何生成一个或多个的目标文件。
        隐晦规则:make的自动推导功能
        变量定义:这个变量比较像C语言中的宏
        文件指示:包括三个部分,一个makefile中引用另一个makefile;根据某些情况指定makefile的有效部分;定义多行命令
        注释:和Shell行注释一样使用#注释,需要使用#号则用“\#”
    2、makefile文件名,别名使用 make -f Make.file
    3、引用其它Makefile
        include <filename>  #前面使用空格不能使用[tab]
        make会寻找include中的Makefile,并放置在当前位置
    4、工作方式
        1)读入所有的Makefile
        2)读如include包含的其他Makefile
        3)初始化文件中的变量
        4)推导隐晦规则,并分析所有规则
        5)为所有的目标文件创建依赖关系链
        6)    根据依赖关系、决定哪些文件需要重新生成
        7)执行生成命令

六、书写命令

    1)@echo XXX
    用@不会显示出命令
    2)命令执行:
        exec:
            cd /home/hchen
            pwd

        exec:
            cd /home/hchen ; pwd 或者 cd /home/hchen && pwd   #&&前面执行成功才执行后面的

    3)export 变量
        将变量传递到下层的Makefile中
       unexport 变量
        不让变量传递到下层的Makefile
    4)if语句:

       ifeq(0,${MAKELEVEL})
           命令
       endif
    5)变量替换
       ${var:a=b}将var中以“a”结尾的“a”,替换为“b”

       foo := a.o b.o c.o
       bar : = $(foo:.o=.c)  将.o文件替换为.c文件

    6)多层变量:
       x=y
       y=z
       z=u
       a:= $($($(x))) = u

    7) 追加变量值
       obj += func.o
    8) 指定目标:
       all :   这个伪目标是所有目标的目标,其功能一般是编译所有目标
       clean :     这个伪目标一般是删除被make所创建的文件
       install:这个伪目标是安装已编译号的程序,其实就是把目标执行文件拷贝到指定的目录去
       print :这个伪目标是列出所有改变过的源文件
       tar :把源程序打包
       check:测试makefile的流程
    9) 自动化变量:
       $@:表示规则中的目标集
       $%:仅当目标是函数库文件中,表示规则中的目标成员名
       $<:依赖目标中的第一个目标名字
       $?:所有目标新的目标的集合,以空格分割
       $^:新的目标依赖集合
       $+:所有依赖集合

    


0 0
原创粉丝点击