是否有任何类型的 if/else 语句与 GNU make 和 Berkley make (freeBSD) 兼容?
GNU 制造:
ifeq ($(BUILD_TYPE), debug)
伯克利制造:
.ifdef (BUILD_TYPE)
不,您可以做的最好的事情是使用具有构造名称的包含文件,例如:
include $(BUILD_TYPE).mk
其中 BUILD_TYPE 将是“调试”或其他。这当然不如 if/else 强大,但它可以以可移植的方式很好地完成有限的一组事情。
一般来说,几乎不可能编写一个使用比 POSIX 提供的基础功能更复杂的功能的可移植 makefile。makefile 语法如此松散和自由,但传统 make 和 POSIX 标准提供的功能如此贫乏,以至于大多数 make 供应商创建了大量不兼容的扩展。
通常,当人们对此感到疑惑时,我建议他们要么使用 automake,它负责为您编写可移植 makefile 的繁琐工作,要么他们承诺一个或另一个,如果他们不这样做,则只要求人们构建它有它。毫无疑问,GNU make 将在各种各样的平台上运行……甚至是非 POSIX 平台。