From ee28f213b63bff228bf2db0a585cac2d7c4edbfa Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Mon, 11 Jun 2012 11:15:40 +0100 Subject: 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' --- morphlib/builder2.py | 34 +++++++++++++++++++++------------- morphlib/fsutils.py | 2 +- morphlib/morph2.py | 1 + 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): -- cgit v1.2.1