Makefile FreeBSD上的make没有';t支持“;ifdef";指令
我的Makefile FreeBSD上的make没有';t支持“;ifdef";指令,makefile,gnu-make,freebsd,Makefile,Gnu Make,Freebsd,我的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/Make
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
您基本上有三种选择:
制作的完整手册
make
工具实现的make
的最基本功能(例如,不使用任何模式规则等)。这可能很乏味,还有其他工具可以通过生成Makefile来帮助管理这一点,如cmake
或GNU自动工具GNUmakefile
,可能是个好主意,因此它永远不会被GNU make以外的任何make
解释),并依赖于GNU make几乎无处不在的事实。对于FreeBSD,这意味着安装适当的端口如果使用第三个选项,可以添加“包装器”
Makefile
,例如:
GNUMAKE?= gmake
all:
${GNUMAKE} $@
.DEFAULT:
${GNUMAKE} $@
.PHONY: all
在BSD上键入
make
将导致BSD make读取此文件,并相应地调用gmake
。在GNU系统上(其中make
是GNU make),当存在GNUmakefile
时,该文件将被忽略——GNU make更喜欢这种方式,而不仅仅是Makefile
一种更便于移植的方式来编写类似的内容:
Q$(VERBOSE) := @
你的问题没有真正意义:如果你使用的是
gmake
,FreeBSD上有一个make端口支持ifdef
:gmake
,这就是GNU make,可能是make最常用的实现。为什么不创建一个别名(如果你想命名为make
)并使用它呢?@RenaudPacalet首先我使用make
,发现它不起作用。因此,我切换到gmake
。我只是想知道是否有一些make
。你评论:“gmake,那是GNU make,可能是make最常用的实现。”澄清我的困惑,谢谢!在您的系统上,GNU make似乎已安装并运行。您唯一(明显的问题)是它的名称是gmake
,而不是make
。搜索一下别名,创建一个名为make
的别名,指向gmake
,瞧。或者根据您的意愿创建一个符号链接,并设置路径,使其位于第一位。不,请不要在BSD系统上将GNU make别名为make
。BSD中默认的make
是一个BSD make,它有不同的语法,支持不同于GNU make的东西。这两种类型的make
@NanXiao之间只有非常基本的make
功能是通用的,这是您的直接问题:在BSD make中,使指令以句点(
)开头,尽管BSD make有一组不同的功能,但仍存在一个.ifdef
。请(一般来说,FreeBSD附带了非常好的编写和完整的手册页)。我要补充的是,只使用BSD样式的Makefiles通常比较简单,并建议使用非BSD系统。这甚至是另一个选项,但哪一个“更简单”可能取决于您使用和习惯了哪些功能;)我的意思是GNU make是一个异常值,除此之外,很少有人为GNU make编写make文件。从这个意义上说,BSD make当然更受欢迎。FreeBSD在10.0左右更改为BSD Make。在9.x和更低版本中,它是FreeBSD的品牌,与当前的不同(来自netbsd)。2.您可以将您的makefile命名为BSDMakefile,类似于GNUOne的工作方式,它将阻止GNUmake运行它们!某些版本的FreeBSD仍然包含fmake,这是旧版本,以防您需要针对旧版本。3.并非所有BSD都使用同一品牌。午夜BSD默认使用fmake,bmake可用,但在最新版本中未命名为make。FreeBSD还以几种方式修改了bmake,使其与NetBSD不匹配