FreeBSD 上的 make 不支持 "ifdef" 指令

The make on FreeBSD doesn't support "ifdef" directives

我的 FreeBSD11.0,发现 make 无法处理 ifdef 指令。例如:

ifdef VERBOSE
Q :=
else
Q := @
endif

make会抱怨:

make: "/root/Project/powermon/Makefile" line 13: Need an operator
make: "/root/Project/powermon/Makefile" line 15: Need an operator
make: "/root/Project/powermon/Makefile" line 17: Need an operator

我目前的解决方案是使用 gmakeFreeBSD 上的任何 make 端口是否支持处理 ifdef

BSD make 使用与 GNU make 不同的语法和不同的功能。您显示的代码片段对于 BSD make 应该如下所示:

.ifdef VERBOSE
Q :=
.else
Q := @
.endif

你基本上有三个选择:

  1. 如果您的软件专门针对 BSD,请使用 BSD make 语法编写 Makefile。 man make(1) 有完整的 FreeBSD 手册 make
  2. 编写一个可移植的 Makefile。这只会使用每个已知 make 工具实现的 make 最基本的 功能(例如,不要使用任何模式规则等)。这可能很乏味,还有其他工具可以通过 生成 Makefile 来帮助管理这个问题,例如 cmakeGNU autotools.
  3. 编写一个 GNU make Makefile(将其命名为 GNUmakefile 可能是个好主意,因此它永远不会被除 GNU make 之外的任何其他 make 解释)并依赖于 GNU make几乎无处不在。对于 FreeBSD,这意味着安装适当的端口。

如果您选择第三个选项,您可以添加一个 "wrapper" Makefile,例如这个:

GNUMAKE?= gmake

all:
    ${GNUMAKE} $@

.DEFAULT:
    ${GNUMAKE} $@

.PHONY: all

在 BSD 上键入 make 将导致 BSD make 读取此文件并相应地调用 gmake。在 GNU 系统上(其中 make 是 GNU make),当存在 GNUmakefile 时该文件将被忽略——GNU make 更喜欢这个而不是 Makefile.

编写类似内容的一种更便携的方法是:

Q$(VERBOSE) := @