【问题标题】:How to execute gmake/make from a bash script file?如何从 bash 脚本文件执行 gmake/make?
【发布时间】:2012-08-02 10:02:43
【问题描述】:

我想使用 make/gmake 从 bash 脚本文件执行我的 Makefile,具体取决于它正在编译的系统:FreeBSD 上的 gmake(不是标准 make)和其他系统上的 make。为此,我想确定系统上安装的 make 命令是否是 GNU make: - 如果 GNU make 然后用 make 编译 - 如果不是 GNU make,则使用 gmake 编译(如果未安装 gmake,则会引发错误)

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: bash makefile gnu-make freebsd


    【解决方案1】:
    if make --version | grep "^GNU Make" >& /dev/null
    then
      MAKE=make
    else
      MAKE=gmake
    fi
    
    ${MAKE} ...
    

    编辑:将 --ver 更改为 --version

    【讨论】:

    • 这依赖于 --version 可用,我相信它是 GNU make 的新添加(根据文档)。是否有另一种(我的意思是更强大的)检查方法?
    • 不,这个添加并不是那么新。例如看gcc.gnu.org/ml/libstdc++/2000-09/msg00028.html;这个补丁有 12 年的历史了,但它依赖于--version
    • 对,它在 Solaris 上不起作用,但事实证明默认的 make 不是 GNU make。这个简单的解决方案应该适合我的需要。谢谢!
    • 在 Linux 上不起作用:make: option '--ver' is ambiguous;可能性:'--version' '--verbosity'
    • @uzsolt:谢谢你的提示! (答案是固定的,感谢amiramix)
    【解决方案2】:

    你可以使用uname:

    if [ `uname -s` = "FreeBSD" ]; then
        makeprg=gmake
    else
        makeprg=make
    fi
    

    正如我在 FreeBSD 上的 wikipedia 上看到的,uname -s 将打印 FreeBSD,而在 Linux 上将输出 Linux(也在我的机器上)。

    编辑:FreeBSD 而不是 Linux。

    【讨论】:

    • 这不是一个坏方法,但假设它将在所有非 Linux 系统上使用 gmake 编译,但情况可能并非如此。我可能仍然更喜欢 Igor 的方法,它没有任何隐含假设哪种类型的 make 在哪个系统上运行。否则可能会一样好。
    • 您可以将“Linux”更改为“FreeBSD”并替换“make”和“gmake”(因此在 FreeBSD 上使用“gmake”,在任何其他系统上使用“make”)。我对你的问题没有专心:)
    • 是的,同意,但似乎仍然不够普遍。是否会有任何系统从 uname 报告“Linux”而不使用 GNU make 作为默认值?我无法回答这个问题(看起来很安全),这就是为什么测试 make 的输出看起来更有弹性的原因。不过感谢您的想法。
    • 检查我的编辑!这就是你想要的:“FreeBSD 上的 gmake(不是标准的 make)和其他人的 make”。
    • 我想要的是确定“make”是否是与 GNU 兼容的 make,而不是我运行的是 FreeBSD 还是 Linux。这就是为什么在我的情况下第一个答案更好的原因。当然,Linux 通常会运行 gnu make 而 FreeBSD 通常不会,但是在这种情况下检查 make 的输出似乎更合适。
    猜你喜欢
    • 2019-08-18
    • 2020-06-05
    • 2011-11-25
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多