Makefile奇怪的行为

时间:2011-11-22 03:53:52

标签: macos bash makefile

我有这个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。 这是免费软件;查看复制条件的来源。 没有保修;甚至不适用于A的适销性或适用性 特别目的。

此程序专为i386-apple-darwin10.0

而构建

背景:处理小组项目。我正在运行Ubuntu,我的合作伙伴正在运行Mac OS X.无论出于何种原因,这个makefile在我的计算机上工作得很好,但在他的计算机上却没有。即使该命令在他的BASh终端中有效,但Make不能正确发送它。

1 个答案:

答案 0 :(得分:7)

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

在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代码段中使用/bin/echo -n;与内置的命令不同,现在真正的回声命令总是理解-n;

  2. 以比shell for循环更简单的方式构造classpath参数;例如

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

    或者,如果您已经在假设GNU Make,请使用make通配符和函数而不是shell片段;

  3. 请您的同事将shopt -u xpg_echo添加到他们计算机上的相应bash启动文件中(但是,当您的下一个使用Mac OS的同事出现时,这将导致将来的混乱,并且您已经很久了忘了这次你是怎么解决这个问题的。)

  4. 最后,关于调试makefile的一般说明:当makefile配方中的javac ...命令给出难以理解的错误消息时,请将其更改为echo javac ...。然后,您将能够看到完全如何调用它 - 如此处所示,可能与您的意图不同。