gnu make、microsoft nmake和posix标准make有多相似/不同?
显然,这要看“哪个操作系统?”,“哪个编译器?”和“哪个链接器?”,但我特别指的是makefile本身的语法、语义和命令行选项。
如果我按照gnu make手册编写makefile,那么我需要注意哪些最重要的可移植性问题?
gnu make、microsoft nmake和posix标准make有多相似/不同?
显然,这要看“哪个操作系统?”,“哪个编译器?”和“哪个链接器?”,但我特别指的是makefile本身的语法、语义和命令行选项。
如果我按照gnu make手册编写makefile,那么我需要注意哪些最重要的可移植性问题?
GNU Make(一种自由软件构建工具)和POSIX Make共享一个共同的核心,因此GNU Make可以理解为POSIX Make而编写的makefile并以相同的方式解释它们 - 几乎没有例外。 但是,许多GNU Makefile使用了仅在GNU Make中可用的功能。有时这是故意的和明确的; 有时不是(“有时不是”是一个问题)。我对Microsoft nmake不太熟悉;我认为它很可能紧密贴合POSIX Make语义,但它将拥有自己不同的扩展集。
总的来说,像autoconf这样的程序生成的内容与可移植Makefile相近。
要注意在使用GNU Make时的主要问题是所有扩展函数符号,这些符号用于将文件名(宏)映射为有用的值。虽然它们无疑非常有用,但它们也会导致移植性陷阱。
'%.x'标记用于后缀规则,在POSIX make
规范中未定义 - 它们被认为是一种常见的扩展:
包含字符
'%'
和'"'
的目标的解释是实现定义的。
MAKEFLAGS
变量相关),特殊目标(大写字母,以点号开头)和内置规则变化很大。但例如.PHONY
特殊目标似乎即使在Gnu Make之外也得到支持。我认为唯一安全的方法是测试您的makefile。如果你想玩得更保险,遵循POSIX规范,即使它定义了一个非常有限的make。 - Palec
.POSIX
特殊目标,但仍然会启用许多扩展功能。 - Palec