Makefile基本规则

基本规则如下:

target [target...] : [dependent ...][ command ...]
# command前必须是TAB

语法示例分析:

helloworld.o: main.o print_hello.ogcc -o helloworld main.o print_hello.o

则对比可看书':'前为target名字,后为依赖。命令行必须为TAB开头。我们发现这里的命令和我们直接在终端执行的命令一样,即shell command可以在Makefile中使用,对的,这也是有些人认为Makefile是增强版的Shell的原因。 我们想执行此target,则执行’Make target‘即可(示例,则执行make helloworld.o)。

Makefile初级语法

Makefile语法中除了基本规则外,Makefile还支持宏定义,显性隐性规则等其他语法。基本的语法有:

  • 宏定义 Makefile中的宏定义类似于变量定义。语法点有: 1. 两种格式

    # '='可以使用在后面定义的变量
    OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2}
    OBJS_2 = ProgamC.o ProgramD.o
    # ':='仅能使用在前面定义的变量
    OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4}
    OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2}
    

    我们用以Macros_Makefile文件来进行这两个格式的对比

    OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2}
    OBJS_2 = ProgamC.o ProgramD.o
    OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4}
    OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2}macro_1:echo ${OBJS_1}
    macro_2:echo ${OBJS_3}
    

    则执行结果为:

    $ make -f Macros_Makefile  macro_1
    echo ProgramA.o ProgramB.o ProgamC.o ProgramD.o
    ProgramA.o ProgramB.o ProgamC.o ProgramD.o
    $ make -f Macros_Makefile  macro_2
    echo ProgamE.o ProgramF.o
    ProgamE.o ProgramF.o
    

    可看到':='使用后面的宏定义并不能生效。 除了在Makefile中定义宏,我们在运行脚本时也可以指定宏,如下:

    $ make -f Macros_Makefile  OBJS_4='ProgamZ.o' macro_2
    echo ProgamE.o ProgramF.o ProgamZ.o
    ProgamE.o ProgramF.o ProgamZ.o
    

    2. Override宏 我们看到宏在运行时可被重新定义,如果不想被重新定义,则需要使用override来声明宏. 更新Macros_Makefile如下

    OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2}
    OBJS_2 = ProgamC.o ProgramD.o
    OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4}
    OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2}
    override OBJS_5 := ProgramI.o ${OBJS_4}macro_1:echo ${OBJS_1}
    macro_2:echo ${OBJS_3}
    macro_3:echo ${OBJS_5}
    

    则执行如下:

    $ make -f Macros_Makefile  OBJS_5='ProgamZ.o' macro_3
    echo ProgramI.o ProgramG.o ProgramH.o ProgamC.o ProgramD.o
    ProgramI.o ProgramG.o ProgramH.o ProgamC.o ProgramD.o
    

    3.目标变量

    <target ...> :: <variable-assignment>
    <target ...> :: ...
    

    我们在Makefile开头定义的宏为全局宏,对所有的target均有效。 而当我们需要定义仅对某一特定目标生效的宏时,我们需要定义目标宏。 我们在TargetMacros_Makefile中进行实验

    OBJ1 = programA.otarget_macro_1: OBJ1 = programB.o
    target_macro_1:echo ${OBJ1}
    

    则执行结果如下

    $ make -f TargetMacros_Makefile target_macro_1
    echo programB.o
    programB.o
    
  • 指定文件路径 当Makefile中牵涉到的文件在不同目录时,我们需要将原文件的路径明确的写在Makefile中,便于Makefile在执行编译时进行查找。Makefile中VPATH这个特殊的变量帮助我们实现这一功能。 VPATH的使用方法有以下几种
    vpath = <directories>   :: 当前目录中找不到文件时, 就从<directories>中搜索
    vpath <pattern> <directories>  :: 符合<pattern>格式的文件, 从<directories>中搜索
    vpath <pattern>  :: 清除符合<pattern>格式的文件搜索路径
    vpath =  :: 清除所有已经设置好的文件路径
    

    我们把所有编译程序放到src文件夹下,编写VPATH_Makefile来实验第一种用法

    VPATH = ./srcGCC = gcc
    OBJECTS = main.o print_hello.o
    HEAD_SOURCE = print_hello.hhelloword.o: ${OBJECTS}${GCC} -o helloworld ${OBJECTS}${OBJECTS}: ${HEAD_SOURCE}
    main.o: main.c
    print_hello.o: print_hello.cclean:rm helloworld ${OBJECTS}
    

    则通过执行‘make -f VPATH_Makefile helloword.o’可得到可执行文件

  • 命令前缀 我们调用命令时,希望命令根据执行时不同的输出及不同的遇错反映,有三种命令格式
    @rm helloworld  # '@'前缀表示,只输出结果,遇错停止执行
    _rm helloworld  # '_'前缀表示,输出执行命令和结果,遇错继续执行
    rm helloworld   # 无前缀,输出执行命令和结果,遇错停止执行
    

    我们编写Prefix_Makefile来进行实验

     test_@:@echo "test the @rm for unexisting files"@rm unexisting_files@echo "echoing after the failure"test_-:@echo "testing the '-rm' for unexisting files"-rm unexisting_files@echo "echoing after the failure"test_:@echo "testing the 'rm' for unexisting files"rm unexisting_files@echo "echoing after the failure"
    

    实验结果为:

     $ make -f Prefix_Makefile test_@test the @rm for unexisting filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: *** [test_@] Error 1$ make -f Prefix_Makefile test_-testing the '-rm' for unexisting filesrm unexisting_filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: [test_-] Error 1 (ignored)echoing after the failure$ make -f Prefix_Makefile test_testing the 'rm' for unexisting filesrm unexisting_filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: *** [test_] Error 1
    

