FreeBSD 上的 make 不支持 "ifdef" 指令
The make on FreeBSD doesn't support "ifdef" directives
我的 FreeBSD
是 11.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
我目前的解决方案是使用 gmake
。 FreeBSD
上的任何 make
端口是否支持处理 ifdef
?
BSD make 使用与 GNU make 不同的语法和不同的功能。您显示的代码片段对于 BSD make 应该如下所示:
.ifdef VERBOSE
Q :=
.else
Q := @
.endif
你基本上有三个选择:
- 如果您的软件专门针对 BSD,请使用 BSD make 语法编写 Makefile。 man make(1) 有完整的 FreeBSD 手册
make
。
- 编写一个可移植的 Makefile。这只会使用每个已知
make
工具实现的 make
的 最基本的 功能(例如,不要使用任何模式规则等)。这可能很乏味,还有其他工具可以通过 生成 Makefile 来帮助管理这个问题,例如 cmake
或 GNU autotools.
- 编写一个 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) := @
我的 FreeBSD
是 11.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
我目前的解决方案是使用 gmake
。 FreeBSD
上的任何 make
端口是否支持处理 ifdef
?
BSD make 使用与 GNU make 不同的语法和不同的功能。您显示的代码片段对于 BSD make 应该如下所示:
.ifdef VERBOSE
Q :=
.else
Q := @
.endif
你基本上有三个选择:
- 如果您的软件专门针对 BSD,请使用 BSD make 语法编写 Makefile。 man make(1) 有完整的 FreeBSD 手册
make
。 - 编写一个可移植的 Makefile。这只会使用每个已知
make
工具实现的make
的 最基本的 功能(例如,不要使用任何模式规则等)。这可能很乏味,还有其他工具可以通过 生成 Makefile 来帮助管理这个问题,例如cmake
或 GNU autotools. - 编写一个 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) := @