Make

原文:https://seankross.com/the-unix-workbench/working-with-unix.html#make

从前没有网页浏览器、文件浏览器、开始菜单或搜索栏。当有人启动电脑时,他们得到的是一个shell提示符,他们做的所有工作都是从这个提示符开始的。那时候,人们仍然喜欢共享软件,但总是存在软件应该如何安装的问题。make程序是解决这个问题的最好的尝试,make的优雅使它至今仍被广泛使用。make的指导设计目标是为了安装一些新软件:

  1. 将所有的依赖下载到一个目录。
  2. cd进入目录。
  3. 运行make

这是通过指定一个名为makefile的文件来实现的,该文件描述了不同文件和程序之间的关系 。除了安装程序之外,make对于自动创建文档也很有用。让我们构建一个makefile,它创建一个readme.txt文件,该文件自动填充有关当前目录的一些信息。

首先进入目录并创建一个文件:

▶ cd ~/Documents/test                                                                                                         
▶ nano makefile

填入如下内容:

draft_journal_entry.txt:
  touch draft_journal_entry.txt

上面简单的makefile说明了一个规则,它的一般格式如下:

  [commands...]

在这个简单的示例中,我们创建了以draft_journal_entry.txt为目标的文件,该文件是作为命令的结果创建的。需要注意的是,目标下的任何命令都必须用Tab缩进。如果我们不使用Tab 来缩进命令,那么make将失败。让我们保存并关闭makefile,然后我们可以在控制台中运行以下命令:

▶ ls
makefile

然后使用下面的操作查看make使用方式:

▶ make draft_journal_entry.txt
touch draft_journal_entry.txt                                                                                                     
▶ ls
draft_journal_entry.txt makefile

在我们为draft_journal_entry.txt目标定义的规则下缩进的命令已经执行,所以现在draft_journal_entry.txt存在!让我们再次运行相同的make命令:

▶ make draft_journal_entry.txt
make: `draft_journal_entry.txt' is up to date.

因为目标文件已经存在,所以没有采取任何操作,相反,我们被告知,draft_journal_entry.txt的规则是“最新的”(没有什么需要做的)。

如果我们看一下我们之前草拟的一般规则格式,我们可以看到我们没有为该规则指定任何依赖项。依赖项是目标在构建时所依赖的文件。如果自上次为目标运行make以来,依赖项已经更新,则目标不是“最新的”。这意味着下次为该目标运行make时将运行该目标的命令。通过这种方式,对依赖项的更改被合并到目标中。为了避免不必要地运行命令,这些命令只在依赖项改变时运行,或者当目标根本不存在时运行。

让我们更新makefile,以包含自动生成的readme.txt。首先,让我们添加文件:

▶ echo "1. 2017-06-15-In-Boston" > toc.txt

makefile修改为:

draft_journal_entry.txt:
  touch draft_journal_entry.txt
  
readme.txt: toc.txt
  echo "This journal contains the following number of entries:" > readme.txt
  wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt

运行下面命令:

▶ make readme.txt
echo "This journal contains the following number of entries:" > readme.txt
wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt

看一下readme.txt

▶ cat readme.txt 
This journal contains the following number of entries:
1

再次运行:

▶ make readme.txt 
make: `readme.txt' is up to date.

修改toc.txt后再次运行:

▶ echo "2. 2017-06-16-IQSS-Talk" >> toc.txt
▶ make readme.txt
echo "This journal contains the following number of entries:" > readme.txt
wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt

▶ cat readme.txt                           
This journal contains the following number of entries:
2 

为了简化make体验,我们可以在makefile的顶部创建一个名为all的规则,在该规则中我们可以列出由makefile构建的所有文件。通过添加all目标,我们可以在不带任何参数的情况下运行make来构建makefile中的所有目标。让我们打开nano并添加以下规则:

all: draft_journal_entry.txt readme.txt

draft_journal_entry.txt:
  touch draft_journal_entry.txt
  
readme.txt: toc.txt
  echo "This journal contains the following number of entries:" > readme.txt
  wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt

