makefile

Makefile 的结构:

target : prerequisites
    recipe(命令行,必须以 TAB 开头)
target:目标(最终生成的文件,比如可执行文件或 .o 文件)

prerequisites:依赖(生成该目标所需的源文件或目标文件)

recipe:规则(编译或操作命令,必须以一个 Tab 键 开头)

最终目标:edit(可执行文件)

edit : main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o

  • 含义:
    目标是 edit(可执行程序)
    依赖于 8 个 .o 文件(目标文件)
    第二行是 gcc 链接命令,把所有 .o 文件链接生成最终的 edit 可执行文件

  • 后面几行编译每一个 .c 文件为 .o 文件

  • 最后clean 规则(非文件目标)

    clean :
    rm edit main.o kbd.o command.o display.o
    insert.o search.o files.o utils.o
    clean 是一个伪目标(不是生成的文件)
    作用是删除所有中间文件和最终的 edit,保持工程整洁
    可用命令:make clean

  • 还可以使用赋值符:

  1. 赋值最后一个有效值 =(延时赋值)
  2. 赋值前最后一个有效值 :=(及时赋值)
  3. 未赋值过则赋值 ?=
  4. 变量追加 +=
  • 使用通配符来简化过程 %
    使用赋值和通配符之后
  • 自动化变量

  • 伪目标

还有多目标、函数等

二、Makefile 中常用函数介绍
Makefile 内置函数使用方式如下:

$(函数名 参数)
例如:

FILES := $(wildcard *.c)
  1. foreach:对一组值循环处理

$(foreach var, list, text)

含义:对 list 中每个元素赋值给 var,然后执行 text

示例:

SRC := main.c util.c test.c
OBJ := $(foreach file, $(SRC), $(file:.c=.o))

结果:OBJ 等于 main.o util.o test.o

  1. wildcard:获取匹配文件列表(通配符)

    $(wildcard pattern)

示例:

  SRC := $(wildcard src/*.c)

意思:获取 src 目录下所有 .c 文件

  1. patsubst:模式替换

    $(patsubst pattern, replacement, text)

作用:在 text 中,把符合 pattern 的部分替换成 replacement

示例:

  SRC := a.c b.c c.c
  OBJ := $(patsubst %.c, %.o, $(SRC))
结果:OBJ 是 a.o b.o c.o
  1. filter / filter-out(补充):

    $(filter pattern..., text) # 保留匹配 pattern 的
    $(filter-out pattern..., text) # 排除匹配 pattern 的

示例:

SRC := main.c test.c debug.c
REAL := $(filter-out test.c debug.c, $(SRC))

结果:REAL 只有 main.c

可参考https://github.com/seisman/how-to-write-makefile