make的简单使用个人整理篇

28 篇文章 0 订阅

 

make的简单使用个人整理篇

格式:

目标 〔属性。。。〕

分隔符 〔依赖文件〕 〔;命令菜单〕

< 制表符 > 命令菜单}

 

makefile 根据符号 tab 来辨认命令

 

make 命令的运行格式:

make option macrodef target

make 将使用默认的 makefile Makefile 作为配置文件

也可以指定配置文件,用参数- f

例如: make –f test1.mk

Option指出make的工作行为,make的具体选项有:
-c dir make在开始运行后的工作目录为指定目录
-e 不允许在makefile中队环境的宏赋值
-f filename 使用指定的文件作makefiel
-k 执行命令出错时,放弃改目标去维护其它目标
-n 按实际运行时的执行顺序现实命令,包括用@开头的命令,但不振的执行
-p -现实makefile中所有的宏定义,河内部规则
-r 忽略内部规则
-s 执行但不显示命令,常用来检查makefile的正确性
-S 执行make时 出错即退出
-t 修改每个目标文件的创建日期,但又不正的创建
-V 打印make的版本号
-x 将所有的宏定义输出的shell环境中
-i  忽略运行make 中的错误,而又不退出make

 

make 按规则中的依赖文件依次从左到右检查,除非依赖文件为源文件,否则 make 将递归方式检查该依赖文件的依赖文件。

 

可以用 touch 命令强行修改文件的修改时间

 

可以使用变量(宏)来缩减 makefile 的文件大小

定义: CC=gcc

引用: $(CC)

 

%o:%c

      $(COMPILE) –o $@ $<

 

可以同时使用多个依赖文件匹配多个目标文件

例如:

io.o init.o:muprogram.h

配合上面的规则,执行命令,表示该目标文件还同时依赖于 muprogram.h 文件

 

