Makefile学习笔记(三)

书写命令

每条命令必须以[Tab]键开头,除非命令紧跟在依赖规则后面的分号后。在命令行之间的空格和空行会被忽略,但是如果该空格或者空行是[Tab]键开头的话,那么make还是会认为这是一个命令。

一、显示命令

通常,make会把在执行每行命令之前先把它输出在屏幕上后再执行。
不过我们也可以让它不输出在屏幕上。当我们用@字符放在命令行前时,那么命令将不会被显示出来。

二、命令执行

make是一条接一条的执行命令,如果我们想让上一条命令执行的结果应用到下一条命令时,应该使用分号分隔开这两条命令。如果我的第一条命令的cd,我下一条命令是想在cd命令的基础上再继续执行其他命令,那么我们就得把这两条命令放在同一行上,并且中间用分号隔开。
例:

flag:
[Tab]cd /home/work;  pwd

flag是一个伪目标,所以我们调用make flag时程序的功能就是进入cd命令路径下的目录,并且输出当前目录的整个路径("/home/work")
但是,如果我们两条命令没有放在同一行,而是分两行来写的,那样输出的结果是什么呢?
例:

flag:
[Tab]cd /home/work
[Tab]pwd

答案揭晓,输出结果应该是这个makefile文件的所在路径。而不会输出/home/work

三、命令出错

为了防止某条命令意外出错而终止所有的命令继续往下执行,我们可以在命令行前面添加一个“-”号,标记为不管命令是否出错都继续往下执行

还有一个可以在调用make命令的时候添加一个参数也是上面这种效果,就是“-i”参数或者“–ignore-errors”参数。

另外一个是“-k”参数或者“–keep-going”参数,这个参数的意思就是某规则中的命令出错了,那么就终止该规则的执行,继续往后执行,这个上面那两个处理问题的方法有区别,上面的是执行完之后出错了不理睬继续往后执行,而这一个则是遇到会执行错误的命令选择不执行它,跳过继续往后执行。

四、嵌套执行make

我们有一个子目录叫subdir,这个目录里面有一个makefile文件,用来指明这个目录下文件的编译规则。那么我们的总控makefile可以这样写:

subsystem:
[Tab]cd   subdir   &&   $(MAKE)

其等价于:

subsystem:
[Tab]$(MAKE)   -C  subdir

$(MAKE)是宏变量,当我们make需要一些参数时,我们就只需要改一改变量的参数,而不需要在代码块改许多地方。上面的功能是先进入subdir目录再执行make命令。

如果我们要将变量传递到下一级makefile文件当中,我们可是一这样声明:

export   <variable ...>

如果我们不想将某些变量传递到下一级makefile文件当中,我们可是一这样声明:
unexport <variable …>

如果我们要传递所有的变量到下一级makefil中,那我们只需要一个export就可以了

五、定义命令包

如果makefile里面出现了一些相同命令序列,那我们可以为这些相同的命令序列定义一个变量。语法是以define开头,以endef结束。
例:

define run-yacc
    yacc $(firstword $^)
    mv y.tab.c $@
    endef

run-yacc是命令包的名字,不要和makefile里面的变量重名。在define和endef中间的两行就是这个命令序列。
假如有如下示例:

foo.c : foo.y
            $(run-yacc)
可以发现,这好像和使用变量没什么区别
命令包中的“ $^ ”就是依赖文件”foo.y“
命令包中的“$@”就是依赖文件”foo.c“.

参考资料:

https://blog.csdn.net/haoel/article/details/2891

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思识己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值