• Makefile文件应用——simple项目


    • 学习资料

    本文主要参考资料:驾驭Makefile(李云).pdf

    • 原理

    (1)最基本的语法

    targets: prerequisites

      command

    targets是目标,prerequisites是先决条件,目标依赖于先决条件。

    command是生成目标的命令。

    这一整个形式就是规则。

    (2)目标的生成

    一个目标的生成(目标不存在或者依赖比目标新才会重新创建目标):

    (1)先判断目标是否有依赖,有则寻找相应规则生成依赖;

    (2)没有依赖,运行命令生成target。

    (3)依赖的生成递归调用(1)和(2)

    如下图所示:

     

    (3)Makefile目标语法

    • 默认目标为第一个目标
    • 伪目标,可以用.PHONY: clean【避免与现有的文件同名】
    • simple项目

    写Makefile文件之前,需要先想好依赖关系,再进行编写。

    假设现在有foo.c和main.c两个文件,则依赖关系如下:

        foo.o    foo.c
    
    simple
    
        main.o   main.c

    生成main.o命令:gcc -o main.o -c main.c

    生成foo.o命令:gcc -o simple main.o foo.o

    gcc的-o选项,指定输出文件的文件名

    gcc的-c选项,仅作预处理、编译和汇编并生成目标文件

    • 变量

    (1)变量定义及引用

    定义:EXE = simple

    引用:$(EXE)或${EXE}

    (2)特殊变量

    $(MAKE) -》 make命令名是什么

    $(MAKECMDGOALS) -》 make的目标是什么

    (3)变量的类别

    EXE = simple 递归扩展变量

    EXE := simple 简单拓展变量,只进行一次扫描和替换

    EXE ?= simple 条件赋值变量,当前变量以前没有定义就进行赋值,否则不处理

    (4)自动变量

    目标和先决条件在规则的命令中多次出现,应尽量避免

    $@是指 造成命令运行的目标(可能有多个)。

    $^是所有先决条件

    $<是第一个先决条件

    (5)变量来源

    • Makefile定义的变量
    • 自动变量,如$@ $^ $<等,根据上下文自动获得变量值
    • Shell环境
    • 在运行make命令是定义变量

    (6)高级变量引用

    $(EXE:.o=.c)自动完成后缀替换,可用patsubst完成同样的功能。

    (7)override指令

    不希望Makefile文件中定义的变量被覆盖掉。

    • 模式

    对于多个规则去生成多个目标文件,如main.o和foo.o都有一条规则进行描述。

    每一个object文件都有一条规则的话,这是非常麻烦的。

    %.o : %.c ; 
        <command ......>;

    在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。

    如果要生成的目标是 a.o b.o,那么%c 就是 a.c b.c,则会产生两个目标,规则分别如下。

    foo.o : foo.c ; 
        <command ......>;
    main.o : main.c ; 
        <command ......>;
    • 函数

    (1)wildcard

    在Makefile规则中,通配符会被自动展开,但在变量的定义和函数引用时,通配符将失效。

    如果需要通配符有效,就需要使用函数“wildcard”,用法是:$(wildcard PATTERN...) ,如$(wildcard *.c)。

    在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表

    如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空

    (2)patsubst

     patsubst函数是用来进行字符串替换的,语法:

    $(patsubst pattern, replacement, text)

    eg:$(patsubst %.c, %.o, $(mixed))

    (3)addprefix

     addprefix函数是用来给字符串的每个子字符串前加上一个前缀,语法:

    $(addprefix prefix, names...)

    (4)filter

     filter函数用于从一个字符串中,根据模式得到满足模式的字符串,语法:

    $(filter pattern..., text)

    (5)filter-out

     filter-out函数用于从一个字符串中,根据模式去除满足模式的字符串,语法:

    $(filter-out pattern..., text)

    (6)strip

     strip函数用于去除变量中多余的空格,语法:

    $(strip string)

  • 相关阅读:
    java 线程之间的协作 wait()与notifyAll()
    加密web.config中的邮件配置mailSettings
    TCP编程,Socket通讯
    jQuery插件学习笔记
    抹掉Scala的糖衣(14) -- Update Method
    UVA 12034 Race (递推神马的)
    struts2 命名空间 namespace 学习
    Vim -&gt; 移动光标
    【跟我一步一步学Struts2】——Struts2工作流程
    Python中sort以及sorted函数初探
  • 原文地址:https://www.cnblogs.com/songdechiu/p/10507980.html
Copyright © 2020-2023  润新知