[elbe-devel] [PATCH v2 17/24] elbeproject: implement build_sdk function

Torben Hohn torben.hohn at linutronix.de
Thu Feb 8 16:44:08 CET 2018


On Thu, Feb 08, 2018 at 02:17:03PM +0100, Manuel Traut wrote:
> This generates a SDK including a host-sysroot with cross-toolchain and
> the target-sysroot.
> 
> The SDK is generated in a 'yocto' like format: a self-extracting shell
> script.
> 
> This is a basic implementation with some hard-coded values.
> Currently only x86_64 host and arm-linux-gnueabihf target is supported.
> 
> Also the 'setup-environment-*' file is currently empty. So $PATH etc.
> needs to be set by hand.
> 
> Signed-off-by: Manuel Traut <manut at linutronix.de>

Reviewed-by: Torben Hohn <torben.hohn at linutronix.de>

> ---
>  elbepack/elbeproject.py | 63 ++++++++++++++++++++++++++++++++++++++++++++-----
>  elbepack/xmldefaults.py |  3 ++-
>  2 files changed, 59 insertions(+), 7 deletions(-)
> 
> diff --git a/elbepack/elbeproject.py b/elbepack/elbeproject.py
> index 3d0596c9..5dccd24f 100644
> --- a/elbepack/elbeproject.py
> +++ b/elbepack/elbeproject.py
> @@ -42,7 +42,10 @@ from elbepack.pbuilder import (pbuilder_write_config, pbuilder_write_repo_hook,
>  
>  from elbepack.repomanager import ProjectRepo
>  from elbepack.config import cfg
> -from elbepack.pkgutils import get_uri
> +from elbepack.pkgutils import extract_pkg
> +from elbepack.directories import (mako_template_dir, pack_dir)
> +from elbepack.templates import template
> +
>  
>  class IncompatibleArchitectureException(Exception):
>      def __init__(self, oldarch, newarch):
> @@ -62,6 +65,11 @@ class AptCacheCommitError(Exception):
>          Exception.__init__(self, "Error Committing rpcaptcache %s" % msg)
>  
>  
> +class UnsupportedSDKException(Exception):
> +    def __init__(self, triplet):
> +        Exception.__init__(self, "SDK for %s currently unsupported" % triplet)
> +
> +
>  class ElbeProject (object):
>      def __init__(
>              self,
> @@ -81,6 +89,7 @@ class ElbeProject (object):
>          self.builddir = os.path.abspath(str(builddir))
>          self.chrootpath = os.path.join(self.builddir, "chroot")
>          self.targetpath = os.path.join(self.builddir, "target")
> +        self.sdkpath = os.path.join(self.builddir, "sdk")
>  
>          self.name = name
>          self.override_buildtype = override_buildtype
> @@ -142,7 +151,7 @@ class ElbeProject (object):
>              self.buildenv = None
>  
>          # Create TargetFs instance, if the target directory exists
> -        if os.path.exists(self.targetpath):
> +        if os.path.exists(self.targetpath) and self.buildenv:
>              self.targetfs = TargetFs(self.targetpath, self.log,
>                                       self.buildenv.xml, clean=False)
>          else:
> @@ -180,6 +189,9 @@ class ElbeProject (object):
>  
>      def build_sysroot(self):
>  
> +        if not self.buildenv:
> +            self.build()
> +
>          # ignore packages from debootstrap
>          ignore_pkgs = [p.et.text for p in self.xml.node("debootstrappkgs")]
>          ignore_dev_pkgs = []
> @@ -210,10 +222,9 @@ class ElbeProject (object):
>              self.log.do("chroot %s /usr/bin/symlinks -cr /usr/lib" %
>                          self.chrootpath)
>  
> -        paths = self.__get_sysrootpaths()
> +        paths = self.__get_sysroot_paths()
>  
>          self.log.do("rm %s" % sysrootfilelist, allow_fail=True)
> -
>          os.chdir(self.chrootpath)
>          for p in paths:
>              self.log.do('find -path "%s" >> %s' % (p, sysrootfilelist))
> @@ -229,8 +240,48 @@ class ElbeProject (object):
>          self.buildenv.rfs.remove("/etc/elbe_version", noerr=True)
>  
>      def build_sdk(self):
> -        toolchain = "gcc-%s" % self.xml.defs["triplet"]
> -        print(get_uri(self.xml.prj, self.xml.defs, 'amd64', toolchain))
> +        triplet = self.xml.defs["triplet"]
> +
> +        try:
> +            crosstoolchainpkg = "gcc-%s" % self.xml.defs["sdkarch"]
> +        except KeyError:
> +            raise UnsupportedSDKException(triplet)
> +
> +        # build target sysroot including libs and headers for the target
> +        self.build_sysroot()
> +        sdktargetpath = os.path.join(self.sdkpath, "sysroots", "target")
> +        self.log.do("mkdir -p %s" % sdktargetpath)
> +        self.log.do("tar xJf %s/sysroot.tar.xz -C %s" % (self.builddir,
> +                                                          sdktargetpath))
> +        # build host sysroot including cross compiler
> +        hostsysrootpath = os.path.join(self.sdkpath, 'sysroots', 'host')
> +        self.log.do('mkdir -p "%s"' % hostsysrootpath)
> +        extract_pkg(self.xml.prj,
> +                    hostsysrootpath,
> +                    self.xml.defs,
> +                    crosstoolchainpkg,
> +                    'amd64',
> +                    True)
> +
> +        # generate the setup script
> +        sdkvalues = { 'sdk_arch': 'x86_64',
> +                      'sdk_gcc_ver': '',
> +                      'sdk_path': '/opt/elbe-sdk',
> +                      'sdk_ext_path': '~/elbe-sdk',
> +                      'real_multimach_target_sys': triplet,
> +                      'sdk_title': 'ELBE %s' % self.xml.text("project/name"),
> +                      'sdk_version': self.xml.text("project/version"),
> +                    }
> +        t = os.path.join(mako_template_dir, 'toolchain-shar-extract.sh.mako')
> +        with open(os.path.join(self.builddir, 'setup-sdk.sh'), 'w') as f:
> +            f.write(template(t, sdkvalues))
> +
> +        # create sdk tar and append it to setup script
> +        self.log.do("cd %s; touch environment-setup-elbe" % self.sdkpath)
> +        self.log.do("cd %s; tar cJf ../sdk.txz ." % self.sdkpath)
> +        self.log.do("cd %s; cat sdk.txz >> setup-sdk.sh" % self.builddir)
> +        self.log.do("cd %s; chmod +x setup-sdk.sh" % self.builddir)
> +
>  
>      def pbuild(self, p):
>          self.pdebuild_init()
> diff --git a/elbepack/xmldefaults.py b/elbepack/xmldefaults.py
> index 1237bcb7..4ac7de92 100644
> --- a/elbepack/xmldefaults.py
> +++ b/elbepack/xmldefaults.py
> @@ -54,7 +54,8 @@ armhf_defaults = {
>      "console": "ttyAMA0,115200n1",
>      "machine": "versatilepb -cpu cortex-a9",
>      "nicmodel": "smc91c111",
> -    "triplet": "arm-linux-gnueabihf"
> +    "triplet": "arm-linux-gnueabihf",
> +    "sdkarch": "arm-linux-gnueabihf"
>  }
>  
>  armhf_linaro48_defaults = {
> -- 
> 2.15.1
> 

-- 
Mit freundlichen Grüßen
Torben Hohn

Linutronix GmbH

Standort: Bremen

Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99

Firmensitz / Registered Office: D-88690 Uhldingen, Bahnhofstr. 3
Registergericht / Local District Court: Amtsgericht Freiburg i. Br.; HRB
Nr. / Trade register no.: 700 806

Geschäftsführer / Managing Directors: Heinz Egger, Thomas Gleixner

Eine Bitte von uns: Sollten Sie diese E-Mail irrtümlich erhalten haben,
benachrichtigen Sie uns in diesem Falle bitte sobald wie es Ihnen
möglich ist, durch Antwort-Mail. Vielen Dank!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.linutronix.de/pipermail/elbe-devel/attachments/20180208/cbdf69dd/attachment.sig>


More information about the elbe-devel mailing list