Makefile相关内容学习(三)

1.显示命令
(1)make会把其要执行的命令行在命令执行前输出到屏幕上。如果在命令前加上“@”字符,则可以使命令不被make显示出来。
例如:@echo 正在编译XXX模块…
当执行make时,会输出“正在编译XXX模块…”
如果前面没有@则会输出
echo 正在编译XXX模块…
正在编译XXX模块…
(2)如果make在执行时,带入make的参数"-n"或者“–just-print”,那么其只是显示命令,但不会执行命令。
(3)make的参数"-s"或者"–slient"则是全面禁止命令的显示
2.命令出错
(1)忽略命令的出错,可以在Makefile的命令前加一个减号"-",则表示不管命令出不出错都认为是成功的。
(2)给make加上“-i”或者“–ignore-errors”参数,那么Makefile中的所有命令都会忽略错误。
(3)给make加上"-k"或者"–keep-going"参数,则表示如果某规则中的命令出错了,那么久终止该规则的执行,但继续执行其它的规则。
3.嵌套执行make
例如:
subsystem:
cd subdir && $(MAKE)
表示先进入subdir目录下然后执行make命令,之所以使用MAKE这个变量,因为make可能会带参数。
export< variable…>表示将变量向下传递
unexport< variable…>表示不向下传递
如果需要传递所有的变量,那么只需要一个export就行了。
-w是嵌套执行中一个参数,“-w”或是“–print-directory”则会在make的过程中输出一些信息,可以看到目前的工作目录。我们可以使用"make -w"来执行,那么进入该目录时,会看到:
make :Entering directory…
完成下层make后离开目录时,会看到:
make:Leaving directory…
4.环境变量
make运行时的系统环境变量可以在make开始运行时被载入到Makefile文件中,但是如果Makefile中已定义了这个变量,或是这个变量由make命令行带入,那么系统的环境变量的值将被覆盖。如果make带上-e参数,系统环境变量将覆盖Makefile中定义的变量
5.call函数
call函数是唯一一个可以用来创建新的参数化的函数。
格式: $(call < expression>,< parm1>,< parm2>,< parm3>…)
例如:
reverse = $(1) $(2)
foo = $(call reverse ,a,b)
则foo的返回值为“a b”
如果 reverse = $(2) $(1)
foo = $(call reverse,a,b)
则foo的返回值为"b a"
6.origin函数
格式: $(origin < variable>)
功能:这个函数并不操作变量的值,只是告诉你variable这个变量来自哪里。这里variable是变量的名字,不应该是引用。因此最好不要在variable中使用" $ “字符。origin的返回值如下:
创建一个Makefile文件,其中内容如下:
在这里插入图片描述
(1)“undefine”:如果这个变量从来没有定义过,则origin函数返回这个值
在这里插入图片描述
(2)“default”:如果变量是一个默认的定义,例如"CC"这个变量。
在这里插入图片描述
(3)“file”:如果变量被定义在Makefile中
在这里插入图片描述
(4)“command line”:如果变量是被命令行定义的
在这里插入图片描述
(5)“environment”:如果变量被定义为环境变量
在这里插入图片描述
(6)“override”:如果变量被override指示符重新定义的
(7)“automatic”:如果变量是一个命令运行中的自动化变量。
7.控制make的函数
(1)error
格式: $(error < text…>)
在这里插入图片描述
执行make err则会使make自动退出
(2)warning
格式: $(warning < text…>)
8.模式规则示例
把所有的[.c]文件都编译成[.o]文件
%.o:%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
" $@ “表示所有的目标的挨个值,” $< “表示所有依赖目标的挨个值,这些被称为自动化变量。
9.自动化变量
(1) $@:表示规则中的目标文件集。在模式规则中,如果有多个目标,那么” $@ “就是匹配于目标中模式定义的集合。
(2) $%:仅当目标是函数库文件时,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)”,那么,” $% “就是"bar.o”," $@ “就是"foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么其值为空。
(3) $<:依赖目标中的第一个目标的名字。如果依赖目标是以模式(“%”)定义的,那么“ $< ”将是符合模式的一系列的文件集。注意:它是一个一个取出来的。
(4) $?:所有比目标新的依赖目标的集合。以空格分隔。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值