diff options
Diffstat (limited to 'meta/classes/kernel-yocto.bbclass')
-rw-r--r-- | meta/classes/kernel-yocto.bbclass | 88 |
1 files changed, 62 insertions, 26 deletions
diff --git a/meta/classes/kernel-yocto.bbclass b/meta/classes/kernel-yocto.bbclass index f09d503b92..10a8d40d9c 100644 --- a/meta/classes/kernel-yocto.bbclass +++ b/meta/classes/kernel-yocto.bbclass @@ -80,8 +80,12 @@ do_patch() { done fi + if [ "${kbranch}" != "${KBRANCH_DEFAULT}" ]; then + updateme_flags="--branch ${kbranch}" + fi + # updates or generates the target description - updateme --branch ${kbranch} -DKDESC=${KMACHINE}:${LINUX_KERNEL_TYPE} \ + updateme ${updateme_flags} -DKDESC=${KMACHINE}:${LINUX_KERNEL_TYPE} \ ${addon_features} ${ARCH} ${KMACHINE} ${sccs} ${patches} if [ $? -ne 0 ]; then echo "ERROR. Could not update ${kbranch}" @@ -91,7 +95,19 @@ do_patch() { # executes and modifies the source tree as required patchme ${KMACHINE} if [ $? -ne 0 ]; then - echo "ERROR. Could not modify ${kbranch}" + echo "ERROR. Could not apply updates for ${KMACHINE}" + exit 1 + fi + + # Perform a final check. If something other than the default kernel + # branch was requested, and that's not where we ended up, then we + # should thrown an error, since we aren't building what was expected + final_branch="$(git symbolic-ref HEAD 2>/dev/null)" + final_branch=${final_branch##refs/heads/} + if [ "${kbranch}" != "${KBRANCH_DEFAULT}" ] && + [ "${final_branch}" != "${kbranch}" ]; then + echo "ERROR: branch ${kbranch} was requested, but was not properly" + echo " configured to be built. The current branch is ${final_branch}" exit 1 fi } @@ -199,10 +215,9 @@ python do_kernel_configcheck() { bb.plain( "%s" % result ) } - # Ensure that the branches (BSP and meta) are on the locations specified by # their SRCREV values. If they are NOT on the right commits, the branches -# are reset to the correct commit. +# are corrected to the proper commit. do_validate_branches() { cd ${S} @@ -213,39 +228,57 @@ do_validate_branches() { return fi - # if the branches do not exist, then there's nothing to check either + # If something other than the default branch was requested, it must + # exist in the tree, and it's a hard error if it wasn't git show-ref --quiet --verify -- "refs/heads/${KBRANCH}" if [ $? -eq 1 ]; then - return + if [ -n "${KBRANCH_DEFAULT}" ] && + [ "${KBRANCH}" != "${KBRANCH_DEFAULT}" ]; then + echo "ERROR: branch ${KBRANCH} was set for kernel compilation, " + echo " but it does not exist in the kernel repository." + echo " Check the value of KBRANCH and ensure that it describes" + echo " a valid banch in the source kernel repository" + exit 1 + fi fi - branch_head=`git show-ref -s --heads ${KBRANCH}` if [ -z "${SRCREV_machine}" ]; then target_branch_head="${SRCREV}" else target_branch_head="${SRCREV_machine}" fi + # $SRCREV could have also been AUTOINC, so check again if [ "${target_branch_head}" = "AUTOINC" ]; then return fi - # We have SRCREVs and we have branches so validation can continue! - current=`git branch |grep \*|sed 's/^\* //'` - if [ -n "$target_branch_head" ] && [ "$branch_head" != "$target_branch_head" ] && - [ "$target_branch_head" != "AUTOINC" ]; then - ref=`git show ${target_branch_head} 2>&1 | head -n1 || true` - if [ "$ref" = "fatal: bad object ${target_meta_head}" ]; then - echo "ERROR ${target_branch_head} is not a valid commit ID." - echo "The kernel source tree may be out of sync" - exit 1 - else - echo "Forcing branch $current to ${target_branch_head}" - git branch -m $current $current-orig - git checkout -b $current ${target_branch_head} - fi + containing_branches=`git branch --contains $target_branch_head | sed 's/^..//'` + if [ -z "$containing_branches" ]; then + echo "ERROR: SRCREV was set to \"$target_branch_head\", but no branches" + echo " contain this commit" + exit 1 + fi + ref=`git show ${target_branch_head} 2>&1 | head -n1 || true` + if [ "$ref" = "fatal: bad object ${target_meta_head}" ]; then + echo "ERROR ${target_branch_head} is not a valid commit ID." + echo "The kernel source tree may be out of sync" + exit 1 fi + # force the SRCREV in each branch that contains the specified + # SRCREV (if it isn't the current HEAD of that branch) + git checkout -q master + for b in $containing_branches; do + branch_head=`git show-ref -s --heads ${b}` + if [ "$branch_head" != "$target_branch_head" ]; then + echo "[INFO] Setting branch $b to ${target_branch_head}" + git branch -D $b > /dev/null + git branch $b $target_branch_head > /dev/null + fi + done + + ## KMETA branch validation meta_head=`git show-ref -s --heads ${KMETA}` target_meta_head="${SRCREV_meta}" git show-ref --quiet --verify -- "refs/heads/${KMETA}" @@ -264,18 +297,21 @@ do_validate_branches() { echo "The kernel source tree may be out of sync" exit 1 else - echo "Forcing branch meta to ${target_meta_head}" + echo "[INFO] Setting branch ${KMETA} to ${target_meta_head}" git branch -m ${KMETA} ${KMETA}-orig - git checkout -b ${KMETA} ${target_meta_head} + git checkout -q -b ${KMETA} ${target_meta_head} if [ $? -ne 0 ];then - echo "ERROR: could not checkout meta branch from known hash ${target_meta_head}" + echo "ERROR: could not checkout ${KMETA} branch from known hash ${target_meta_head}" exit 1 fi fi fi - # restore the branch for builds - git checkout -f ${KBRANCH} + git show-ref --quiet --verify -- "refs/heads/${KBRANCH}" + if [ $? -eq 0 ]; then + # restore the branch for builds + git checkout -q -f ${KBRANCH} + fi } # Many scripts want to look in arch/$arch/boot for the bootable |