Как определить значение ошибки, вызванной make? - PullRequest
0 голосов
/ 26 апреля 2020

Имея это простое правило make-файла:

exe:
   for i in *; do [ -x "$$i" ] && echo "$$i"; done

Будет выводить:

for i in *; do [ -x "$i" ] && echo "$i"; done
executablefile
make: *** [makefile:6: exe] Error 1

Так и получается, что я хочу, но даже тогда ошибка без другого сообщения. Но не только для этого конкретного примера (который я до сих пор не получил), я хотел бы знать, как получить дополнительную информацию об ошибках в make-файле (есть ли отладчик make-файла?). Из руководства по makefile *** относится к фатальной ошибке, которая завершает компиляцию, но все же выводит исполняемый файл (так что он скомпилирован до этого момента). Помимо фатальных ошибок, - предупреждений дают больше информации, так почему бы не сделать фатальные ошибки также?

  1. объяснение этого примера
  2. некоторые советы, как отлаживать сценарии makefile

1 Ответ

2 голосов
/ 26 апреля 2020

Это не ошибка make, поэтому другой информации нет.

Make запускает оболочку и дает оболочке ваш рецепт для вызова. Если оболочка завершается успешно (код выхода 0), то make предполагает, что команда, с которой она работала, работала. Если оболочка завершается с ошибкой (любой код выхода, кроме 0), то make предполагает, что команда, с которой она выполнила, завершилась неудачно. Make не знает , почему не удалось, make предполагает, что любая неудачная команда напечатает некоторую информацию о том, почему. Все, что знает make, это код завершения, так что все, что make может сказать вам:

make: *** [makefile:6: exe] Error 1

Это означает, что make запустил рецепт для цели exe в makefile строке номер 6, и эта команда завершена с код ошибки 1 (который не равен 0, следовательно, неисправен).

Почему это произошло? Давайте посмотрим на скрипт вашей оболочки:

for i in *; do [ -x "$$i" ] && echo "$$i"; done

Предположим, что последний файл соответствует * (то есть в последний раз, когда мы go через l oop) файл не является исполняемым. Это означает, что тест последнего файла [ -x "$$i" ] не пройден. Так как это последняя команда, запускаемая оболочкой до ее выхода, это будет код завершения оболочки, и у вас возникнет ошибка.

Вы должны быть уверены, что оболочка завершится успешно. Один из способов сделать это - убедиться, что последняя команда, выполняемая оболочкой, всегда успешна; может быть что-то вроде этого:

for i in *; do [ -x "$$i" ] && echo "$$i"; done; true
...