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

时间:2017-07-27 05:38:20

标签: makefile gnu-make freebsd

我的fixFreeBSD,并且发现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上的make端口是否支持处理FreeBSD

2 个答案:

答案 0 :(得分:4)

BSD make使用不同的语法,并且具有与GNU make不同的功能。您显示的代码段应如下所示:BSD make:

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

您基本上有三种选择:

  1. 如果您的软件专门针对BSD,请使用BSD make语法编写Makefile。 man make(1)拥有FreeBSD make
  2. 的完整手册
  3. 编写便携式Makefile 。这只会使用每个已知make工具实现的make最基本的功能(例如,不使用任何模式规则等)。这可能很乏味,还有其他工具可以帮助管理生成 Makefile,如cmake GNU autotools
  4. 编写一个GNU make Makefile(将它命名为GNUmakefile可能是一个好主意,因此它永远不会被任何其他make解释而不是GNU make)并且依赖于GNU make可用的事实几乎到处都是对于FreeBSD,这意味着要安装适当的端口。
  5. 如果您使用第三个选项,则可以添加“包装器”Makefile,例如这样:

    GNUMAKE?= gmake
    
    all:
        ${GNUMAKE} $@
    
    .DEFAULT:
        ${GNUMAKE} $@
    
    .PHONY: all
    

    在BSD上键入make将导致BSD make读取此文件并相应地调用gmake。在GNU系统上(其中make是GNU make),当GNUmakefile时,该文件将被忽略 - GNU make优先于Makefile

答案 1 :(得分:0)

一种更便携的方式来写这样的东西:

Q$(VERBOSE) := @