Saturday, September 27, 2008

Getting even more dangerous with pstage

In my previous post I explained why and how to setup your build environment to have deploy and pstage directories outside the temp directory of a standard OE build. It works fine for building a filesystem, but when it comes to building a kernel or a bootloader, it brakes. After spending some time debugging this issue I submitted a bug report and followed up on the oe-dev mailing list. Below is the full text of my post.

I just submitted a bug report #4580, but wanted to follow up here as my description/fix maybe controversial or at least touches the low-level stuff.

Here is the description from the ticket:

When DEPLOY_DIR is configured to be outside of TMPDIR, building a kernel breaks, as cp cannot copy a file into itself:
cp: `/OE/deploy/glibc/images/omap3evm/uImage.bin' and `/OE/deploy/glibc/images/omap3evm/uImage.bin' are the same file
What happens is inside the do_deploy() function of the kernel.bbclass it calls package_stagefile_shell() with the uImage binary in DEPLOY_DIR as a parameter:
package_stagefile_shell ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin
That function is supposed to save a copy of the file in the staging directory (packaged-staging magic):
package_stagefile_shell() {
    if [ "$PSTAGING_ACTIVE" = "1" ]; then
        srcfile=$1
        destfile=`echo $srcfile | sed s#${TMPDIR}#${PSTAGE_TMPDIR_STAGE}#`
        destdir=`dirname $destfile`
        mkdir -p $destdir
        cp -dp $srcfile $destfile
    fi
}
The problem there is it substitutes (sed) TMPDIR with PSTAGE_TMPDIR_STAGE in file's path. It works if DEPLOY_DIR is inside TMPDIR, but the path remains the same if otherwise, leading to the mentioned error.

The function above is a shell counterpart of the python package_stagefile(). I grepped both of them and it appears the python function is used inside the package.bbclass to do some actual staging, while the shell function is only used in recipes for kernels and bootloaders (u-boot, x-load) and is always called with files in DEPLOY_DIR.

So, changing above sed command to:
sed s#${DEPLOY_DIR}#${PSTAGE_TMPDIR_STAGE}#
makes it work and doesn't seem to break anything else for me. I think the function maybe renamed to package_stagefile_deploy() to reflect its purpose, but that would require changes in several recipes.

I'm attaching the actual patch for review. It works for me, but I'm not sure how correct it is, so I'm asking here. Thanks.

Koen thinks my "patch is a step in the right direction", whatever that means... :)

No comments: