makefile 打印_使用Makefile来封装操作

我讨厌记住各种奇怪的命令

有时, 困扰我的不是问题本身, 而是各种各样的操作细节占据我的头脑,让我不能把这些行为转化为下意识。

需求

我希望的,其实很简单

  1. 我不想记住一些操作,我要能够直接看到所有有可能用到的操作。

  2. 当操作比较长的时候,很容易敲错键盘浪费时间,我需要能够补全操作。

  3. 我希望操作可以组合起来,一个命令可以执行多个操作的组合。

目前来看,Makefile是实现上述需求的天然载体。

Makefile简介

以前程序员在命令行编译, g++ main.cc -o app.  

当项目变大,当参数变多,依赖变多,复杂的命令行是人无法维护的。 于是,有人在shell的基础上定义了一种语法来封装这种互相依赖的操作, 这就是Makefile。 

后来有了更加方便的cmake来生成Makefile, 大家就忘记了Makefile本来是就是为了封装操作的, 而编译只是常见的一种复杂操作而已。

操作演示

细节说明

2b9c7c95f3f96c8257e386fa05e2c1a1.png

第1行指定使用bash 而不是Makefile自己的解释器,因为我们更加熟悉bash。

如果不指定第2行的话, 那么每个target内部每一行的代码彼此独立互不影响。

第3行, 指定run这个target的执行与否和run这个文件是否存在无关。

以前Makefile主要用于编译,target都是以文件命名的,文件存在则该target不会执行, 我们要手动避开这种情况。

第4,5行定义一些Makefile的变量, 供target内部使用(13行)。

第6行是第一个target, 当执行make的时候, 会默认调用第一个target, 我习惯在这个target放打印完整Makefile的操作。

注意第20行。 

当执行make run的时候, Makefile的解释器会执行下列操作。 

  1.  将target内部的代码中出现${}的地方用Makefile的变量替换。

  2. 将替换后的结果用bash一行一行的执行。

图中的cmd变量, 我们希望这个变量存在于第二步, 为了避免它在第一步中被当成Makefile的变量替换掉,要在前面再加一个$进行转移。

第24行,version这个Makefile的变量可以通过“version=v1.0.1 make export”的方式设置。我们可以利用这个方法来传参。

上述描述存在一些描述不准确的地方, 比如Makefile其实既可以通过${}引用变量, 也可以通过$()引用。但是知道一种可用的就够了, 我不想为你引入不必要的细节。我分享给你的是如何用Makefile封装操作, 而不是Makefile的教程。

是否Makefile是最好的策略?

  1.  如果用shell的话当然可以, 但是需要自己写case语句,而且没有补全。

  2. python有个类似Makefile的, 叫invoke. 好处是可以调用python的库, 可以用python的语法糖。但是坏处是需要安装invoke。 

写在结尾的话

我不想只是做一个自己心得分享的公众号, 我想做一个真正能够为用户创造价值的产品。

当我遇到了问题, 思考,有了创造性的, 合理的, 不涉密的答案,我想把它分享给你。

如果能够对你产生同样的价值, 那将是我的荣幸。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值