Как рассчитать размер файла для заполнения в BitBake?

#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 .

  1. Может кто-нибудь помочь мне достичь этого?
  2. Как я могу выполнять арифметические операции в 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"