FreeBSD 上的 make 不支持“ifdef”指令

Nan*_*iao 3 freebsd makefile gnu-make

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

ifdef VERBOSE
Q :=
else
Q := @
endif
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案正在使用gmake。那么是否有任何make端口FreeBSD支持处理ifdef

小智 5

BSD make 使用不同的语法并具有与 GNU make 不同的特性。对于 BSD make,您显示的代码段应如下所示:

.ifdef VERBOSE
Q :=
.else
Q := @
.endif
Run Code Online (Sandbox Code Playgroud)

您基本上有三个选择:

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

如果您使用第三个选项,您可以添加一个“包装器” Makefile,例如:

GNUMAKE?= gmake

all:
    ${GNUMAKE} $@

.DEFAULT:
    ${GNUMAKE} $@

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

make在 BSD 上键入将导致 BSD make 读取此文件并相应地调用gmake. 在GNU系统(其中make是GNU MAKE),当有这个文件将被忽略GNUmakefile- GNU化妆喜欢这种经过短短Makefile