summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/classes/kernel-yocto.bbclass67
1 files changed, 65 insertions, 2 deletions
diff --git a/meta/classes/kernel-yocto.bbclass b/meta/classes/kernel-yocto.bbclass
index f78caaf23c..1b73e6edbf 100644
--- a/meta/classes/kernel-yocto.bbclass
+++ b/meta/classes/kernel-yocto.bbclass
@@ -1,5 +1,15 @@
1S = "${WORKDIR}/linux" 1S = "${WORKDIR}/linux"
2 2
3
4def find_patches(d):
5 patches=src_patches(d)
6 patch_list=[]
7 for p in patches:
8 _, _, local, _, _, _ = bb.decodeurl(p)
9 patch_list.append(local)
10
11 return patch_list
12
3do_patch() { 13do_patch() {
4 cd ${S} 14 cd ${S}
5 if [ -f ${WORKDIR}/defconfig ]; then 15 if [ -f ${WORKDIR}/defconfig ]; then
@@ -31,14 +41,67 @@ do_patch() {
31 exit 1 41 exit 1
32 fi 42 fi
33 43
34 # updates or generates the target description 44 patches="${@" ".join(find_patches(d))}"
45
46 # This loops through all patches, and looks for directories that do
47 # not already have feature descriptions. If a directory doesn't have
48 # a feature description, we switch to the ${WORKDIR} variant of the
49 # feature (so we can write to it) and generate a feature for those
50 # patches. The generated feature will respect the patch order.
51 #
52 # By leaving source patch directories that already have .scc files
53 # as-is it means that a SRC_URI can only contain a .scc file, and all
54 # patches that the .scc references will be picked up, without having
55 # to be repeated on the SRC_URI line .. which is more intutive
56 set +e
57 patch_dirs=
58 for p in ${patches}; do
59 pdir=`dirname ${p}`
60 pname=`basename ${p}`
61 scc=`find ${pdir} -maxdepth 1 -name '*.scc'`
62 if [ -z "${scc}" ]; then
63 # there is no scc file. We need to switch to someplace that we know
64 # we can create content (the workdir)
65 workdir_subdir=`echo ${pdir} | sed "s%^.*/${PN}%%" | sed 's%^/%%'`
66 suggested_dir="${WORKDIR}/${workdir_subdir}"
67 echo ${gen_feature_dirs} | grep -q ${suggested_dir}
68 if [ $? -ne 0 ]; then
69 gen_feature_dirs="${gen_feature_dirs} ${suggested_dir}"
70 fi
71 # we call the file *.scc_tmp, so the test above will continue to find
72 # that patches from a common subdirectory don't have a scc file and
73 # they'll be placed in order, into this file. We'll rename it later.
74 echo "patch ${pname}" >> ${suggested_dir}/gen_${workdir_subdir}_desc.scc_tmp
75 else
76 suggested_dir="${pdir}"
77 fi
78 echo ${patch_dirs} | grep -q ${suggested_dir}
79 if [ $? -ne 0 ]; then
80 patch_dirs="${patch_dirs} ${suggested_dir}"
81 fi
82 done
83
84 # go through the patch directories and look for any scc feature files
85 # that were constructed above. If one is found, rename it to ".scc" so
86 # the kernel patching can see it.
87 for pdir in ${patch_dirs}; do
88 scc=`find ${pdir} -maxdepth 1 -name '*.scc_tmp'`
89 if [ -n "${scc}" ]; then
90 new_scc=`echo ${scc} | sed 's/_tmp//'`
91 mv -f ${scc} ${new_scc}
92 fi
93 done
94
95 # add any explicitly referenced features onto the end of the feature
96 # list that is passed to the kernel build scripts.
35 if [ -n "${KERNEL_FEATURES}" ]; then 97 if [ -n "${KERNEL_FEATURES}" ]; then
36 for feat in ${KERNEL_FEATURES}; do 98 for feat in ${KERNEL_FEATURES}; do
37 addon_features="$addon_features --feature $feat" 99 addon_features="$addon_features --feature $feat"
38 done 100 done
39 fi 101 fi
102 # updates or generates the target description
40 updateme --branch ${kbranch} -DKDESC=${KMACHINE}:${LINUX_KERNEL_TYPE} \ 103 updateme --branch ${kbranch} -DKDESC=${KMACHINE}:${LINUX_KERNEL_TYPE} \
41 ${addon_features} ${ARCH} ${KMACHINE} ${WORKDIR} 104 ${addon_features} ${ARCH} ${KMACHINE} ${patch_dirs}
42 if [ $? -ne 0 ]; then 105 if [ $? -ne 0 ]; then
43 echo "ERROR. Could not update ${kbranch}" 106 echo "ERROR. Could not update ${kbranch}"
44 exit 1 107 exit 1