美文网首页
makefile简述

makefile简述

作者: 骑猪满天飞 | 来源:发表于2021-02-28 11:50 被阅读0次

makefile 基本语法

目标文件:依赖文件
[Tab] 命令

上述makefile语法被称为一组规则

  • 目标文件是此规则想要生成的文件
  • 依赖文件指生成目标文件所用到的其他文件,是一个文件列表
  • 命令指此规则中要执行的shell命令。一个命令独占一行,行首必须以Tab键开头。

make程序通过比较依赖文件和目标文件的mtime属性,判断是否执行命令。

当test2的mtime比test1新时,将执行相应的命令

test1:test2
    echo "test1"
maketest.png

当我门修改test1,此时test1的mtime比test2新,则不再执行命令


test1.png

伪目标

当makefile中有多个规则时,通过make <指定目标名> 的方式,可以单独执行目标名处的规则如:

jmp.png

ps:@可以在输出中屏蔽命令显示

然而,当target2的mtime比test1新时,make target2 将不执行对应命令,有时候我们希望有些命令不管在什么情况下都能执行,这时候就需要用到伪目标了。

当规则中不存在依赖文件时,这个目标文件名就被称为伪目标。它的作用就是为了纯粹的执行命令。为避免伪目标与真实目标同名,可以用.PHONY关键字来修饰它。

如:

all.png

一些约定的伪目标

phonytarget.png

递归式推导目标

现在有如下两个C文件和对应的makefile文件:

test1.c:

void my_print(char*);
void main(){
    my_print("hello world\n");
}

test2.c:

#include <stdio.h>

void my_print(char* str){
    printf(str);
}

makefile:

test2.o:test2.c
    gcc -w -c -o test2.o test2.c
test1.o:test1.c
    gcc -w -c -o test1.o test1.c
test.bin:test1.o test2.o
    gcc -w -o test.bin test1.o test2.o
all:test.bin
    @echo "done"

执行make all命令的流程如下:

  1. make 发现all的依赖文件test.bin不存在,就去寻址以test.bin为目标文件的规则
  2. 找到对应规则后,发现test.bin的依赖文件test1.o不存在,于是去找test1.o为目标文件的规则。
  3. 找到test1.o对应的规则后,执行gcc -w -c -o test1.o test1.c
  4. 回到test.bin对应规则,发现依赖文件test2.o不存在,于是去找test2.o为目标文件的规则。
  5. 找到test2.o对应的规则后,执行gcc -w -c -o test2.o test2.c
  6. 回到test.bin对应规则,执行gcc -w -o test.bin test1.o test2.o
  7. 回到all对应的规则,执行@echo "done"
makefiletest.png

自定义变量和系统变量

自定义变量

定义变量格式:变量名=值(字符串),多个值之间用空格分开

变量引用:$(变量名)

如上节中的makefile可以改为:

test2.o:test2.c
    gcc -w -c -o test2.o test2.c
test1.o:test1.c
    gcc -w -c -o test1.o test1.c
objfiles = test1.o test2.o
test.bin:$(objfiles)
    gcc -w -o test.bin test1.o test2.o
all:test.bin
    @echo "done"

系统变量

sys_var.png

自动化变量

自动化变量可以代表一组文件名。

以下为一些自动化:

$@ 表示规则中的目标文件名集合
$< 表示规则中依赖文件的第1个文件
$^ 表示规则中所有依赖文件的集合
$? 表示规则中,所以比目标文件mtime新的依赖文件集合

用自动化变量修改前面的makefile文件:

test2.o:test2.c
    gcc -w -c -o test2.o test2.c
test1.o:test1.c
    gcc -w -c -o test1.o test1.c
objfiles = test1.o test2.o
test.bin:$(objfiles)
    gcc -w -o $@ $^
all:test.bin
    @echo "done"

$@ 表示规则中的目标文件:test.bin

$^ 表示规则中的所以依赖文件:test1.o test2.o

规则模式

make支持字符串正则匹配

% 匹配多个非空字符

前面的mkefile可用匹配模式修改为:

%.o:%.c
    gcc -w -c -o $@ $^
objfiles = test1.o test2.o
test.bin:$(objfiles)
    gcc -w -o $@ $^
all:test.bin
    @echo "done"

相关文章

  • makefile简述

    makefile 基本语法 目标文件:依赖文件[Tab] 命令 上述makefile语法被称为一组规则 目标文件是...

  • 编写Makefile及简单分析

    makefile的好处:一次编写,终身受益 makefile的命名规则: makefile Makefile ma...

  • Makefile 工程管理

    Ⅰ Makefile的用途 Ⅱ Makefile的构成 Ⅲ Makefile构成-----规则 Ⅳ Makefil...

  • win_c/c++ mess01

    1. win makefile 1.1 win makefile,eg: 1.2 makefile explai...

  • [C] Makefile

    Makefile Blog [Makefile的简便写法] [Makefile]菜鸟教程 [gcc编译声明问题] ...

  • 迅为IMX6ULL开发板Ubuntu下C编程入门(二)

    本文是介绍3.3 初识 Makefile+3.4Makefile语法 3.3初识Makefile 3.3.1什么是...

  • Make

    make 目标 顶层 Makefile 作为入口, 来调用其他 makefile, 顶层 makefile 一般有...

  • undefined reference问题分析

    1.简述 嵌入式Linux软件开发过程中,需要开发者自己编写makefile脚本编译程序,在编译程序时,经常会遇到...

  • Makefile学习笔记

    Makefile学习笔记 学习Makefile的资料 《跟我一起写makefile》 《GUN make manu...

  • Linux Kernel Makefiles特殊符号

    Makefile基本规则: Makefile文件中可使用特殊的符号简化Makefile文件的书写。 1、$@:表示...

网友评论

      本文标题:makefile简述

      本文链接:https://www.haomeiwen.com/subject/tjkgfltx.html