这是一个老问题,但这里的所有答案都没有为初学者提供足够的背景知识来选择哪一个。
make
是什么?
make
是传统 Unix 实用程序,它读取 Makefile
文件,以确定运行哪些程序来达到特定目标。通常,该目标是从一组源文件和库构建软件; 但是,make
足够通用,也可以用于各种其他任务,比如从一组 TeX 源文件组装 PDF 或检索列表中每个网页的最新版本。
除了封装达到单个目标的步骤外,make
通过避免重新执行已经完成的步骤来减少处理时间。它通过比较依赖项之间的时间戳来实现这一点;如果 A 依赖于 B 但 A 已经存在且比 B 新,那么就不需要 make A
。当然,为了使此功能正常工作,Makefile
需要记录所有这些依赖关系。
A: B
commands to produce A from B
注意,缩进需要由实际的制表符组成。这是一个
常见的初学者错误。
make
的常见版本
最初的make
相当平凡。它的血统一直延续到今天的BSD make
,而nmake
就是从中派生出来的。粗略地说,这个版本提供了POSIX定义的make
功能,带有一些小的增强和变化。
相比之下,GNU make
显著扩展了形式主义,以至于GNU Makefile
不太可能与其他版本(甚至是旧版本的GNU make
)兼容。有一个惯例叫做将这样的文件称为GNUmakefile
而不是Makefile
,但这个惯例经常被忽视,特别是在像Linux这样的平台上,GNU make
是事实上的标准make
。
使用GNU make
惯例的Makefile
的显著特征是使用:=
而不是=
进行变量赋值(尽管这不是专属于GNU的功能),以及大量的函数,如$(shell ...)
,$(foreach ...)
,$(patsubst ...)
等。
那我需要哪一个?
这真的取决于你希望实现什么。
如果你希望构建的软件有一个vcproj
文件或类似文件,那么你可能想使用它,而不是尝试使用make
。
通常情况下,MinGW make
是GNU make
在Windows上的移植版,它应该能够处理任何你提供的Makefile
。
如果你知道这个软件是用nmake
编写的,并且你已经安装了它,或者很容易获取到它,那么也可以选择使用它。
你应该明白,如果这个软件没有为Windows编写或显式移植,那么它不太可能在不进行重大修改的情况下编译。在这种情况下,让make
运行起来只是你问题中最小的一部分,你需要深入了解原始平台和Windows之间的区别,才有可能自己完成。
更详细地说,如果Makefile
包含像grep
、curl
或yacc
这样的Unix命令,则你的系统也需要安装这些命令。但除此之外,为不同平台编写的C或C++(或更一般地说,任何语言的源代码)可能根本无法工作,在Windows上也可能出现意料之外的问题(这通常更糟糕)。
start >cmd >run >make
不是一个实际的可以执行的序列,对吧? - foxidrive