From 2e182847e4a780c58c5b8046eb98f7f6c8970ea1 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 30 Sep 2008 20:57:18 +0000 Subject: [PATCH] bitbake/bitbake-dev: Allow much better control of which variable influence bitbake from the environment git-svn-id: https://svn.o-hand.com/repos/poky/trunk@5347 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- bitbake-dev/bin/bitbake | 11 +++++++ bitbake-dev/lib/bb/data.py | 21 ++++--------- bitbake-dev/lib/bb/data_smart.py | 3 -- bitbake-dev/lib/bb/utils.py | 54 ++++++++++++++++++++++++++++++++ bitbake/bin/bitbake | 10 ++++++ bitbake/lib/bb/data.py | 21 ++++--------- bitbake/lib/bb/data_smart.py | 3 -- bitbake/lib/bb/utils.py | 54 ++++++++++++++++++++++++++++++++ 8 files changed, 141 insertions(+), 36 deletions(-) diff --git a/bitbake-dev/bin/bitbake b/bitbake-dev/bin/bitbake index c994edb84b..247b54fcd3 100755 --- a/bitbake-dev/bin/bitbake +++ b/bitbake-dev/bin/bitbake @@ -140,6 +140,17 @@ 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() host = cooker.server.host port = cooker.server.port diff --git a/bitbake-dev/lib/bb/data.py b/bitbake-dev/lib/bb/data.py index 54b2615afb..82eef44989 100644 --- a/bitbake-dev/lib/bb/data.py +++ b/bitbake-dev/lib/bb/data.py @@ -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 diff --git a/bitbake-dev/lib/bb/data_smart.py b/bitbake-dev/lib/bb/data_smart.py index b3a51b0edf..0d39d20a45 100644 --- a/bitbake-dev/lib/bb/data_smart.py +++ b/bitbake-dev/lib/bb/data_smart.py @@ -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: diff --git a/bitbake-dev/lib/bb/utils.py b/bitbake-dev/lib/bb/utils.py index 0a0c9ada34..9c9eb5d328 100644 --- a/bitbake-dev/lib/bb/utils.py +++ b/bitbake-dev/lib/bb/utils.py @@ -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! diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index e262d0b9b4..dc35152d57 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -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: diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 54b2615afb..82eef44989 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -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 diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index b3a51b0edf..0d39d20a45 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -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: diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 9c8d8e8435..3c1fd31b03 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -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!