学习 Makefile:规则是否适用于 Make 的所有实现?

Learning Makefile: Are the rules universal across all implementations of Make?

我有兴趣学习 Makefile 项目的艺术。但是,我有一个顾虑。

背景: 在我的计算机上,我安装了 nmake,我假设安装时附带了 Visual Studio。我可能正在考虑让我的 C++ 项目使用 nmake 的 makefile 结构。但是,如果我想转移到其他流行的 make 版本怎么办? gmake?这引出了我的主要问题:

如果我学习了 makenmakegmake)的一种实现方式并转向了另一种实现方式,我可以预期 makefile语法?在 conventions/practices?

如果每个实现之间存在实质性差异,我有一个后续问题(有点自以为是):

我应该先学习 make 的哪个实现,为什么?

cmake 根本不是 make 的实现。这是一个完全不同的工具:cmake是一个创建项目构建控制文件的工具,例如makefiles,Visual Studio项目文件,Xcode项目文件,Eclipse项目文件等。Cmake语法与make语法没有任何关系。

nmake 是一个 "sort of" make 工具,但它也不同于其他版本的 make; make 的大多数其他版本(GNU make、Solaris make、BSD make 等)至少符合 make 的 POSIX 规范。 nmake(据我所知)不会那样做。然而,用于定义规则的 nmake 的基本语法与其他版本的 make 相似。

GNU make 是一个高度便携的 make 版本,支持 POSIX,外加大量不可移植的扩展。但是,GNU make本身具有很强的可移植性:除了Windows(native和cygwin均可)和UNIX(BSD、Linux、Solaris等)系统外,它还支持VMS等操作系统。

在以上选项中,nmake 是最少 可移植选项;它仅在 Windows 上可用。如果你想使用各种开发工具,cmake 是一个不错的选择,但它在任何方面都不像 make。如果您想学习 make 和 makefile 并能够跨各种平台移植,那么最好的选择是 GNU make。