make工具的使用例子

makefile例子

# 描述:complicated 项目 makefile文件
# 版本:v1.1
# 修改记录:
# 1. 为complicated项目makefile添加注释

# 终极目标规则,生成complicated可执行文件
complicated: main.o complicated.o
    gcc -o complicated main.o complicated.o

# 子规则1, main.o的生成规则
main.o: main.c
    gcc -o main.o -c main.c

# 子规则2,complicated.o的生成规则
complicated.o: complicated.c
    gcc -o complicated.o -c complicated.c
# 描述:complicated 项目 makefile文件
# 版本:v1.2
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile

# 定义可执行文件变量
executbale := complicated
# 定义源文件列表变量
sources := main.c complicated.c
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 定义编译命令变量
CC := gcc

# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
#  使用自动化变量改造我们的编译命令
    $(CC) -o $@ $^

# 子规则1, main.o的生成规则
main.o: main.c
    $(CC) -o $@  -c $<

# 子规则2,complicated.o的生成规则
complicated.o: complicated.c
    $(CC) -o $@  -c $<
# 描述:complicated 项目 makefile文件
# 版本:v1.3
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则

# 定义可执行文件变量
executbale := complicated
# 定义源文件列表变量
sources := main.c complicated.c
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 定义编译命令变量
CC := gcc
RM := rm -rf

# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
#  使用自动化变量改造我们的编译命令
    $(CC) -o $@ $^

# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c
    $(CC) -o $@  -c $<

# clean规则
.PHONY: clean
clean:
    $(RM) $(executbale) $(objects)
# 描述:complicated 项目 makefile文件
# 版本:v1.5
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则
# 5. 引进wildcard函数,自动扫描当前目录下的源文件
# 6. 加入自动规则依赖

# 定义可执行文件变量
executbale := complicated
# wildcard函数扫描源文件,定义列表变量
sources := $(wildcard *.c)
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 使用变量的引用替换,定义依赖描述文件列表
deps := $(sources:.c=.d)

# 定义编译命令变量
CC := gcc
RM := rm -rf

# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
#  使用自动化变量改造我们的编译命令
    $(CC) -o $@ $^

# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c
    $(CC) -o $@  -c $<

# clean规则
.PHONY: clean
clean:
    $(RM) $(executbale) $(objects) $(deps)

# 自动规则依赖
sinclude $(deps)

$(deps):%.d:%.c
    $(CC) -MM $< > $@
  • 一个在makefile中引用变量的例子
    • 变量的引用有以下几种方式
      • ${变量名}
      • $(变量名)
      • $单字符变量名 ,变量名仅包含一个字符,如 @ 、 @ 、 @^等
# 变量定义
objects = program.o foo.o utils.o

program : $(objects)          #在依赖中引用变量
    gcc -o program ${objects} #在命令中引用变量

$(objects) : defs.h           #在目标中引用变量
  • 使用赋值操作符= 、 += 和 ?=定义的变量都是递归展开式变量,使用赋值操作符 :=定义的变量为直接展开式变量

  • 特殊的变量

    • \$@– 代表规则中的目标文件名

    • \$<– 代表规则的第一个依赖的文件名

    • \$^– 代表规则中所有依赖文件的列表,文件名用空格分割

  • $(VAR:A=B)或者${VAR:A=B},意思是,将变量“VAR”所表示的值中所有字符串“A”结尾的字符替换为“B”的字

  • 多目标规则示例

all: target1 target2
    echo "This is a rule for $@"

# 利用多目标规则合并 target1 和target2的规则
target1 target2: dep
    echo "This is a rule for $@"

dep:
  • 静态模式简化
# 静态模式规则简化complicated makefile
$(objects): %.o: %.c
    $(CC) -o $@  -c $<
  • 伪目标例子
# complicated项目添加clean 规则
.PHONY: clean #.PHONY定义是定义伪目标的语句
clean:
    rm -rf complicated complicated.o main.o
  • 关闭命令回显

    1. 每个需要关闭回显的命令行前加上"@"字符
    2. 执行make时带上参数-s或–slient禁止所有执行命令的显示
    3. 在Makefile中使用没有依赖的特殊目标.SILENT也可以禁止所有命令的回显
  • 函数调用方式

    • $(FUNCTION ARGUMENTS)
    • ${FUNCTION ARGUMENTS}
  • 当我们在执行gcc时带上-MM选项时,gcc工具就会为我们列出指定文件对其他文件的依赖关系列表

你可能感兴趣的:(工具)