MAKEFILE文件使用说明

MAKEFILE文件使用说明:linux

  • Make

shell下执行make,查找文件的顺序以下GNUmakefile => makefile => Makefile,一般状况都是用Makefile来命名shell

make -f xxx ,-f是指定文件名macos

make 默认执行Makefile的第一个目标函数

make 后面的参数能够给文件里面的变量赋值,如make TARGET=allui

 

简单事例:lua

事例一,内含多个目标构建:spa

  

 

事例二,pbc在mac与linux下的构建:命令行

   

 

 

  • 规则三要素:目标、依赖、命令
    • 每个命令的起始符必须是Tab,命令能够是shell命令或shell下可执行的程序
    • 目标,能够是单个或多个,如 all linux macosx:
    • 依赖,能够是一个表达式目标/模式变量,如$(TARGET) : PARAM := xxx,同时也能够是另外一个目标
    • 命令,跟目标依赖同一行时用’;’与依赖隔开,换行须要用Tab键开头

 

以下就是一个简单的目标实例:TARGET是目标,pbc-lua53.c是依赖,命令行Tab键开头orm

$(TARGET) : pbc-lua53.cblog

$(CC) $(CFLAGS)  -shared -o $@ -I../.. -I$(LUADIR) $^ -L../../build -lpbc

 

Makefile文件能够包含多个规则,当第一个规则的命令在执行的时候发现没有相应的依赖,就从后面的规则中寻找。

最前面的规则是终极目标必定写在最前面,也就是最后要生成的文件。

 

  • 原理,如图

  

    1. 读入全部Makefile
    2. 读入被include的全部Makefile
    3. 初始化文件中的变量
    4. 推到隐晦规则,并分析全部规则
    5. 为全部的目标文件建立依赖关系链
    6. 根据依赖关系决定哪些目标从新生成
    7. 执行生成命令

 

  • 自动化变量
    • $<:规则中第一个依赖
    • $@:规则中目标名
    • $^:规则中全部依赖
    • $(TARGET):TARGET为声明的变量

 

  • 符号
    • =,基本赋值,变量的值会是整个makefile展开后的值
    • ?=,若是没有被赋值,就赋值
    • :=,覆盖以前的值,变量的值取决于它在makefile中的位置,而不是整个makefile文件展开后的最终值
    • +=,添加等号后面的值
    • # 注释
    • % 自动匹配,如%.o:%.c。目标:依赖
    • 反斜杠(\),换行符

 

例,Makefile的内容以下,包含条件表达式:

ifdef DEFINE_VRE
    VRE = “Hello World!
else
endif

ifeq ($(OPT),define)
    VRE ?= “Hello World! First!
endif

ifeq ($(OPT),add)
    VRE += “Kelly!
endif

ifeq ($(OPT),recover)
    VRE := “Hello World! Again!
endif

all:
    @echo $(VRE)

敲入如下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

 

= 与:= 的区别以下

 x = foo

    y = $(x) bar

 x = xyz

       执行后y的值为 xyz bar ,而不是 foo bar 

x := foo

            y := $(x) bar

            x := xyz

执行后y的值为foo bar

  • 函数
    • src=$(wildcard ./*.c),wildcard查找当前目录的全部.c文件返回给src
    • obj=$(patsubst ./%.c, ./%.o, $(src)),patsubst是替换当前目录全部.c文件为.o文件
    • .PHONEY:clean 的做用,忽略当前目录的clean文件是否存在。假如Makefile文件统计目录也有clean文件,若是没有.PHONEY的声明,是没法执行make clean 操做
    • @echo,输出当前行,若是用echo则当前命令行也会输出
    • VPATH 文件查找。如 vpath %.c src,表示在src目录查找.c结尾的文件,多个目录用:隔开,如src:src2
    • foreach,$(foreach <var>,<list>,<text> ),如
      • names := a b c d
      • files := $(foreach n,$(names),$(n).o)
      • $(files)的值是“a.o b.o c.o d.o”。

 

    • include,引入多个makefile文件,如include platform.mk a.make $(M),表示同时引入platform.mk与a.make文件。include后面只能有一个空格符号
相关文章
相关标签/搜索