makefile入门

语法规则

在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。

targets : prerequisites

        command

        ...

或是这样:

targets : prerequisites ; command

        command

        ...

  • targets是文件名,以空格分开,可以使用通配符。一般来说,我们的目标基本上是一个文件,但也有可能是多个文件。
  • command是命令行,如果其不与“targets:prerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号做为分隔。(见上)
  • prerequisites(可选部分)也就是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要,那么,目标就被认为是“过时的”,被认为是需要重生成的。

如果命令太长,你可以使用反斜框(‘\’)作为换行符。make对一行上有多少个字符没有限制。规则告诉make两件事,文件的依赖关系和如何生成目标文件。

一般来说,make会以UNIX的标准Shell,也就是/bin/sh来执行命令。

文件通配符

make支持三个通配符:“*”,“?”和“~”。这是和Unix的B-Shell是相同的。

换行符

反斜杠(\)是换行符的意思,在需要换行的地方使用\ 再换行既可。在后面的声明变量小结你会看到。

变量

Makefile的变量都是字符串:

声明变量

objects = main.o kbd.o command.o display.o \

               insert.osearch.o files.o utils.o

使用变量

edit : $(objects)

        cc -oedit $(objects)

注释

用#表示。

Shell命令

命令符号前缀

Item

Description

@

Causes the command not to be echoed before it is executed.

-

命令行执行有误,只要返回的状态不是0,则可以不要管,继续做后面的事情。

+

在某些特殊flag下命令行是不执行的,比如: -n, -q, or –t。但只要在命令行前面添加了+则必须执行。

退出状态

-q flag的时候:

选项

描述

0

成功完成

1

目标已经最新

>1

发生错误

否则:

选项

描述

0

成功完成

>1

发生错误

引用其它的Makefile

include foo.make a.mk b.mk c.mk e.mk f.mk

-include <filename>;

小减号的意思就是,也许某些文件出现问题,但不要管,继续 做后面的事。

工作方式

1.        读入所有的Makefile。

2.        读入被include的其它Makefile。

3.        初始化文件中的变量。

4.        推导隐晦规则,并分析所有规则。

5.        为所有的目标文件创建依赖关系链。

6.        根据依赖关系,决定哪些目标要重新生成。

7.        执行生成命令。

Make Flags

选项

描述

-DVariable

是指变量的值为1。

-dOption

显示make执行的详细信息,-d默认显示所有调试信息(等同于A):

A

显示所有的debug信息。

a

显示所有关于文档搜索和缓冲的调试信息。

d

显示目录搜索的调试信息。

g1

在创建任何东西之显示输入图表调试信息。

g2

在创建所有东西之后(错误退出之前)显示输入图表调试信息。

m

显示创建目标的调试信息,包括modification日期。

s

显示后缀搜索调试信息。

v

显示变量赋值调试信息。

-e

表示环境变量覆盖makefile中的宏赋值。

-f MakeFile

指定makefile文件名;可以指定多个makefiles,按顺序执行。

-i

忽略非零状态,等同于在每一个命令行前添加了-符号。

-j[Jobs]

建立独立目标的Job时刻以平行执行的,这个选型的作用是指定平行Job的数量。如果没有指定,等于没有限制。

-k

遇错继续执行,但只针对于所依赖的目标本身被创建时没有导致错误。

-n

显示命令,但不执行,除非该命令行有+前缀。

-p

执行命令的时候,显示完整的宏定义集和目标描述。

-q

如果目标文件是最新的,返回0;如果不是最新的,返回1;使用这个选项,目标不会被更新,除非命令行前面有+号。

-r

不使用默认的规则。

-S

如果发生错误,终止make命令。这也是默认行为,和-k相反。

-s

命令行执行的时候不现实在屏幕中,相当于对所有命令不执行echo。

-t

创建目标,或更新目标的modification时间,使它成为最新的。

Target

指定目标名字

清空目标文件

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。一般的风格都是:

clean:

        rmedit $(objects)

更为稳健的做法是:

.PHONY : clean

clean :

        -rmedit $(objects)

.PHONY意思表示clean是一个“伪目标”。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Make命令   在make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:   target1 [target2 …]:[:][dependent1 …][;commands][#…]   [(tab) commands][#…]   方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和"/"符号。除了引用,commands中不能含有"#",也不允许换行。   在通常的情况下命令行参数中只含有一个冒号":",此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。   如果命令行参数中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。   如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错信号。   Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:   Make [flags] [macro definitions] [targets]   Unix系统下标志位flags选项及其含义为:   -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefilemakefileMakefile的顺序搜索 makefile文件。   -i   忽略命令执行返回的出错信息。   -s   沉默模式,在执行之前不输出相应的命令行信息。   -r   禁止使用build-in规则。   -n   非执行模式,输出所有执行命令,但并不执行。   -t   更新目标文件。   -q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。   -p   输出所有宏定义和目标文件描述。   -d   Debug模式,输出有关文件和检测时间的详细信息。   linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:   -c dir   在读取 makefile 之前改变到指定的目录dir。   -I dir   当包含其他 makefile文件时,利用该选项指定搜索目录。   -h   help文挡,显示所有的make选项。   -w   在处理 makefile 之前和之后,都显示工作目录。   通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值