【问题标题】:Invoking external commands with options from a makefile使用 makefile 中的选项调用外部命令
【发布时间】:2023-04-03 06:21:01
【问题描述】:

我有一个makefile for compiling Arduino programs

我需要根据一些逻辑在一些文件的开头添加一些文本。我正在使用 echo 命令。

ECHO    = echo

在文件的后面,我有很多地方像

$(OBJDIR)/%.cpp: %.pde
    $(ECHO) '#if ARDUINO >= 100\n    #include "Arduino.h"\n#else\n    #include "WProgram.h"\n#endif' > $@

效果很好。

最近,一些用户抱怨 echo 命令在某些 linux 发行版中无法正常工作,我不得不在 echo 命令中添加 '-e' 选项。

所以我将声明命令的第一行更改为

ECHO    = echo -e

这不起作用,因为 makefile 将 -e 视为文本的一部分,而不是选项的一部分。

编辑

我没有收到任何错误,但文本 -e 也附加到我正在创建的文件中。

有没有办法将 -e 声明为选项而不是文本的一部分?

【问题讨论】:

    标签: command-line makefile echo arduino


    【解决方案1】:

    您很可能会看到行为差异,因为 echo 在某些 shell 的某些版本中是一个 shell 内置命令。然后这是复杂的,因为 make 有时只使用 shell 来调用命令——如果可能的话,它会更喜欢直接调用命令。因此,有时,在某些系统上,您并没有像您认为的那样调用echo 命令。

    通过设置你可能会有更好的运气

    ECHO = /bin/echo -e
    

    这将显式调用外部echo 命令,即使shell 具有内置版本。这样你应该得到一致的结果。

    【讨论】:

    • 感谢这解决了它。但我不确定这对 Mac OS 是否有任何问题。也需要在那里进行测试。
    【解决方案2】:

    如果得到/bin/sh: 1: -e: not found 错误它与你的shell有关,而不是makefile.else,请输入你的错误。当然,如果你得到错误。

    【讨论】:

    • 我已经更新了这个问题。我没有收到任何错误,但文本 -e 也被附加到我正在创建的文件中。
    • @Sudar 我从 echo: 的手册页中找到了以下文本,这不是你的问题 你的 shell 可能有自己的 echo 版本,它通常会取代这里描述的版本。有关它支持的选项的详细信息,请参阅您的 shell 的文档。
    猜你喜欢
    • 2013-12-16
    • 2016-09-30
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多