bin/bitbake: Add better environmental variable handling. By default it will now only...
authorRichard Purdie <rpurdie@linux.intel.com>
Tue, 30 Sep 2008 21:08:24 +0000 (21:08 +0000)
committerRichard Purdie <rpurdie@linux.intel.com>
Tue, 30 Sep 2008 21:08:24 +0000 (21:08 +0000)
ChangeLog
bin/bitbake
lib/bb/data.py
lib/bb/data_smart.py
lib/bb/utils.py

index a2d0da2..ceb7e64 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -54,6 +54,11 @@ Changes in BitBake 1.8.x:
        - Fix PACKAGES_DYNAMIC handling of packages with '++' in the name
        - Rename __depends to __base_depends after configuration parsing so we don't
          recheck the validity of the config files time after time
+       - Add better environmental variable handling. By default it will now only pass certain 
+         whitelisted variables into the data store. If BB_PRESERVE_ENV is set bitbake will use
+         all variable from the environment. If BB_ENV_WHITELIST is set, that whitelist will be
+         used instead of the internal bitbake one. Alternatively, BB_ENV_EXTRAWHITE can be used
+         to extend the internal whitelist.
 
 Changes in BitBake 1.8.10:
        - Psyco is available only for x86 - do not use it on other architectures.
index e262d0b..dc35152 100755 (executable)
@@ -113,6 +113,16 @@ Default BBFILES are the .bb files in the current directory.""" )
 
     cooker = bb.cooker.BBCooker(configuration)
 
+    # Optionally clean up the environment
+    if 'BB_PRESERVE_ENV' not in os.environ:
+        if 'BB_ENV_WHITELIST' in os.environ:
+            good_vars = os.environ['BB_ENV_WHITELIST'].split()
+        else:
+            good_vars = bb.utils.preserved_envvars_list()
+        if 'BB_ENV_EXTRAWHITE' in os.environ:
+            good_vars.extend(os.environ['BB_ENV_EXTRAWHITE'].split())
+        bb.utils.filter_environment(good_vars)
+
     cooker.parseConfiguration()
 
     if configuration.profile:
index 54b2615..82eef44 100644 (file)
@@ -324,21 +324,15 @@ def expandData(alterdata, readdata = None):
         if val != expanded:
             setVar(key, expanded, alterdata)
 
-import os
-
 def inheritFromOS(d):
     """Inherit variables from the environment."""
-#   fakeroot needs to be able to set these
-    non_inherit_vars = [ "LD_LIBRARY_PATH", "LD_PRELOAD" ]
     for s in os.environ.keys():
-        if not s in non_inherit_vars:
-            try:
-                setVar(s, os.environ[s], d)
-                setVarFlag(s, 'matchesenv', '1', d)
-            except TypeError:
-                pass
-
-import sys
+        try:
+            setVar(s, os.environ[s], d)
+        except TypeError:
+            pass
+        os.unsetenv(s)
+        del os.environ[s]
 
 def emit_var(var, o=sys.__stdout__, d = init(), all=False):
     """Emit a variable to be sourced by a shell."""
@@ -379,9 +373,6 @@ def emit_var(var, o=sys.__stdout__, d = init(), all=False):
         o.write('unset %s\n' % varExpanded)
         return 1
 
-    if getVarFlag(var, 'matchesenv', d):
-        return 0
-
     val.rstrip()
     if not val:
         return 0
index b3a51b0..0d39d20 100644 (file)
@@ -149,9 +149,6 @@ class DataSmart:
 
         if not var in self.dict:
             self._makeShadowCopy(var)
-        if self.getVarFlag(var, 'matchesenv'):
-            self.delVarFlag(var, 'matchesenv')
-            self.setVarFlag(var, 'export', 1)
 
         # more cookies for the cookie monster
         if '_' in var:
index 9c8d8e8..3c1fd31 100644 (file)
@@ -296,6 +296,60 @@ def sha256_file(filename):
         s.update(line)
     return s.hexdigest()
 
+def preserved_envvars_list():
+    return [
+        'BBPATH',
+        'BB_PRESERVE_ENV',
+        'BB_ENV_WHITELIST',
+        'BB_ENV_EXTRAWHITE',
+        'COLORTERM',
+        'DBUS_SESSION_BUS_ADDRESS',
+        'DESKTOP_SESSION',
+        'DESKTOP_STARTUP_ID',
+        'DISPLAY',
+        'GNOME_KEYRING_PID',
+        'GNOME_KEYRING_SOCKET',
+        'GPG_AGENT_INFO',
+        'GTK_RC_FILES',
+        'HOME',
+        'LANG',
+        'LOGNAME',
+        'PATH',
+        'PWD',
+        'SESSION_MANAGER',
+        'SHELL',
+        'SSH_AUTH_SOCK',
+        'TERM',
+        'USER',
+        'USERNAME',
+        '_',
+        'XAUTHORITY',
+        'XDG_DATA_DIRS',
+        'XDG_SESSION_COOKIE',
+    ]
+
+def filter_environment(good_vars):
+    """
+    Create a pristine environment for bitbake. This will remove variables that
+    are not known and may influence the build in a negative way.
+    """
+
+    import bb
+
+    removed_vars = []
+    for key in os.environ.keys():
+        if key in good_vars:
+            continue
+        
+        removed_vars.append(key)
+        os.unsetenv(key)
+        del os.environ[key]
+
+    if len(removed_vars):
+        bb.debug(1, "Removed the following variables from the environment:", ",".join(removed_vars))
+
+    return removed_vars
+
 def prunedir(topdir):
     # Delete everything reachable from the directory named in 'topdir'.
     # CAUTION:  This is dangerous!