summaryrefslogtreecommitdiffstats
path: root/meta/classes/kernel-yocto.bbclass
diff options
context:
space:
mode:
authorBruce Ashfield <bruce.ashfield@windriver.com>2012-02-23 20:58:47 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-02-24 17:12:05 +0000
commit14df6d53b6856ec78322b9c0ef01e26c0406fe28 (patch)
tree29ed86336c7ff769b695bcd1370592616b3e7c64 /meta/classes/kernel-yocto.bbclass
parentdb94ad4cf32d8ce3e97a8287d1c89a58d008a142 (diff)
downloadpoky-14df6d53b6856ec78322b9c0ef01e26c0406fe28.tar.gz
linux-yocto: improve checkout error handling and reporting
The typical workflow for linux-yocto simply uses a remote upstream repository (Whether it is mirrored or not), and in this case there are no issues with consistency in the format of the resository that is unpacked into the WORKDIR. When working with a local linux-yocto repository for kernel development the remote vs local branches is not always consistent between repositories. The suggested/documented workflow has always been to use a bare clone of linux-yocto, and use a second working tree repository for development. Changes flow from the working tree to the bare clone and then into the working directory for build. A common mistake that happens with this workflow is that the non-bare, working repository is used instead of the bare clone version. If a non-bare repository is reference by the SRC_URI, then the branches that are fetched into WORKDIR are not consitent. If the MACHINE and META branches are not present, cryptic build errors will result. To solve this problem, the checkout code has been changed in several ways: - works with a newly proposed 'bareclone' option to bitbake - detects if a bareclone is present in WORKDIR or not and adjustst the checkout accordingly. - if a non-bare clone is detected, machine and meta branches are checked. If they are not present, or can't be created a clear error message is produced - instead of manipulating the refs directly in the git tree, local tracking branches are (quietly) created for remote branches. Enabling a better workflow in the WORKDIR kernel repository. This has been tested with linux-yocto remote upstreams, local bare and non-bare respositories. All builds succeed or fail with clear error messages. (From OE-Core rev: e3b6537cc7931636ab11ae6ed2c8fbaad9da91bc) Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/kernel-yocto.bbclass')
-rw-r--r--meta/classes/kernel-yocto.bbclass72
1 files changed, 49 insertions, 23 deletions
diff --git a/meta/classes/kernel-yocto.bbclass b/meta/classes/kernel-yocto.bbclass
index 3130bf4512..50ff555efe 100644
--- a/meta/classes/kernel-yocto.bbclass
+++ b/meta/classes/kernel-yocto.bbclass
@@ -139,33 +139,59 @@ do_patch() {
139} 139}
140 140
141do_kernel_checkout() { 141do_kernel_checkout() {
142 if [ -d ${WORKDIR}/git/.git/refs/remotes/origin ]; then 142 # we build out of {S}, so ensure that ${S} is clean and present
143 echo "Fixing up git directory for ${LINUX_KERNEL_TYPE}/${KMACHINE}" 143 rm -rf ${S}
144 rm -rf ${S} 144 mkdir -p ${S}/.git
145 mkdir ${S} 145
146 set +e
147
148 # A linux yocto SRC_URI should use the bareclone option. That
149 # ensures that all the branches are available in the WORKDIR version
150 # of the repository. If it wasn't passed, we should detect it, and put
151 # out a useful error message
152 if [ -d "${WORKDIR}/git/.git" ]; then
153 echo "WARNING. ${WORKDIR}/git is not a bare clone."
154 echo "Ensure that the SRC_URI includes the 'bareclone=1' option."
155
156 # we can fix up the kernel repository, but at the least the meta
157 # branch must be present. The machine branch may be created later.
146 mv ${WORKDIR}/git/.git ${S} 158 mv ${WORKDIR}/git/.git ${S}
147 159 rm -rf ${WORKDIR}/git/
148 if [ -e ${S}/.git/packed-refs ]; then 160 cd ${S}
149 cd ${S} 161 git branch -a | grep -q ${KMETA}
150 rm -f .git/refs/remotes/origin/HEAD 162 if [ $? -ne 0 ]; then
151IFS=' 163 echo "ERROR. The branch '${KMETA}' is required and was not"
152'; 164 echo "found. Ensure that the SRC_URI points to a valid linux-yocto"
153 for r in `git show-ref | grep remotes`; do 165 echo "kernel repository"
154 ref=`echo $r | cut -d' ' -f1`; 166 exit 1
155 b=`echo $r | cut -d' ' -f2 | sed 's%refs/remotes/origin/%%'`;
156 dir=`dirname $b`
157 mkdir -p .git/refs/heads/$dir
158 echo $ref > .git/refs/heads/$b
159 done
160 cd ..
161 else
162 cp -r ${S}/.git/refs/remotes/origin/* ${S}/.git/refs/heads
163 rmdir ${S}/.git/refs/remotes/origin
164 fi 167 fi
168 if [ -z "${YOCTO_KERNEL_EXTERNAL_BRANCH}" ]; then
169 git branch -a | grep -q ${KBRANCH}
170 if [ $? -ne 0 ]; then
171 echo "ERROR. The branch '${KBRANCH}' is required and was not"
172 echo "found. Ensure that the SRC_URI points to a valid linux-yocto"
173 echo "kernel repository"
174 exit 1
175 fi
176 fi
177 else
178 mv ${WORKDIR}/git/* ${S}/.git
179 rm -rf ${WORKDIR}/git/
180 cd ${S}
181 git config core.bare false
165 fi 182 fi
166 cd ${S} 183 # end debare
167 184
168 set +e 185 # convert any remote branches to local tracking ones
186 for i in `git branch -a | grep remotes | grep -v HEAD`; do
187 b=`echo $i | cut -d' ' -f2 | sed 's%remotes/origin/%%'`;
188 git show-ref --quiet --verify -- "refs/heads/$b"
189 if [ $? -ne 0 ]; then
190 git branch $b $i > /dev/null
191 fi
192 done
193
194 # Create a working tree copy of the kernel by checkout out a branch
169 git show-ref --quiet --verify -- "refs/heads/${KBRANCH}" 195 git show-ref --quiet --verify -- "refs/heads/${KBRANCH}"
170 if [ $? -eq 0 ]; then 196 if [ $? -eq 0 ]; then
171 # checkout and clobber and unimportant files 197 # checkout and clobber and unimportant files