summaryrefslogtreecommitdiffstats
path: root/meta/classes/sstate.bbclass
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@windriver.com>2012-05-10 18:13:38 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-11 18:00:27 +0100
commitb85bbc52d33e9fd7435ad217eddc750cb132053f (patch)
treeb65bd1f03d26f0c8eb0f77ef2a830b604fe9ae92 /meta/classes/sstate.bbclass
parent31122b03bf64cf14386251eada8e090a50137576 (diff)
downloadpoky-b85bbc52d33e9fd7435ad217eddc750cb132053f.tar.gz
sstate.bbclass: Improve sstate_installpkg performance
In a pathological case, lots of files to process, the sstate_installpkg performance was very poor. It interated over each file and ran 3 individual sed commands per file. Changing this to keep iterating but running only a single command took about 1/3 time time. However, when looking at the corresponding sstate_hardcode_path function, it was clear we could optimize this further. Using the same encoding logic to specify only the minimumal sed operation necessary, and using xargs to avoid the os.system call the install step was able to be performed in 13% of the original time. Example timing numbers for perl: 3m7s original code 1m20s single sed, but interating 0m26s using xargs and limited sed (From OE-Core rev: d9f655753fbdc8cbd8e705577430fed4f23732b3) Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/sstate.bbclass')
-rw-r--r--meta/classes/sstate.bbclass28
1 files changed, 21 insertions, 7 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index a8c98e5c7f..ad7d121f25 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -174,18 +174,29 @@ def sstate_installpkg(ss, d):
174 bb.build.exec_func('sstate_unpack_package', d) 174 bb.build.exec_func('sstate_unpack_package', d)
175 175
176 # Fixup hardcoded paths 176 # Fixup hardcoded paths
177 #
178 # Note: The logic below must match the reverse logic in
179 # sstate_hardcode_path(d)
180
177 fixmefn = sstateinst + "fixmepath" 181 fixmefn = sstateinst + "fixmepath"
178 if os.path.isfile(fixmefn): 182 if os.path.isfile(fixmefn):
179 staging = d.getVar('STAGING_DIR', True) 183 staging = d.getVar('STAGING_DIR', True)
180 staging_target = d.getVar('STAGING_DIR_TARGET', True) 184 staging_target = d.getVar('STAGING_DIR_TARGET', True)
181 staging_host = d.getVar('STAGING_DIR_HOST', True) 185 staging_host = d.getVar('STAGING_DIR_HOST', True)
182 fixmefd = open(fixmefn, "r") 186
183 fixmefiles = fixmefd.readlines() 187 if bb.data.inherits_class('native', d) or bb.data.inherits_class('nativesdk', d) or bb.data.inherits_class('crosssdk', d) or bb.data.inherits_class('cross-canadian', d):
184 fixmefd.close() 188 sstate_sed_cmd = "sed -i -e 's:FIXMESTAGINGDIR:%s:g'" % (staging)
185 for file in fixmefiles: 189 elif bb.data.inherits_class('cross', d):
186 os.system("sed -i -e s:FIXMESTAGINGDIRTARGET:%s:g %s" % (staging_target, sstateinst + file)) 190 sstate_sed_cmd = "sed -i -e 's:FIXMESTAGINGDIRTARGET:%s:g; s:FIXMESTAGINGDIR:%s:g'" % (staging_target, staging)
187 os.system("sed -i -e s:FIXMESTAGINGDIRHOST:%s:g %s" % (staging_host, sstateinst + file)) 191 else:
188 os.system("sed -i -e s:FIXMESTAGINGDIR:%s:g %s" % (staging, sstateinst + file)) 192 sstate_sed_cmd = "sed -i -e 's:FIXMESTAGINGDIRHOST:%s:g'" % (staging_host)
193
194 # Add sstateinst to each filename in fixmepath, use xargs to efficiently call sed
195 sstate_hardcode_cmd = "sed -e 's:^:%s:g' %s | xargs %s" % (sstateinst, fixmefn, sstate_sed_cmd)
196
197 print "Replacing fixme paths in sstate package: %s" % (sstate_hardcode_cmd)
198 os.system(sstate_hardcode_cmd)
199
189 # Need to remove this or we'd copy it into the target directory and may 200 # Need to remove this or we'd copy it into the target directory and may
190 # conflict with another writer 201 # conflict with another writer
191 os.remove(fixmefn) 202 os.remove(fixmefn)
@@ -300,6 +311,9 @@ python sstate_cleanall() {
300def sstate_hardcode_path(d): 311def sstate_hardcode_path(d):
301 # Need to remove hardcoded paths and fix these when we install the 312 # Need to remove hardcoded paths and fix these when we install the
302 # staging packages. 313 # staging packages.
314 #
315 # Note: the logic in this function needs to match the reverse logic
316 # in sstate_installpkg(ss, d)
303 317
304 staging = d.getVar('STAGING_DIR', True) 318 staging = d.getVar('STAGING_DIR', True)
305 staging_target = d.getVar('STAGING_DIR_TARGET', True) 319 staging_target = d.getVar('STAGING_DIR_TARGET', True)