我有这个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不能正确发送它。
答案 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
已关闭。)
所以你有很多选择来解决这个问题:
在shell代码段中使用/bin/echo -n
;与内置的命令不同,现在真正的回声命令总是理解-n
;
以比shell for循环更简单的方式构造classpath参数;例如
... -classpath `ls Classes/jars/* | tr '\n' :` ...
或者,如果您已经在假设GNU Make,请使用make通配符和函数而不是shell片段;
请您的同事将shopt -u xpg_echo
添加到他们计算机上的相应bash启动文件中(但是,当您的下一个使用Mac OS的同事出现时,这将导致将来的混乱,并且您已经很久了忘了这次你是怎么解决这个问题的。)
最后,关于调试makefile的一般说明:当makefile配方中的javac ...
命令给出难以理解的错误消息时,请将其更改为echo javac ...
。然后,您将能够看到完全如何调用它 - 如此处所示,可能与您的意图不同。