Makefile странное поведение - PullRequest
1 голос
/ 22 ноября 2011

У меня есть этот 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 Copyright (C) 2006 Free Software Foundation, Inc. Это бесплатное программное обеспечение;см. источник для условий копирования.Там нет гарантии;даже не для ИЗДЕЛИИ И ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.

Эта программа, созданная для i386-apple-darwin10.0

Справочная информация: Работа над групповым проектом.Я использую Ubuntu, мой партнер - Mac OS X. По какой-то причине этот make-файл отлично работает на моем компьютере, но не на его.Несмотря на то, что команда работает в его терминале BASh, каким-то образом Make не отправляет ее правильно.

1 Ответ

7 голосов
/ 23 ноября 2011

Вы не дали нам почти никакой информации, чтобы продолжить.Тем не менее, вам повезло!

В Mac OS X bash был собран с --enable-strict-posix-default, и поэтому опция оболочки xpg_echo по умолчанию включена в режиме POSIX.Режим POSIX включается, когда оболочка вызывается как /bin/sh, как это было, когда она вызывается командой Make, если вы не указали это иначе, установив переменную $(SHELL) make (что, вероятно, не следует).

В этом разница между Linux и Mac OS, которая убивает ваш make-файл.Когда xpg_echo включен, встроенная в оболочку echo обрабатывает -n как еще один аргумент, который должен быть напечатан (и, следовательно, также печатает новую строку).Таким образом, один аргумент classpath, который вы пытаетесь создать, заканчивается как набор отдельных аргументов (половина из которых - "-n"), и javac запутывается.

(Это не происходит в командедаже в Mac OS X, потому что тогда оболочка была вызвана как /bin/bash, поэтому она не находится в режиме POSIX, а xpg_echo выключен.)

Таким образом, у вас есть несколько вариантов исправления:

  1. Используйте /bin/echo -n в своем фрагменте оболочки;в отличие от встроенной, настоящая команда echo в наши дни в большинстве случаев всегда понимает -n;

  2. Создайте аргумент classpath менее округлым способом, чем ваша оболочка для цикла;например,

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

    или, если вы уже используете GNU Make, использование подстановочных знаков и функций make вместо фрагмента оболочки;

  3. Пусть ваш коллега добавит shopt -u xpg_echo к соответствующему файлу запуска bash на их машине (однако это приведет к путанице в будущем, когда придет ваш следующий коллега, использующий Mac OS, и вы уже давно забыли, как вы исправили это на этот раз).

Наконец, общее замечание об отладке make-файлов: когда команда javac ... в рецепте make-файла выдает непонятные сообщения об ошибках, измените ее на echo javac ....Тогда вы сможете увидеть точно , как он вызывается - что, как видно здесь, может не совпадать с тем, что вы намеревались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...