summaryrefslogtreecommitdiff
path: root/morphlib
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2012-06-11 11:15:40 +0100
committerRichard Maw <richard.maw@codethink.co.uk>2012-06-13 13:49:39 +0100
commitee28f213b63bff228bf2db0a585cac2d7c4edbfa (patch)
tree55229bdcae9b4becc6ecab16be6c597854f75823 /morphlib
parentd5cd1f19f6e166cdbbdb20692d1412e2b0b52876 (diff)
downloadmorph-ee28f213b63bff228bf2db0a585cac2d7c4edbfa.tar.gz
morphlib: add 'arch' field to morphologies
This is an ugly, ugly way to do this, but time is pressing. SystemBuilder checks what arch is defined in the morphology, if it is an x86 (or None for compatibility) then it will do the syslinux install stuff. This hack is needed because syslinux is x86 specific and arm often has different requirements for where the kernel must be loaded from, sometimes it is flash, sometimes it is a different partition. This will likely become board specific, but for a qemu-system-arm, the kernel should be a separate file, to be passed on the command line. Having a different 'kind' for each architecture would be a nicer way, but would require more changes, since there are various checks for morphology['kind'] == 'system'
Diffstat (limited to 'morphlib')
-rw-r--r--morphlib/builder2.py34
-rw-r--r--morphlib/fsutils.py2
-rw-r--r--morphlib/morph2.py1
3 files changed, 23 insertions, 14 deletions
diff --git a/morphlib/builder2.py b/morphlib/builder2.py
index e42e7b0f..2497216f 100644
--- a/morphlib/builder2.py
+++ b/morphlib/builder2.py
@@ -383,13 +383,15 @@ class SystemBuilder(BuilderBase): # pragma: no cover
def build_and_cache(self):
with self.build_watch('overall-build'):
logging.debug('SystemBuilder.do_build called')
+
+ arch = self.artifact.source.morphology.arch
handle = self.local_artifact_cache.put(self.artifact)
image_name = handle.name
self._create_image(image_name)
self._partition_image(image_name)
- self._install_mbr(image_name)
+ self._install_mbr(arch, image_name)
partition = self._setup_device_mapping(image_name)
mount_point = None
@@ -401,12 +403,14 @@ class SystemBuilder(BuilderBase): # pragma: no cover
self._create_subvolume(factory_path)
self._unpack_strata(factory_path)
self._create_fstab(factory_path)
- self._create_extlinux_config(factory_path)
+ if arch in ('x86', 'x86_64', None):
+ self._create_extlinux_config(factory_path)
self._create_subvolume_snapshot(
mount_point, 'factory', 'factory-run')
factory_run_path = os.path.join(mount_point, 'factory-run')
self._install_boot_files(factory_run_path, mount_point)
- self._install_extlinux(mount_point)
+ if arch in ('x86', 'x86_64', None):
+ self._install_extlinux(mount_point)
self._unmount(mount_point)
except BaseException, e:
logging.error('Got error while system image building, '
@@ -418,6 +422,7 @@ class SystemBuilder(BuilderBase): # pragma: no cover
self._undo_device_mapping(image_name)
handle.close()
+
self.save_build_times()
def _create_image(self, image_name):
@@ -432,10 +437,12 @@ class SystemBuilder(BuilderBase): # pragma: no cover
with self.build_watch('partition-image'):
morphlib.fsutils.partition_image(self.app.runcmd, image_name)
- def _install_mbr(self, image_name):
+ def _install_mbr(self, arch, image_name):
logging.debug('Installing mbr on disk image %s' % image_name)
+ if arch not in ('x86', 'x86_64', None):
+ return
with self.build_watch('install-mbr'):
- morphlib.fsutils.install_mbr(self.app.runcmd, image_name)
+ morphlib.fsutils.install_syslinux_mbr(self.app.runcmd, image_name)
def _setup_device_mapping(self, image_name):
logging.debug('Device mapping partitions in %s' % image_name)
@@ -511,16 +518,17 @@ class SystemBuilder(BuilderBase): # pragma: no cover
self.app.runcmd(['btrfs', 'subvolume', 'snapshot', source, target],
cwd=path)
- def _install_boot_files(self, sourcefs, targetfs):
+ def _install_boot_files(self, arch, sourcefs, targetfs):
logging.debug('installing boot files into root volume')
with self.build_watch('install-boot-files'):
- shutil.copy2(os.path.join(sourcefs, 'extlinux.conf'),
- os.path.join(targetfs, 'extlinux.conf'))
- os.mkdir(os.path.join(targetfs, 'boot'))
- shutil.copy2(os.path.join(sourcefs, 'boot', 'vmlinuz'),
- os.path.join(targetfs, 'boot', 'vmlinuz'))
- shutil.copy2(os.path.join(sourcefs, 'boot', 'System.map'),
- os.path.join(targetfs, 'boot', 'System.map'))
+ if arch in ('x86', 'x86_64', None):
+ shutil.copy2(os.path.join(sourcefs, 'extlinux.conf'),
+ os.path.join(targetfs, 'extlinux.conf'))
+ os.mkdir(os.path.join(targetfs, 'boot'))
+ shutil.copy2(os.path.join(sourcefs, 'boot', 'vmlinuz'),
+ os.path.join(targetfs, 'boot', 'vmlinuz'))
+ shutil.copy2(os.path.join(sourcefs, 'boot', 'System.map'),
+ os.path.join(targetfs, 'boot', 'System.map'))
def _install_extlinux(self, path):
logging.debug('Installing extlinux to %s' % path)
diff --git a/morphlib/fsutils.py b/morphlib/fsutils.py
index 770cafa8..c74e97db 100644
--- a/morphlib/fsutils.py
+++ b/morphlib/fsutils.py
@@ -26,7 +26,7 @@ def partition_image(runcmd, image_name):
# FIXME make this more flexible with partitioning options
runcmd(['sfdisk', image_name], feed_stdin='1,,83,*\n')
-def install_mbr(runcmd, image_name):
+def install_syslinux_mbr(runcmd, image_name):
for path in ['/usr/lib/extlinux/mbr.bin',
'/usr/share/syslinux/mbr.bin']:
if os.path.exists(path):
diff --git a/morphlib/morph2.py b/morphlib/morph2.py
index 37e6f24f..394c27c3 100644
--- a/morphlib/morph2.py
+++ b/morphlib/morph2.py
@@ -38,6 +38,7 @@ class Morphology(object):
('description', ''),
('build-depends', None),
('build-system', 'manual'),
+ ('arch', None),
]
def __init__(self, text):