sdcard をつくる bbclass
fsl ではわざわざ classes の下に image_types_fsl.bbclass なるものをつくってイメージを作っている。ラズベリーもそう。これは ROOTFS_SIZE を知りたいかららしい。IMAGE_CMD_sdcard は rootfs の延長で呼ばれるので ROOTFS_SIZE が変数としてわかる。deploy ではわからない。
python でどうやっているかというと、
runimagecmd () { # Image generation code for image type ${type} # The base_size gets calculated: # - initial size determined by `du -ks` of the IMAGE_ROOTFS # - then multiplied by the IMAGE_OVERHEAD_FACTOR # - tested against IMAGE_ROOTFS_SIZE # - round up ROOTFS_SIZE to IMAGE_ROOTFS_ALIGNMENT ROOTFS_SIZE=`du -ks ${IMAGE_ROOTFS} | awk '{base_size = $1 * ${IMAGE_OVERHEAD_FACTOR}; base_size = ((base_size > ${IMAGE_ROOTFS_SIZE} ? base_size : ${IMAGE_ROOTFS_SIZE}) + ${IMAGE_ROOTFS_EXTRA_SPACE}); if (base_size != int(base_size)) base_size = int(base_size + 1); base_size = base_size + ${IMAGE_ROOTFS_ALIGNMENT} - 1; base_size -= base_size % ${IMAGE_ROOTFS_ALIGNMENT}; print base_size }'`
と du を読んでいる。ありゃまー。でもこれって、そんなことする必要はないじゃないか。よくよく考えたら。どのイメージを使うかはどうなっているのだ?
# ${SDCARD_ROOTFS} - the rootfs image to incorporate # ${IMAGE_BOOTLOADER} - bootloader to use {u-boot, barebox}
SDCARD_ROOTFS というのが deploy ディレクトリにあることを前提にしている。サイズわかるじゃん。
でもって、どっかで指定する。以前は自分のレシピの中で
SDCARD_ROOTFS = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4"
みたいにしていた。
ついでに書くと、deploy の中では ROOTFS_SIZE が使えないけど、DEPLOYDIR は使える。rootfs では ROOTFS_SIZE が使えて DEPLOYDIR は使えないので、DEPLOY_DIR_IMAGE を使っている。汚い。
どっちにしろ SDCARD_ROOTFS を使うのだから、ファイルサイズをとってくればいいのだ。これで deploy の中でできる。du 使う必要がない。
同じような疑問を持った人がいたんだね。
http://permalink.gmane.org/gmane.linux.embedded.yocto.general/11550
と思っていたら、IMAGE_NAME もわからないのか。シンボリックリンクの名前はわからないでもないし、du の -L でも追えるなぁ。しかし、core-image-minimal にしたら core-image-minimal に、、、という具合にならない。汚いけど、classes で対応するしかなさそう。むむむむ。