【问题标题】:Makefile odd behaviourMakefile 奇怪的行为
【发布时间】:2012-01-03 12:57:20
【问题描述】:

我有一个表现出一些奇怪行为的 Makefile:

$ javac -d Classes -sourcepath .. -classpath `for x in \`ls Classes/jars/*\`; do echo -n $x:; done` PCA/PCAClassifier.java

编译 java 就好了。但是出于某种原因,当我打电话时

make PCA

我明白了:

Compiling PCAClassifier
javac -d Classes -sourcepath .. -classpath `for x in \`ls Classes/jars/*\`; do echo -n $x:; done` PCA/PCAClassifier.java
javac: invalid flag: Classes/jars/Jama.jar:
Usage: javac <options> <source files>
use -help for a list of possible options
make: * [Classes/RobotSuite/PCA/PCAClassifier.class] Error 2

我很困惑。谁有解决办法?

制作版本信息:

GNU Make 3.81 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。 没有保修;甚至不适合适销性或适合性 特殊目的。

这个程序是为 i386-apple-darwin10.0 构建的

背景:从事小组项目。我正在运行 Ubuntu,我的伙伴正在运行 Mac OS X。无论出于何种原因,这个 makefile 在我的计算机上运行良好,但在他的计算机上却不行。尽管该命令在他的 BAsh 终端中有效,但不知为何 Make 无法正确发送它。

【问题讨论】:

  • 由于您没有向我们展示生成文件,因此很难提供帮助。第一个片段正在编译 PCA/PCAClassifier.java,而抱怨的版本正在编译 PCA/PCAHelper.java - 这种差异有问题吗?
  • 不,无论我运行哪个参数,它都会失败。

标签: macos bash makefile


【解决方案1】:

你几乎没有给我们任何信息。尽管如此,你很幸运!

在 Mac OS X 上,bash 是使用 --enable-strict-posix-default 构建的,因此 xpg_echo shell 选项默认在 POSIX 模式下启用。当 shell 被调用为 /bin/sh 时,POSIX 模式处于打开状态,就像它被 Make 调用时一样,除非您通过设置 $(SHELL) make 变量(您可能不应该这样做)来指示它。

这是 Linux 和 Mac OS 之间的差异,它正在扼杀你的 makefile。当xpg_echo 打开时,shell 的内置echo-n 视为要打印的另一个参数(因此也会打印换行符)。因此,您尝试构建的单个类路径参数最终会成为一堆单独的参数(其中一半是“-n”)并且 javac 会感到困惑。

(这不会在命令行上发生,即使在 Mac OS X 上也是如此,因为此时 shell 已作为 /bin/bash 调用,因此它不在 POSIX 模式下,xpg_echo 处于关闭状态。)

因此,您有多种解决方法:

  1. 在你的 shell sn-p 中使用/bin/echo -n;与内置的不同,现在真正的 echo 命令大多总是理解-n

  2. 以比你的 shell for 循环更少迂回的方式构造类路径参数;例如

    ... -classpath `ls Classes/jars/* | tr '\n' :` ...
    

    或者,如果您已经使用 GNU Make,请使用 make 通配符和函数而不是 shell sn-p;

  3. 让您的同事将shopt -u xpg_echo 添加到他们机器上适当的 bash 启动文件中(但是,当您的下一位使用 Mac OS 的同事出现并且您早已忘记如何使用时,这只会导致未来的混乱你这次修好了)。

最后,关于调试 makefile 的一般说明:当 makefile 配方中的 javac ... 命令给出难以理解的错误消息时,请将其更改为 echo javac ...。然后您将能够确切地看到它是如何被调用的——正如这里所看到的,这可能不是您想要的。

【讨论】:

  • 我觉得我给了你很多信息让你继续。无论如何,足以让您编写一个非常有用的回复。而且,坦率地说,我把我掌握的所有相关信息都给了你。实际的 make 命令只有一行:“Run this command, with these parameters”。所有这些都运行良好,make 实用程序实际上打印了我希望它运行的确切命令这一事实证明了这一点。我只需要知道(以及我所问的),就是为什么 make 实用程序中的 shell 的行为与它的行为不同。 TL;DR:谢谢你的帮助,但你不必是个混蛋。
  • @Frankie:伙计,通常在例如makefile 没有按照您期望的方式工作,发布实际有问题的 makefile 是一个非常好的主意! 这样慷慨帮助您的人就不会浪费时间想知道,例如,您是否有正确地从 Make 转义 $$x 或者如果 $x 打算出现在你的 shell sn-p 的其他地方。 tl;博士:catb.org/~esr/faqs/smart-questions.html
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多