summaryrefslogtreecommitdiff
path: root/morphlib/buildcommand.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/buildcommand.py')
-rw-r--r--morphlib/buildcommand.py40
1 files changed, 14 insertions, 26 deletions
diff --git a/morphlib/buildcommand.py b/morphlib/buildcommand.py
index c83abca6..cab38395 100644
--- a/morphlib/buildcommand.py
+++ b/morphlib/buildcommand.py
@@ -74,7 +74,8 @@ class BuildCommand(object):
This includes creating the directories on disk if they are missing.
'''
- return morphlib.util.new_artifact_caches(self.app.settings)
+ return morphlib.util.new_artifact_caches(
+ self.app.settings, status_cb=self.app.status)
def new_repo_caches(self):
return morphlib.util.new_repo_caches(self.app)
@@ -119,7 +120,10 @@ class BuildCommand(object):
root_kind = root_artifact.source.morphology['kind']
if root_kind != 'system':
raise morphlib.Error(
- 'Building a %s directly is not supported' % root_kind)
+ 'In order to build this %s directly, please give the filename '
+ 'of the system which contains it, and the name of the %s. '
+ 'See `morph build --help` for more information.'
+ % (root_kind, root_kind))
def _validate_architecture(self, root_artifact):
'''Perform the validation between root and target architectures.'''
@@ -271,7 +275,8 @@ class BuildCommand(object):
def build_in_order(self, root_artifact):
'''Build everything specified in a build order.'''
- self.app.status(msg='Building a set of sources')
+ self.app.status(msg='Starting build of %(name)s',
+ name=root_artifact.source.name)
build_env = root_artifact.build_env
ordered_sources = list(self.get_ordered_sources(root_artifact.walk()))
old_prefix = self.app.status_prefix
@@ -487,32 +492,13 @@ class BuildCommand(object):
if artifact.source.build_mode == 'bootstrap':
if not self.in_same_stratum(artifact.source, target_source):
continue
+
self.app.status(
msg='Installing chunk %(chunk_name)s from cache %(cache)s',
chunk_name=artifact.name,
cache=artifact.source.cache_key[:7],
chatty=True)
- chunk_cache_dir = os.path.join(self.app.settings['tempdir'],
- 'chunks')
- artifact_checkout = os.path.join(
- chunk_cache_dir, os.path.basename(artifact.basename()) + '.d')
- if not os.path.exists(artifact_checkout):
- self.app.status(
- msg='Checking out %(chunk)s from cache.',
- chunk=artifact.name
- )
- temp_checkout = os.path.join(self.app.settings['tempdir'],
- artifact.basename())
- try:
- self.lac.get(artifact, temp_checkout)
- except BaseException:
- shutil.rmtree(temp_checkout)
- raise
- # TODO: This rename is not concurrency safe if two builds are
- # extracting the same chunk, one build will fail because
- # the other renamed its tempdir here first.
- os.rename(temp_checkout, artifact_checkout)
- staging_area.install_artifact(artifact, artifact_checkout)
+ staging_area.install_artifact(self.lac, artifact)
if target_source.build_mode == 'staging':
morphlib.builder.ldconfig(self.app.runcmd, staging_area.dirname)
@@ -540,7 +526,8 @@ class InitiatorBuildCommand(BuildCommand):
self.app.settings['push-build-branches'] = True
super(InitiatorBuildCommand, self).__init__(app)
- def build(self, repo_name, ref, filename, original_ref=None):
+ def build(self, repo_name, ref, filename, original_ref=None,
+ component_names=[]):
'''Initiate a distributed build on a controller'''
distbuild.add_crash_conditions(self.app.settings['crash-condition'])
@@ -551,7 +538,8 @@ class InitiatorBuildCommand(BuildCommand):
self.app.status(msg='Starting distributed build')
loop = distbuild.MainLoop()
- args = [repo_name, ref, filename, original_ref or ref]
+ args = [repo_name, ref, filename, original_ref or ref,
+ component_names]
cm = distbuild.InitiatorConnectionMachine(self.app,
self.addr,
self.port,