可以使用特殊的目标文件( clean

例如:

clean:

       -rm $(OBJS)

make 不会自动执行 clean 目标, clean 也没有任何依赖文件

 

makefile 文件中的分隔符:

::表示目标文件将多次出现。使用“:”时, make 规定目标文件只能出现一次

^ 将指定的依赖文件和目标文件已有的依赖文件合并起来,作为新的依赖文件列表

:-清除原有的依赖文件,将新的依赖文件列表作为目标的文件列表

:!对每个更新过的依赖文件都执行一次命令菜单

| 只在内部规则中使用???

 

Makefile 文件中的命令行属性:

默认情况下,系统执行每条命令,打印该命令,如果在运行命令时出错,就会退出 make

命令行属性的选项:

忽略该行的错误,继续执行下一命令

强行执行该命令

@ 不显示命令行

 

makefile 文件中的目标文件属性:

格式 1

属性 1 属性 2 。。。:目标文件 1 目标文件 2 。。。

格式 2

目标文件 属性 1 属性 2 。。。:

 

常见的几种属性:

.IGNORE 忽略错误,继续执行

.SILENT 不现实目标文件下的命令行

.PRECIOUS 保留中间目标文件。默认情况下,退出 make 时,系统将自动删除临时的中间目标文件。

 

伪目标选项:

伪目标 就是程序执行的一些与目标文件本身没有直接关系的辅助性操作。

1.   自定义伪目标

要求系统中没有重名的文件

2.   内部伪目标

.ERROR: 依赖文件 1 。。。          当执行错误时,显示错误信息,并完成简单的错误处理

 

.INCLUDE: makefile 文件 1 。。。    当执行到该伪目标时,插入其他 makefile 文件的内容,并且执行该内容。

例如: .INCLUDE make.mk

当其他 makefile 文件不在同一目录下,使用格式:

.INCLUDE:dir1 dir2 …

  .INCLUDE:<dir/file>

 

.IMPORT: 宏名 1 。。。           在环境变量中查找宏名,并使用。不需要命令行

make 本身定义了一个依赖文件 .EVERYTHING 可以使用环境中的所以宏定义,而不需要逐一列出宏名。

例如:

.IMPORT:.EVERYTHING

 

.EXPORT: 宏名 1 。。。           导出宏名到环境文件中

 

.SETDIR path                   指定工作目录

 

make 的命令参数

………………

 

可以通过 3 中方式控制命令行的执行属性:

命令行、目标文件、 make 命令参数

当出现矛盾时,体现一般服从特殊的原则。

 

 

宏定义:( makefile 文件中的“宏”又叫做“变量”)

宏名 赋值符号 宏的值

其中,宏名不能以数字开头

赋值符号包括:

           直接赋值到宏

:=        将后面的字符串常量赋值给宏

+=        使宏原来的值加上一个空格,再加上后面的字符串,作为新的宏值

 

宏的引用:

$( 宏名 )

或: ${ 宏名 }

 

内定义宏

1 、控制宏      控制 make 的属性,代表某些特殊的值

.MAKEDIR     调用 make 的绝对路径名

.NULL            空字符串

.OS               正在运行的操作系统名

.PWD             运行 make 时的活动工作目录的绝对路径名

.SHELL          运行命令行时启动的 SHELL 类型

调用格式: $ (宏名)

 

2 .属性宏      控制 make 的属性,作用域为整个 makefile 文件

调用格式        不必使用 $ 和括号

例如:

.IGNORE=$(.NULL)

 

动态宏

$@         当前的目标文件名。当目标文件是库成员,则等于 lib 的名称。

$%         当前的目标文件名。当目标文件是库文件时,指示成员名

$>          类似 $@ ,但不能用于普通目标文件中

$*           等于目标文件去掉后缀的名字

$^          当前目标文件在本规则中的依赖文件

$&          当前目标文件的所有 依赖文件

$?           当前目标文件的所有 的依赖文件中比目标文件新的文件列表

$<          当前规则的依赖文件中比目标文件新的文件列表

 

修改宏

d          仅展开路径

b          展开文件名,不包括扩展名

f          展开文件名,包括扩展名

例如:

$(FILE:d)

 

替换宏中的字符串

宏名: s/ 原字符串 / 新字符串

 

宏名 :+ “后缀”、

宏名 :^ “前缀”

例如(宏 FILE=main ):

$(FILE:^”/user/”)                        表示 /user/main

$(FILE:+”.o”)                             表示 main.o

 

内部规则

make 的内部规则是系统或用户预先定义的一些特殊规则,它普遍适用于 makefile 文件中的各个目标文件,只要目标文件的后缀名相匹配。

内部规则的目标文件和依赖文件只使用后缀名来表示。

 

c 语言中涉及到的内部规则如下:

.c:

       $(CC)$(CFLAGS) –O $@ $<

.c .o:

       $(CC)$(CFLAGS) –c $<

其中, CC/CFLAGS make 的预定义宏

内部规则可以是单后缀或双后缀

单后缀给出的是目标文件,而没有依赖文件。

双后缀的前一个后缀是后一个后缀的依赖文件,双后缀命令行体现了前一个后缀向后一个后缀转化的过程

在上例中,“ .o ”为后缀的目标文件依赖于“ .c ”为后缀的依赖文件,并且给出了转化过程。

 

另两个 make 的预定义宏:

       MAKE/MAKEFLAGS :常用于在 makefile 文件中再调用一个 make 过程。适用于对 makefile 文件的模块化设计。

 

当“ .o ”为后缀的目标文件没有显式的规则文件时,系统根据匹配的内部规则,自动将该类的后缀名改为内部规则的依赖文件的后缀名,并以相应的值填写入规则的命令行中,实现一个完整的规则。

 

Make 的递归

可以使用宏 $(MAKE) 来递归调用 make 命令,执行子模块的 makefile

格式:

目标文件:

       $(MAKE) –C 目录名

 

可以在各个 make 过程中,进行变量设置通信。

1.   使用一个被所有 makefile 包含的文件

2.   从顶级 make 中输出变量到他的子进程,它使用 export 关键字

 

文件中再调用一个make 过程。适用于对 makefile 文件的模块化设计。

 

当“ .o ”为后缀的目标文件没有显式的规则文件时,系统根据匹配的内部规则,自动将该类的后缀名改为内部规则的依赖文件的后缀名,并以相应的值填写入规则的命令行中,实现一个完整的规则。

 

Make 的递归

可以使用宏 $(MAKE) 来递归调用 make 命令,执行子模块的 makefile

格式:

目标文件:

       $(MAKE) –C 目录名

 

可以在各个 make 过程中,进行变量设置通信。

1.   使用一个被所有 makefile 包含的文件

2.   从顶级 make 中输出变量到他的子进程,它使用 export 关键字

 

伪目标
     .PHONY: clean
    clean:
            rm *.o temp

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值