同时让我们在makefile的末尾添加另一个特殊的规则clean,它会销毁由我们的makefile创建的文件:

all: draft_journal_entry.txt readme.txt

draft_journal_entry.txt:
  touch draft_journal_entry.txt
  
readme.txt: toc.txt
  echo "This journal contains the following number of entries:" > readme.txt
  wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt
  
clean:
  rm draft_journal_entry.txt
  rm readme.txt

首先让我们清理下我们的目录:

▶ make clean
rm draft_journal_entry.txt
rm readme.txt                                                                                                     
▶ ls
makefile toc.txt

然后重新构建:

▶ make
touch draft_journal_entry.txt
echo "This journal contains the following number of entries:" > readme.txt
wc -l toc.txt | egrep -o "[0-9]+" >> readme.txt
                                                                                                     
▶ ls
draft_journal_entry.txt makefile                readme.txt              toc.txt

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Make

    ###一、make的功能: make是一个用来维护程序模块关系和生产可执行文件的工具,他可以根据程序修改的情况重新编译链接生成的中间代码或最终的可执行文件。执行...

    用户1214695
  • ./configure,make,make install的作用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details...

    bear_fish
  • CMake与Make

    但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译...

    bear_fish
  • Make参数

    指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。如:“make –C ~h...

    宋天伦
  • Linux下解决./configure ,make,make install的报错

    Linux下从源代码下编译安装一个软件有时候会报错,遇到一些麻烦。有些情况即使你用了很多方法去尝试解决,但问题依然存在,那怎么办呢?本教程教你怎么解决Linux...

    黄啊码
  • cd src && make all make[1]: 进入目录“/software/redis-5.0.5/src” CC Makefile.dep make[1]: 离开目录“/softw

    HaC
  • uboot中 make xxx_config 的作用(以make smdk2410_config为例)

    1、创建到目标板相关文件的链接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-arm...

    233333
  • Make Your Octopress Easy

    写了几个shell脚本让你在Octopress上写博客更加轻松些,至少让我轻松了很多,哈哈哈。

    宅男潇涧
  • Make WeChat Great Again

    导语: 关闭朋友圈有一年多了,突然有一天微信的策略变了,在关闭朋友圈的同时也不让别人查看自己的朋友圈了。有妹子表示看不到我朋友圈很不爽,于是我决定对微信进行一番...

    MelonTeam
  • java.lang.reflect.InaccessibleObjectException: Unable to make

    java.lang.reflect.InaccessibleObjectException: Unable to make ...

    一个会写诗的程序员
  • Go new vs make

    Go 提供了两个关键字new 和 make 来为类型分配内存,但两者的功能是不同的,一句话来说就是:new只管 内存分配,而make用来初始化slice,map...

    Dylan Liu
  • It doesn't make sense

    我们的大脑在很多方面都可以算是进化上的奇迹了。在大脑及神经系统的帮助下,我们发明了各式各样的工具和技术。更进一步,利用这些工具和技术我们可以建造摩天大楼,可以将...

    ThoughtWorks
  • new 和 make 转

    示例中的user类型中的lock字段我不用初始化,直接可以拿来用,不会有无效内存引用异常,因为它已经被零值了。

    双面人
  • Go 02 - make & new

    make 在 Go 中只能应用于初始化语言的基本类型 slice / map / channel:

    Reck Zhang
  • make[1]: *** No rule to make target ‘.depend.XXXX‘, needed by ‘.XX‘. Stop.解决

      最近在移植uboot支持NANDFLASH时,遇到一个错误。烦了两天,终于找到了!具体报错如下。

    嵌入式与Linux那些事
  • Linux中的configure,make,make install到底在做些什么

    在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。 有时...

    jeanron100
  • Linux中的configure,make,make install到底在做些什么

    在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。

    二狗不要跑
  • Make 命令教程

    代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。 Make是最常用的构建工具,诞生于1977...

    ruanyf
  • A Simple Introduction to Make

    GNU Make is a tool which controls the generation of executables and other non-so...

    王云峰

扫码关注云+社区

领取腾讯云代金券