我想知道为什么Linux中的makefile非常有用(我的意思是实际意义上的)。 为什么我们不能以正常的方式编译所有的程序呢?
Makefiles为你做了很多工作,而且往往比人们意识到的更强大。 采取以下简单的生成文件
all: helloworld
(gnu make,至少)会知道运行cc -o helloworld helloworld.c
然后,随着项目的增长,你又添加了一个规则:
helloworld: ui.o xml.o mailcomponent.o $(CC) $(CFLAGS) -o $@ $@.c $^
并知道运行
cc -c ui.c cc -c xml.c cc -c mailcomponent.c cc -o helloworld helloworld.c ui.o xml.o mailcomponent.o
然后说,你想optomize一切。
CFLAGS=-O2
在文件的开始照顾你。
当项目变大时,跟踪那些已经和没有改变的文件,防止无关和费时的重新编译。
Makefiles是美妙的时代,甚至没有涉及到更高级的食谱。
Linux的normal way
是使用make文件。
它是由人们通过手工编写更复杂的应用程序或使用自制脚本所犯的所有错误而演变而来的。 表示复杂项目的构建依赖关系并不重要。 简单地说就是提供一种标准的方式来指定这样的依赖关系和一个工具来解析依赖关系并运行相关的构建行为。
即使是简化/自动化构建过程的UI,您也可以在后台使用make文件或类似的东西。
UPDATE
对于那些想知道汽车制造商评论的人来说,这里有两个不同的观点
http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool
http://www.scurrilous.com/blog/archives/2005/08/23/i-hate-automake/
因为正常的方式涉及重复,很容易被错误输入,特别是当命令变得越来越多和更多的依赖性出现时。 创建一个makefile文件意味着至少需要make
,然后make install
。
makefile是有用的,因为(如果正确定义的话)只允许重新编译你需要做的修改。
在一个大型的项目中,重建程序可能需要一些时间,因为会有很多文件被编译和链接,并且会有文档,测试,例子等等。当你在项目上工作并且做了一些改变的时候,不得不等待每一次重建一切。
一个生成文件存储一个列表“输入”文件,“输出”文件和“命令”所需的输出生成输出。 当您对项目进行更改时,命令make
将使用相应输出文件的日期检查输入文件的日期,如果输入文件已更改,则将通过运行命令来重新创建相应的输出。
这当然是一个非常粗略的描述,因为make比这更复杂(拓扑排序,宏命令,并行执行)…但它应该给你一个想法。
在每次更改时重建所有内容都需要花费太多时间,而只需手动重建就会出错(如果您忘记重新组合一个内容,您可能会认为您所做的更改是可以的,而实际上它正在破坏您根本没有重新编译)。
请注意,今天有很多构建系统比makefile更复杂(例如,通过分析平台和源代码自动生成makefile)。
那些工具是一个银色的子弹或寻找问题的解决方案是值得怀疑的(我有偏见,因为我讨厌构建工具,他们讨厌我…不知何故,他们的自动检测逻辑从未在我的机器上正常工作)。
复杂性和时间。 一个中/大规模的项目包含数百个文件与数百个依赖项。 你想记住他们吗? 手动建立项目时很容易出错。 你可以很容易地忘记一个依赖。 而一个大项目可能需要几分钟才能建立。 跟踪时间,只重新编译那些必要的东西,以便在开发过程中不需要等待几分钟。
总结就是让生活更轻松。
正常的方法是使用makefile。
这是有用的,因为它被设计为一个工具完全是为了这个目的:-)这就是为什么它也是一个正常的方式。 🙂