Skip to main content

make

软件开发中,make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。它是一种转化文件形式的工具,转换的目标称为“target”;与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。
许多现代软件的开发中,集成开发环境已经取代 make,但是在 Unix环境中,仍然有许多任务程师采用 make来协助软件开发。

目录

起源

目前虽有众多依赖关系检查工具,但是make是应用最广泛的一个。这要归功于它被包含在Unix系统中。斯图亚特·费尔德曼在1977年在贝尔实验室里制作了这个软件。2003年,斯图亚特·费尔德曼因发明了这样一个重要的工具而接受了美国计算机协会(ACM)颁发的软件系统奖。
在make诞生之前,Unix系统的编译系统主要由“make”、“install”shell脚本程序和程序的源代码组成。它可以把不同目标的命令组成一个文件,而且可以抽象化依赖关系的检查和存档。这是向现代编译环境发展的重要一步。

不同版本

make程序已被用户多次重/改写,其中包括几次用相同的文件格式和算法原理重新编写,并且依照不同需要添加了一些不常见的改良。

GNU make

GNU make仿照make的标准功能(通过clean-room工程)重新改写,并加入作者觉得值得加入的新功能,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。

BSD make

是从Adam de Boor的制作的版本上发展成的。它编译目目标时候有并发计算的能力。它在FreeBSDNetBSDOpenBSD中不同程度的修改下存活了下来。

Microsoft nmake

广泛应用于微软Windows微软的nmake是不要与来自AT&T贝尔实验室的Unix系统nmake混淆。

优点和缺点

就像其他和make有着悠久历史的软件一样,它有着很多的拥护者和反对者。它的很多问题因现代大型的软件项目的出现而暴露出来。但是很多人争论说它在常见的情况下可以很好的工作,而且使用非常的简单,功能强大,表达清楚。无论如何,make仍然被用来编译很多完整的操作系统,而且现在替代品们在基本的操作上与它没有太大差别。
随着现代的集成开发环境(IDE)的诞生,特别是非Unix的平台上,很多程序员不再手动管理依靠关系检查,甚至不用去管哪些文件是这个项目的一部分,而是把这些任务交给了他们的开发环境去做。类似的,很多现代的编程语言有自己特别的高效的依赖关系的设置方法。

makefile的基本结构与make的运作流程

makefile的格式是:
#用“井”号表明注释。
target(要生成的文件): dependencies(被依赖的文件)
        #命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
        命令1
        命令2
        命令3
          .
          .
          .
        命令n
#可以使用“\”表示续行。注意,“\”之后不能有空格!
  • target通常是我们要生成的文件的名字,摆放的顺序不重要,但第一个target是默认的target。当make不带参数时,自动执行第一 个target。target也可以是要求make完成的动作,执行这种target后并不能得到和target同名的文件,因此,也称为伪 target(phony target)。
  • dependencies是生成target所需的文件名列表。依赖可以为空,常用的“clean”target就常常没有依赖,只有命令。
  • 命令可以是任何一个shell能运行的命令。
举例来说明makefile的结构和make如何运作。
editor: main.o text.o
        gcc -o editor main.o text.o
main.o: main.c def.h
        gcc -c main.c
text.o: text.c com.h
        gcc -c text.c
install:editor
        mv editor /usr/local
当我们输入:
make
或者
make editor
当editor这个target文件不存在,或者main.o、text.o这两个依赖文件被修改,都会导致make调用其下的命令“gcc -o editor main.o text.o”;接下来,由于引用到main.o和text.o,make会检查main.o的依赖main.c、def.h有无更新,如果有,则执行其 下的命令“gcc -c main.c”;同样的道理,也适用于text.o。 于是,可有几种不同的输出:
  • 第一次运行:
gcc -c main.c
gcc -c text.c
gcc -o editor main.o text.o
  • main.c或/和def.h有修改:
gcc -c main.c
gcc -o editor main.o text.o
  • text.c或/和com.h有修改:
gcc -c text.c
gcc -o editor main.o text.o
  • main.c和text.c均有修改:
gcc -c main.c
gcc -c text.c
gcc -o editor main.o text.o
当我们输入:
make install
make会检查install的依赖editor是否是最新,如果是,则执行其下的命令“mv editor /usr/local”。由于这个过程并没有产生名为“install”的文件,所以,install是一个假目标。

makefile的基本语法

  • 宏:“宏”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义宏,使用“$(宏名)”来使用宏;还可以用“+=”追加宏的内容。习惯上,宏名使用大写。承接上面的例子:
OBJECTS = main.o text.o
INSTALL_PATH = /usr/local
editor: $(OBJECTS)
        gcc -o editor $(OBJECTS)
main.o: main.c
        gcc -c main.c
text.o: text.c
        gcc -c text.c
install:editor
        mv editor $(INSTALL_PATH)

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...