在这一章节中我们学习了,Makefile的基本规则,如何定义编译,查找文件以及调用命令,着手写一些简单的Makefile吧。

Makefile初级语法1相关推荐

  1. Makefile的语法

    一.介绍 1.makefile的条目组成 Linux中使用make命令来编译程序,而make命令所执行的动作依赖于Makefile文件.最简单的Makefile文件如下: hello: hello.c ...

  2. make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)

    目录 含有交叉编译.pthread_create()处理 初次使用 1.编写Makefile文件 2.make 3.make clean Makefile基本语法 1.Makefile规则格式 2.变 ...

  3. 日语初级语法复习 Day 17 Summary(更新中)

    日语初级语法复习 Day17 所有语法,例句统合 Day 1 --は-- 王さんは大学生です. これ/それ/あれ/どれ おすすめはどれですか だれ⇒どなた ここ/そこ/あそこ/どこ ここ/そこ/あそこ ...

  4. Verilog初级教程(2)Verilog HDL的初级语法

    文章目录 前言 正文 注释 空格 操作符 数字格式 字符串 标识符 关键字 verilog修订 写在最后 前言 学习Verilog和学习任何一门编程语言一样,都需要从语法开始,不会语法去学习设计是几乎 ...

  5. 日语初级语法复习整合 Day 11 - Day 15 Summary

    日语初级语法复习整合 Day 11 - Day 15 Day 11 -でしょうか.方をする.名詞+で+できた- 前田さんはもう帰ったでしょうか. 今.東京は暑いでしょうか. この問題はそんなに簡単でし ...

  6. Linux下Makefile编写语法

    原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...

  7. Makefile文件语法规则及用法总结

    一.Makefile的作用 Makefile文件实质上就是一个工程代码编译脚本,一旦写好,只需要一个make命令,整个工程就会自动按照脚本的规定方式编译,极大的提高了软件开发的效率. make是系统指 ...

  8. Linux后台开发系列之「09.Makefile 基础语法」

    Makefile 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! Makefile 简介 Makefile 是一个管理项目的配置文件,它主要有 2 个作用: ...

  9. 【makefile基本语法】

    makefile基本语法 新建makefile 赋值 := = ?= += 换行符 \ 自动化变量 普通makefile 用变量表示依赖文件 使用通配符%和自动化变量$@ $<替代依赖和目标 使 ...

最新文章

  1. pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示...
  2. SAP MM MIGO界面‘Where’标签页里的storage bin
  3. ubuntu安装mysql可视化工具MySQL-workbench及简单操作
  4. sql 不等于空_SQL的简单查询
  5. 【DND图形库】四、文本绘制和按键检测
  6. mysql引擎inndbmmyisam_Mysql中MyISAM引擎和InnoDB引擎的比较
  7. 八个led闪烁c语言程序,闪烁的LED
  8. 中文依存句法分析概述及应用
  9. python程序设计方法学_python学习笔记(12)--程序设计方法学
  10. 以JTextPanel为例Swing的鼠标事件详解
  11. 人月神话(40周年中文纪念版)
  12. python版问答聚合采集工具源代码+反编译完美还原
  13. FPGA图像处理 浅浅浅浅浅记
  14. 中央电大 c语言程序设计a 试题,中央电大208年秋C语言程序设计A试题1.doc
  15. 非对称加密(RSA)详解
  16. 可以查看计算机主要自启动项的技术,电脑中怎么查看启动项
  17. 计算机中各进制之间的转换
  18. Matplotlib 实战总结,超全!超长!
  19. 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
  20. java实现爬虫爬取京东手机页面

热门文章

  1. centos 配置bond_Centos系统配置bond0
  2. 信号归一化功率_利用电机的电信号来检测轴承性能退化
  3. Spring《三》DI 依赖注入
  4. 谁将成为2007年中国互联网的下一代新主角
  5. 我在成都火车站捡了个彝族美女 第4节:我的男士风度
  6. day12 单例设计模式
  7. Xcode中的Target基本使用详解
  8. 达观RPA助力某农商银行搭建智慧银行,为核心业务提供数据互通及步骤简省
  9. Vue 三种带文字分割线实现方式
  10. Python 多线程如何按照任务优先级顺序执行,并根据任务分配来申请线程锁