diff options
Diffstat (limited to 'meta/lib/oeqa/utils/commands.py')
-rw-r--r-- | meta/lib/oeqa/utils/commands.py | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py index a71c16ab14..575e380017 100644 --- a/meta/lib/oeqa/utils/commands.py +++ b/meta/lib/oeqa/utils/commands.py | |||
@@ -8,11 +8,8 @@ | |||
8 | # This module is mainly used by scripts/oe-selftest and modules under meta/oeqa/selftest | 8 | # This module is mainly used by scripts/oe-selftest and modules under meta/oeqa/selftest |
9 | # It provides a class and methods for running commands on the host in a convienent way for tests. | 9 | # It provides a class and methods for running commands on the host in a convienent way for tests. |
10 | 10 | ||
11 | |||
12 | |||
13 | import os | 11 | import os |
14 | import sys | 12 | import sys |
15 | import signal | ||
16 | import subprocess | 13 | import subprocess |
17 | import threading | 14 | import threading |
18 | import time | 15 | import time |
@@ -21,6 +18,7 @@ from oeqa.utils import CommandError | |||
21 | from oeqa.utils import ftools | 18 | from oeqa.utils import ftools |
22 | import re | 19 | import re |
23 | import contextlib | 20 | import contextlib |
21 | import errno | ||
24 | # Export test doesn't require bb | 22 | # Export test doesn't require bb |
25 | try: | 23 | try: |
26 | import bb | 24 | import bb |
@@ -85,7 +83,7 @@ class Command(object): | |||
85 | except OSError as ex: | 83 | except OSError as ex: |
86 | # It's not an error when the command does not consume all | 84 | # It's not an error when the command does not consume all |
87 | # of our data. subprocess.communicate() also ignores that. | 85 | # of our data. subprocess.communicate() also ignores that. |
88 | if ex.errno != EPIPE: | 86 | if ex.errno != errno.EPIPE: |
89 | raise | 87 | raise |
90 | 88 | ||
91 | # We write in a separate thread because then we can read | 89 | # We write in a separate thread because then we can read |
@@ -117,7 +115,7 @@ class Command(object): | |||
117 | else: | 115 | else: |
118 | deadline = time.time() + self.timeout | 116 | deadline = time.time() + self.timeout |
119 | for thread in self.threads: | 117 | for thread in self.threads: |
120 | timeout = deadline - time.time() | 118 | timeout = deadline - time.time() |
121 | if timeout < 0: | 119 | if timeout < 0: |
122 | timeout = 0 | 120 | timeout = 0 |
123 | thread.join(timeout) | 121 | thread.join(timeout) |
@@ -168,18 +166,22 @@ class Result(object): | |||
168 | 166 | ||
169 | 167 | ||
170 | def runCmd(command, ignore_status=False, timeout=None, assert_error=True, sync=True, | 168 | def runCmd(command, ignore_status=False, timeout=None, assert_error=True, sync=True, |
171 | native_sysroot=None, limit_exc_output=0, output_log=None, **options): | 169 | native_sysroot=None, target_sys=None, limit_exc_output=0, output_log=None, **options): |
172 | result = Result() | 170 | result = Result() |
173 | 171 | ||
174 | if native_sysroot: | 172 | if native_sysroot: |
175 | extra_paths = "%s/sbin:%s/usr/sbin:%s/usr/bin" % \ | 173 | new_env = dict(options.get('env', os.environ)) |
176 | (native_sysroot, native_sysroot, native_sysroot) | 174 | paths = new_env["PATH"].split(":") |
177 | extra_libpaths = "%s/lib:%s/usr/lib" % \ | 175 | paths = [ |
178 | (native_sysroot, native_sysroot) | 176 | os.path.join(native_sysroot, "bin"), |
179 | nenv = dict(options.get('env', os.environ)) | 177 | os.path.join(native_sysroot, "sbin"), |
180 | nenv['PATH'] = extra_paths + ':' + nenv.get('PATH', '') | 178 | os.path.join(native_sysroot, "usr", "bin"), |
181 | nenv['LD_LIBRARY_PATH'] = extra_libpaths + ':' + nenv.get('LD_LIBRARY_PATH', '') | 179 | os.path.join(native_sysroot, "usr", "sbin"), |
182 | options['env'] = nenv | 180 | ] + paths |
181 | if target_sys: | ||
182 | paths = [os.path.join(native_sysroot, "usr", "bin", target_sys)] + paths | ||
183 | new_env["PATH"] = ":".join(paths) | ||
184 | options['env'] = new_env | ||
183 | 185 | ||
184 | cmd = Command(command, timeout=timeout, output_log=output_log, **options) | 186 | cmd = Command(command, timeout=timeout, output_log=output_log, **options) |
185 | cmd.run() | 187 | cmd.run() |
@@ -283,8 +285,10 @@ def get_bb_vars(variables=None, target=None, postconfig=None): | |||
283 | def get_bb_var(var, target=None, postconfig=None): | 285 | def get_bb_var(var, target=None, postconfig=None): |
284 | return get_bb_vars([var], target, postconfig)[var] | 286 | return get_bb_vars([var], target, postconfig)[var] |
285 | 287 | ||
286 | def get_test_layer(): | 288 | def get_test_layer(bblayers=None): |
287 | layers = get_bb_var("BBLAYERS").split() | 289 | if bblayers is None: |
290 | bblayers = get_bb_var("BBLAYERS") | ||
291 | layers = bblayers.split() | ||
288 | testlayer = None | 292 | testlayer = None |
289 | for l in layers: | 293 | for l in layers: |
290 | if '~' in l: | 294 | if '~' in l: |
@@ -296,6 +300,7 @@ def get_test_layer(): | |||
296 | 300 | ||
297 | def create_temp_layer(templayerdir, templayername, priority=999, recipepathspec='recipes-*/*'): | 301 | def create_temp_layer(templayerdir, templayername, priority=999, recipepathspec='recipes-*/*'): |
298 | os.makedirs(os.path.join(templayerdir, 'conf')) | 302 | os.makedirs(os.path.join(templayerdir, 'conf')) |
303 | corenames = get_bb_var('LAYERSERIES_CORENAMES') | ||
299 | with open(os.path.join(templayerdir, 'conf', 'layer.conf'), 'w') as f: | 304 | with open(os.path.join(templayerdir, 'conf', 'layer.conf'), 'w') as f: |
300 | f.write('BBPATH .= ":${LAYERDIR}"\n') | 305 | f.write('BBPATH .= ":${LAYERDIR}"\n') |
301 | f.write('BBFILES += "${LAYERDIR}/%s/*.bb \\' % recipepathspec) | 306 | f.write('BBFILES += "${LAYERDIR}/%s/*.bb \\' % recipepathspec) |
@@ -304,7 +309,7 @@ def create_temp_layer(templayerdir, templayername, priority=999, recipepathspec= | |||
304 | f.write('BBFILE_PATTERN_%s = "^${LAYERDIR}/"\n' % templayername) | 309 | f.write('BBFILE_PATTERN_%s = "^${LAYERDIR}/"\n' % templayername) |
305 | f.write('BBFILE_PRIORITY_%s = "%d"\n' % (templayername, priority)) | 310 | f.write('BBFILE_PRIORITY_%s = "%d"\n' % (templayername, priority)) |
306 | f.write('BBFILE_PATTERN_IGNORE_EMPTY_%s = "1"\n' % templayername) | 311 | f.write('BBFILE_PATTERN_IGNORE_EMPTY_%s = "1"\n' % templayername) |
307 | f.write('LAYERSERIES_COMPAT_%s = "${LAYERSERIES_COMPAT_core}"\n' % templayername) | 312 | f.write('LAYERSERIES_COMPAT_%s = "%s"\n' % (templayername, corenames)) |
308 | 313 | ||
309 | @contextlib.contextmanager | 314 | @contextlib.contextmanager |
310 | def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, qemuparams=None, overrides={}, discard_writes=True): | 315 | def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, qemuparams=None, overrides={}, discard_writes=True): |