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
您基本上有三种选择:

  • 如果您的软件专门针对BSD,请使用BSD生成语法编写生成文件。有FreeBSD的
    制作的完整手册
  • 编写一个可移植的Makefile。这将只使用每个已知的
    make
    工具实现的
    make
    的最基本功能(例如,不使用任何模式规则等)。这可能很乏味,还有其他工具可以通过生成Makefile来帮助管理这一点,如
    cmake
    或GNU自动工具
  • 编写一个GNU make Makefile(将其命名为
    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不匹配