summaryrefslogtreecommitdiffstats
path: root/lib/bb/build.py
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2016-07-14 19:56:22 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-07-19 08:51:27 +0100
commit67a7b8b021badc17d8fdf447c250e79d291e75f7 (patch)
treec4d187b2679b0e8ba7c1e1a5aeea0b19b7288973 /lib/bb/build.py
parent42d727743fa599e0a3c5ad2c29a1e6ede1a918bb (diff)
downloadbitbake-contrib-67a7b8b021badc17d8fdf447c250e79d291e75f7.tar.gz
build: don't use $B as the default cwd for functions
When bitbake executes a shell or Python function it can cd/chdir() into a directory before executing the task. If no directory is specified then the default of $B is used. However $B is an OpenEmbedded variable and BitBake shouldn't be aware of it. To solve this change the semantics slightly so that if no directory is specified, the current working directory isn't changed. There's also a sanity check that emits a warning if a Python task does os.chdir() without restoring the old path, and the previous working directory is restored. This does change semantics: whereas before a function in OE would have $B as the working directory unless specified, now the working directory is the top of the build tree. Any breakage this causes can be solved by either adding do_some_task[dirs] = "${B}" or by using absolute paths in the task. [ YOCTO #4634 ] Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/bb/build.py')
-rw-r--r--lib/bb/build.py23
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/bb/build.py b/lib/bb/build.py
index 04979acbd..a4deb00b8 100644
--- a/lib/bb/build.py
+++ b/lib/bb/build.py
@@ -188,6 +188,11 @@ class LogTee(object):
def exec_func(func, d, dirs = None, pythonexception=False):
"""Execute a BB 'function'"""
+ try:
+ oldcwd = os.getcwd()
+ except:
+ oldcwd = None
+
body = d.getVar(func, False)
if not body:
if body is None:
@@ -211,9 +216,7 @@ def exec_func(func, d, dirs = None, pythonexception=False):
bb.utils.mkdirhier(adir)
adir = dirs[-1]
else:
- adir = d.getVar('B', True)
- bb.utils.mkdirhier(adir)
-
+ adir = None
ispython = flags.get('python')
lockflag = flags.get('lockfiles')
@@ -257,6 +260,13 @@ def exec_func(func, d, dirs = None, pythonexception=False):
else:
exec_func_shell(func, d, runfile, cwd=adir)
+ if oldcwd and os.getcwd() != oldcwd:
+ try:
+ bb.warn("Task %s changed cwd to %s" % (func, os.getcwd()))
+ os.chdir(oldcwd)
+ except:
+ pass
+
_functionfmt = """
{function}(d)
"""
@@ -272,7 +282,8 @@ def exec_func_python(func, d, runfile, cwd=None, pythonexception=False):
if cwd:
try:
olddir = os.getcwd()
- except OSError:
+ except OSError as e:
+ bb.warn("%s: Cannot get cwd: %s" % (func, e))
olddir = None
os.chdir(cwd)
@@ -298,8 +309,8 @@ def exec_func_python(func, d, runfile, cwd=None, pythonexception=False):
if cwd and olddir:
try:
os.chdir(olddir)
- except OSError:
- pass
+ except OSError as e:
+ bb.warn("%s: Cannot restore cwd %s: %s" % (func, olddir, e))
def shell_trap_code():
return '''#!/bin/sh\n