《GNU make》学习笔记(二)---Makefile概述

 2.1 Makefile的内容

  在一个完整的Makefile中,包含了5个东西:显式规则、隐含规则、变量的定义、指示符和注释

  关于“规则”、“变量”和“Makefile指示符”将在后续的章节进行详细的讨论。 

  Makefile指示符:指示符指明在make程序读取makefile文件过程中所要执行的一个动作。

  注释:Makefile中“#”字符后的内容被作为是注释内容(和shell脚本一样)处理。

           如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结尾如果存在反斜线(\),那么下一行也被作为注释行。

           一般在书写Makefile时推荐将注释作为一个独立的行,而不要和Makefile的有效行放在一行中书写。

          当在Makefile中需要使用字符“#”时,可以使用反斜线加“#”(\#)来实现,其表示将“#”作为一字符而不是注释的开始标志。


注意:

        Makefile中第一个规则之后的所有以[Tab]字符开始的的行,make程序都会将其给系统的shell程序去解释执行。


2.2 Makefile的命名

  1.默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。

  2.推荐使用“Makefile”,而“GNUmakefile”是我们不推荐使用的文件名,因为以此命名的文件只有“GNU make”才可以识别,而其他版本的make程序只会在工作目录下查找“makefile”和“Makefile”这两个文件。

  3.如果make程序在工作目录下无法找到以上三个文件中的任何一个,它将不读取任何其他文件作为解析对象。但是根据make隐含规则的特性,我们可以通过命令行指定一个目标,如果当前目录下存在符合此目标的依赖文件,那么这个命令行所指定的目标将会被创建或者更新。

eg:

   当前目录下不存在以“GNUmakefile”、“makefile”、“Makefile”命名的任何文件,

  (1). 当前目录下存在一个源文件foo.c的,我们可以使用“make foo.o”来使用make的隐含规则自动生成foo.o。当执行“make foo.o”时。我们可以看到其执行的命令为:
cc –c –o foo.o foo.c
之后,foo.o将会被创建或者更新。
  (2). 如果当前目录下没有foo.c文件时,就是make对.o文件目标的隐含规则中依赖文件不存在。如果使用命令“make foo.o”时,将回到到如下提示:
make: *** No rule to make target ‘foo.o’. Stop.
   (3). 如果直接使用命令“make”时,得到的提示信息如下:
make: *** No targets specified and no makefile found. Stop.

 4.当makefile文件的命名不是这三个任何一个时,需要通过make的“-f”或者“--file”选项来指定make读取的makefile文件。给make指定makefile文件的格式为:“-f NAME”或者“--file=NAME”,它指定文件“NAME”作为执行make时读取的makefile文件。也可以通过多个“-f”或者“--file”选项来指定多个需要读取的makefile文件,多个makefile文件将会被按照指定的顺序进行连接并被make解析执行。当通过“-f”或者“--file”指定make读取makefile的文件时,make就不再自动查找这三个标准命名的makefile文件。


2.3 包含其它makefile文件

  1.Makefile中包含其它文件的关键字是“include”。“include”指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取。

  2.include使用格式

    include FILENAMES...

      (1).指示符“include”所在的行可以一个或者多个空格(make程序在处理时将忽略这些空格)开始,切忌不能以[Tab]字符开始(如果一行以[Tab]字符开始make程序将此行作为一个命令行来处理)。

      (2).来看一个例子,存在三个.mk文件,“$(bar)”被扩展为“bish bash”。则
                 include foo *.mk $(bar)
                 等价于

                 include foo a.mk b.mk c.mk bish bash

      (3).make程序在处理指示符include时,将暂停对当前使用指示符“include”的makefile文件的读取,而转去依此读取由“include”指示符指定的文件列表。直到完成所有这些文件以后再回过头继续读取指示符“include”所在的makefile文件。

  3.当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的告警提示,但是不会立刻退出。而是继续处理Makefile的内容。当完成读取所有的makefile文件后,make将试图使用规则来创建通过指示符“include”指定的但未找到的文件(参考2.7 makefile文件的重建一节),当不能创建它时(没有创建这个文件的规则),make将提示致命错误并退出。会输出类似如下错误提示:
Makefile:错误的行数:未找到文件名:提示信息(No such file or directory)

Make: *** No rule to make target ‘<filename>’. Stop


2.4 环境变量MAKEFILES

   linux中有个环境变量MAKEFILES。可以用echo $MAKEFILES查看变量的值。

   1.如果当前环境定义了一个“MAKEFILES”的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其它Makefile文件一样,如果文件名非绝对路径而且当前目录也不存在此文件,make会在一些默认的目录去寻找。

   2.MAKEFILE环境变量和include的区别。

      (1).环境变量指定的makefile文件中的“目标”不会被作为make执行的“终极目标”

      (2).环境变量所定义的文件列表,在执行make时,如果不能找到其中某一个文件(不存在或者无法创建)。make不会提示错误,也不退出。就是说环境变量“MAKEFILES”定义的包含文件是否存在不会导致make错误(这是比较隐蔽的地方)。

   3.变量“MAKEFILES”主要用在“make”的递归调用过程中的的通信(参考4.6make的 递归执行一节)。实际应用中很少设置此变量.因为一旦设置了此变量,在多层make调用时;由于每一级make都会读取“MAKEFILES”变量所指定的文件,这样可能导致执行的混乱(可能不是你想看到的执行结果),而且可移植性会变差。推荐的做法实:在需要包含其它makefile文件时使用指示符“include”来实现。


2.9 make如何解析makefile文件

   GUN make的执行过程分为两个阶段。
   第一阶段:读取所有的makefile文件(包括“MAKIFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(--file)”指定的makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。

   在第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

2.9.1 变量和函数的展开问题

   在make执行的第一阶段中如果变量和函数被展开,那么称此展开是“立即”的,此时所有的变量和函数被展开在需要构建的结构链表的对应规则中(此规则在建立链表是需要使用)。其他的展开称之为“延后”的。
   变量取值的展开:当变量使用追加符(+=)时,如果此前这个变量是一个简单变量(使用 :=定义的)则认为它是立即展开的,其它情况时都被认为是“延后”展开的变量。
   条件语句:所有使用到条件语句在产生分支的地方,make程序会根据预设条件将正确地分支展开。
   规则的定义:规则中目标和依赖如果引用其他的变量,则被立即展开。而规则的命令行中的变量引用会被延后展开。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值