[gnome-continuous-yocto/gnomeostree-3.28-rocko: 1290/8267] bitbake: build: don't use $B as the default cwd for functions



commit 2afcbfef2cd1ca568e5225884a8021df38ee3db0
Author: Ross Burton <ross burton intel com>
Date:   Thu Jul 14 19:56:22 2016 +0100

    bitbake: 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 ]
    
    (Bitbake rev: 67a7b8b021badc17d8fdf447c250e79d291e75f7)
    
    Signed-off-by: Ross Burton <ross burton intel com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/bb/build.py |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)
---
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index 04979ac..a4deb00 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]