#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. Это сделало свое дело. Спасибо!!