Makefile

基本格式

1
2
3
目标...:依赖...
命令
...

注意为Tab,不得出现空格

变量

系统变量

$(变量名)

自定义变量

  • = 延迟变量(不调用不改变)
  • := 立即赋值
  • ?= 空赋值
  • += 追加赋值

    自动化变量

  • $< 第一个依赖文件
  • $^ 全部的依赖文件,若目标中有重复文件将只保留一份
  • $@ 目标的集合
  • $% 当目标为函数库的时候表示规则中的目标成员名。若目标不是函数库文件则值为空
  • $? 所有比目标新的依赖目标集合,以空格隔开
  • $* 表示目标模式中”%”及其以前的部分
  • $+ $^类似但不主动除去

    伪目标

    仅执行命令的目标与目录下存在的文件名冲突时,例如clean
    声明方式:
    1
    .PHONY:clean

    模式规则

    % 长度任意的非空字符串,当”%”出现在目标时,目标中的”%”决定依赖中的”%”值

    条件分支

    1
    2
    3
    4
    5
    6
    ifeq (var1,var2)
    ...
    else
    ...
    endif

    1
    2
    3
    4
    5
    6
    ifneq (var1,var2)
    ...
    else
    ...
    endif

    函数

    模式替换函数patsubst

    $(patsubst %.c,%.o,x.c.c bar.c) 将“x.c.c bar.c”中以“.c”结尾的单词替换成“.o”

    取文件名函数notdir

    $(notdir src/foo.c hacks)取出路径中非目录的部分

    wildcard 获取匹配模式文件名函数

    $(wildcard *.c)返回当前目录下所有“.c”源文件列表

    foreach循环函数

    $(foreach VAR,LIST,TEXT)LIST中以空格间隔的单词逐个赋值给VAR进行TEXT中的运算
    # 头文件依赖 # 文件描述符和打开模式
    1
    2
    3
    4
    5
    6
    int fd;
    fd = open(filename,flags,mode);
    lseek(fd,offset,whence);
    write(fd,buf,write_len);
    read(fd,buf,read_len);
    close(fd);
    ## 文件描述符 特殊的索引

文件打开模式

主模式

  • O_RDONLY:只读模式
  • O_WRONLY:只写模式
  • O_RDWR:读写模式
    副模式
  • O_CREATE:文件不存在时创建文件
  • O_APPEND:追加模式
  • O_DIRECT:直接IO模式
  • O_SYNC:同步模式
  • O_NOBLOCK:非阻塞模式

    系统IO编程

  • open
  • write
  • read
  • lseek
  • close

    标准IO编程