Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/osbuilder.py
diff options
context:
space:
mode:
authorDaniel Drake <dsd@laptop.org>2012-10-01 21:31:06 (GMT)
committer Daniel Drake <dsd@laptop.org>2012-10-01 21:32:36 (GMT)
commitc7425d50162106b2de997d71ec3b8bba65c03a15 (patch)
tree735ad833bcb8af180b905d655ecfb7ed807624eb /osbuilder.py
parentc976ef03b02a5c9dc5dfc114a4a7c18759218003 (diff)
Make environment available to kspost nochroot scripts
Generate the environment just once during the build process, and additionally dump it in shell format to a file. Load this file when executing nochroot scripts. Such scripts now have access to config settings, etc. The default interpreter was changed from sh to bash because shlib uses bashisms.
Diffstat (limited to 'osbuilder.py')
-rwxr-xr-xosbuilder.py100
1 files changed, 57 insertions, 43 deletions
diff --git a/osbuilder.py b/osbuilder.py
index 2550665..de4a15d 100755
--- a/osbuilder.py
+++ b/osbuilder.py
@@ -33,6 +33,7 @@ import subprocess
import shutil
import re
import time
+import pipes
from optparse import OptionParser
class StageException(Exception):
@@ -49,43 +50,6 @@ class Stage(object):
self.ignore_failures = ignore_failures
pass
- def _make_environment(self):
- env = {}
-
- # copy some bits from parent environment
- for key in ('HOSTNAME', 'USER', 'USERNAME', 'LANG', 'HOME', 'LOGNAME',
- 'SHELL', 'PATH'):
- if key in os.environ:
- env[key] = os.environ[key]
-
- env['PYTHONPATH'] = self.osb.libdir
- env['OOB__shlib'] = os.path.join(self.osb.libdir, 'shlib.sh')
- env['OOB__libdir'] = self.osb.libdir
- env['OOB__bindir'] = self.osb.bindir
- env['OOB__builddir'] = self.osb.builddir
- env['OOB__cachedir'] = self.osb.cachedir
- env['OOB__intermediatesdir'] = self.osb.intermediatesdir
- env['OOB__shareddir'] = self.osb.shareddir
- env['OOB__outputdir'] = self.osb.outputdir
- env['OOB__statedir'] = self.osb.statedir
- env['OOB__fsmount'] = self.osb.fsmount
-
- env['oob_config_dir'] = os.path.dirname(self.osb.build_configs[0])
-
- if self.osb.cacheonly:
- env['OOB__cacheonly'] = 'True'
-
- envpath = env['PATH'].split(':')
- for dir in ('/sbin', '/usr/sbin'):
- if envpath.count(dir) == 0:
- env['PATH'] = env['PATH'] + ':' + dir
-
- for section in self.osb.cfg.sections():
- for option in self.osb.cfg.options(section):
- val = self.osb.cfg.get(section, option)
- env["CFG_%s__%s" % (section, option)] = val
- return env
-
def _run_part(self, mod, part, output):
print " * Running part %s %s %s..." % (self.name, mod, part)
self.on_run_part(mod, part, output)
@@ -101,9 +65,8 @@ class Stage(object):
for line in fd:
output.write(line)
elif path.endswith(".sh"):
- shenv = self._make_environment()
proc = subprocess.Popen(["/bin/bash", path], shell=False,
- stdout=outtype, env=shenv)
+ stdout=outtype, env=self.osb.env)
try:
(out, err) = proc.communicate()
except (Exception, KeyboardInterrupt), e:
@@ -115,9 +78,8 @@ class Stage(object):
if not self.console_output:
output.write(out)
elif path.endswith(".py"):
- shenv = self._make_environment()
proc = subprocess.Popen(["/usr/bin/python", path], shell=False,
- stdout=outtype, env=shenv)
+ stdout=outtype, env=self.osb.env)
try:
(out, err) = proc.communicate()
except (Exception, KeyboardInterrupt), e:
@@ -212,13 +174,18 @@ class KspostStage(KsStage):
super(KspostStage, self).__init__(osb, "kspost")
def on_run_part(self, mod, part, output):
- output.write("\n%post --erroronfail")
- if ".nochroot." in part:
+ output.write("\n%post --erroronfail --interpreter=/bin/bash")
+ nochroot = ".nochroot." in part
+ if nochroot:
output.write(" --nochroot")
print >>output, "\necho 'Executing code generated by %s:%s/%s...'" \
% (self.name, mod, part)
print >>output, "set -e"
+ # Make the normal environment available for non-chroot scripts
+ if nochroot:
+ print >>output, ". " + os.path.join(self.osb.intermediatesdir, 'env')
+
def on_run_part_done(self, mod, part, output):
print >>output, "%end"
@@ -313,6 +280,51 @@ class OsBuilder(object):
self.modules.remove('global')
self.read_config()
+ self.env = self.make_environment()
+
+ def make_environment(self):
+ env = {}
+
+ # copy some bits from parent environment
+ for key in ('HOSTNAME', 'USER', 'USERNAME', 'LANG', 'HOME', 'LOGNAME',
+ 'SHELL', 'PATH'):
+ if key in os.environ:
+ env[key] = os.environ[key]
+
+ env['PYTHONPATH'] = self.libdir
+ env['OOB__shlib'] = os.path.join(self.libdir, 'shlib.sh')
+ env['OOB__libdir'] = self.libdir
+ env['OOB__bindir'] = self.bindir
+ env['OOB__builddir'] = self.builddir
+ env['OOB__cachedir'] = self.cachedir
+ env['OOB__intermediatesdir'] = self.intermediatesdir
+ env['OOB__shareddir'] = self.shareddir
+ env['OOB__outputdir'] = self.outputdir
+ env['OOB__statedir'] = self.statedir
+ env['OOB__fsmount'] = self.fsmount
+
+ env['oob_config_dir'] = os.path.dirname(self.build_configs[0])
+
+ if self.cacheonly:
+ env['OOB__cacheonly'] = 'True'
+
+ envpath = env['PATH'].split(':')
+ for dir in ('/sbin', '/usr/sbin'):
+ if envpath.count(dir) == 0:
+ env['PATH'] = env['PATH'] + ':' + dir
+
+ for section in self.cfg.sections():
+ for option in self.cfg.options(section):
+ val = self.cfg.get(section, option)
+ env["CFG_%s__%s" % (section, option)] = val
+ return env
+
+ def dump_environment(self):
+ # Dump the build environment into a bash-compatible script
+ fd = open(os.path.join(self.intermediatesdir, "env"), "w")
+ for var, value in self.env.iteritems():
+ fd.write("export %s=%s\n" % (var, pipes.quote(value)))
+ fd.close()
def suggested_mismatch(self, suggested_version):
# we only compare the first two version components
@@ -388,6 +400,8 @@ class OsBuilder(object):
if not os.path.exists(dir):
os.makedirs(dir)
+ self.dump_environment()
+
# truncate file and write header
ksfd = open(self.get_ks_file_path(), 'w')
ksfd.write("# Generated with OLPC OS builder\n")