#python #shell #yocto #bitbake #integer-arithmetic
#python #оболочка #yocto #bitbake #целочисленная арифметика
Вопрос:
Я написал .bbappend
файл для заполнения сгенерированного изображения 16-byte alignment
. Однако я не могу записать логику заполнения в bash
или python
в .bbappend
файл, так как это выдает ошибку.
Вот фрагмент из файла:
# Anonymous python function to set the padding size variable
python () {
d.setVar("TEE_SIZE", "0xac000")
}
do_deploy () {
install -d ${DEPLOYDIR}
${TARGET_PREFIX}objcopy -O binary ${B}/core/tee.elf ${DEPLOYDIR}/tee_tmp.bin
# Padding for 16 byte alignment
bbnote "Padding to ${TEE_SIZE}"
${TARGET_PREFIX}objcopy -I binary -O binary --pad-to ${TEE_SIZE} --gap-fill=0x0 ${DEPLOYDIR}/tee_tmp.bin ${DEPLOYDIR}/tee.${PLATFORM_FLAVOR}.bin
# Deleting temp TEE, after padding
rm -f ${DEPLOYDIR}/tee_tmp.bin
}
Я хотел бы получить размер ${DEPLOYDIR}/tee_tmp.bin
и дополнить его до следующего числа, кратного 0x10
.
- Может кто-нибудь помочь мне достичь этого?
- Как я могу выполнять арифметические операции в
bitbake
файле?
Заранее спасибо.
Комментарии:
1. какую ошибку вы получаете?
2. Это была какая-то синтаксическая ошибка
3. Можем ли мы на самом деле иметь журнал ошибок? Это поможет гораздо больше, чем пытаться угадать, что происходит не так.
Ответ №1:
Из того, что я нашел, вы не можете писать арифметику с синтаксисом Bash в рецептах, написанных с синтаксисом оболочки. Что вы можете сделать, так это позволить приложению bc выполнять арифметику. Если я правильно понял вашу проблему, вы можете сделать это для вычисления заполнения:
# Get the actual size of the file (readlink is only needed if the file might be a symlink)
TEE_SIZE=$(stat --printf="%s" $(readlink -f ${DEPLOYDIR}/tee_tmp.bin))
# Calculate padding
TEE_SIZE_PADDED=$(echo "n = $TEE_SIZE; if(n % 16 != 0) { n = (16 - n % 16)}; n" | bc)
bbnote "Padding to ${TEE_SIZE_PADDED}"
${TARGET_PREFIX}objcopy -I binary -O binary --pad-to ${TEE_SIZE_PADDED} --gap-fill=0 ${DEPLOYDIR}/tee_tmp.bin ${DEPLOYDIR}/tee.${PLATFORM_FLAVOR}.bin
Обратите внимание, что оба TEE_SIZE
и TEE_SIZE_PADDED
находятся в десятичной, а не шестнадцатеричной форме, но это должно нормально работать с objcopy (хотя я его сейчас не тестировал).
Обратите внимание, что ваш рецепт теперь зависит от того, установлен ли bc-native в корне системы, поэтому вам нужно добавить что-то вроде этого в свой рецепт:
do_install[depends] = "bc-native:do_populate_sysroot"