Как я могу перехватить коды выхода команды в рецепте bitbake?

#yocto #bitbake

#yocto #bitbake

Вопрос:

У меня есть рецепт bitbake, в котором мне нужно проверить доступность удаленного сервера, прежде чем загружать с него некоторые пакеты. Для этого я использую ping, как показано ниже:

 ping ${HOST} -c1 -w4 1>/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
    echo "ERROR: Unable to reach ${HOST}. Exiting now with code $?..."
    exit $? 
fi
  

Приведенный выше код отлично работает в терминале, и я получаю соответствующие коды выхода: 0 для OK и ненулевые для NOK.

Однако, точно такой же код в рецепте bitbake, код выхода $? всегда пуст. Вместо этого сам bitbake перехватит код ошибки, и выполнение продолжится. Сбой произойдет намного позже, при попытке распаковать не загруженные файлы. В этот момент я получаю предупреждение о ненулевом коде выхода, выданном ping намного раньше. В настоящее время это выглядит так:

 if [ "$(ping ${HOST} -c1 -w4 1>/dev/null 2>/dev/null)" = 0 ]; then
    echo "ERROR: Unable to reach ${HOST}. Exiting now..."
    exit 1 
fi

# Some other stuff here...

ar -x ${BUILDDIR}/tmp/deploy/ipk/all/rheas_*.ipk

  

И я получаю:

 ERROR: rheas-0.0-r0 do_compile: Function failed: do_compile (log file is located at /data/oe-core/build/tmp/work/armv5te-poky-linux-gnueabi/rheas/0.0-r0/temp/log.do_compile.2239)
ERROR: Logfile of failure stored in: /data/oe-core/build/tmp/work/armv5te-poky-linux-gnueabi/rheas/0.0-r0/temp/log.do_compile.2239
Log data follows:
| DEBUG: Executing shell function do_compile
| ar: /data/oe-core/build/tmp/deploy/ipk/all/rheas_*.ipk: No such file or directory
| WARNING: exit code 9 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /data/retail-renos-oe-core/build/tmp/work/armv5te-poky-linux-gnueabi/rheas/0.0-r0/temp/log.do_compile.2239)
ERROR: Task (/data/oe-core/meta-renos/recipes-core/rheas/rheas_0.0.bb:do_compile) failed with exit code '1'

  

Таким образом, я не могу сам использовать коды выхода, потому что кажется, что bitbake каким-то образом его захватывает.

Проблема в том, что я не могу выдать удобную для пользователя ошибку, а другие никогда не знают, откуда берется проблема.

Итак, мой вопрос: как я могу использовать коды выхода внутри рецепта bitbake?

В этом проекте я использую bitbake версии 1.32.0.

Похоже, этого ответа нет в руководстве.

Комментарии:

1. Пожалуйста, укажите свой рецепт или, по крайней мере, всю функцию и фактическое сообщение об ошибке или результат, который вы получаете. Я дал ответ, но это частично догадки…

Ответ №1:

bitbake set -e по умолчанию использует более безопасный: выполнение скрипта останавливается при первой ошибке.

Вы могли бы отключить это (с set e помощью), но я предлагаю вместо этого специально использовать единственную команду с заведомо ошибочным выходом. Есть несколько способов, которыми вы можете это сделать, вот пример (это также исправляет ошибку в вашем коде, когда вы использовали выходное значение echo в качестве выходного значения):

 err=0
ping ${HOST} -c1 -w4 1>/dev/null 2>/dev/null || err=$?
if [ $err -ne 0 ]; then
    echo "ERROR: Unable to reach ${HOST}. Exiting now with code $err..."
    exit $err 
fi
  

Комментарии:

1. Это сделало свое дело. Спасибо!!