Hello,

with this patch, I don't get a tar for devel/qemu and for the 6/rtems-microblaze anymore. All other 6/rtems-* toolchains work without problems. I haven't tested a lot of the other packages.

The bset for microblaze is a bit different from the other ones. But I'm not yet sure what the relevant difference is.

@Chris: With your change: What is necessary that a bset can generate a tar archive?

Best regards

Christian

Am 19.09.22 um 23:24 schrieb Chris Johns:
Module:    rtems-source-builder
Branch:    5
Commit:    828feec622c3ebfdf96a50f5789fcace93717f82
Changeset: 
http://git.rtems.org/rtems-source-builder/commit/?id=828feec622c3ebfdf96a50f5789fcace93717f82

Author:    Chris Johns <chr...@rtems.org>
Date:      Thu Sep  1 16:20:44 2022 +1000

sb/setbuilder: Correctly create build set tar files

- Make a single tarfile for all buildsets built

- Use the staging tree as the tarfile source

- Use python's tarfile module

- Create a config.file object without loading a .cfg file

Updates #4716

---

  source-builder/sb/config.py     |  5 ++--
  source-builder/sb/setbuilder.py | 58 +++++++++++++++++++++++++----------------
  2 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/source-builder/sb/config.py b/source-builder/sb/config.py
index 9250896..24590eb 100644
--- a/source-builder/sb/config.py
+++ b/source-builder/sb/config.py
@@ -258,7 +258,7 @@ class file:
                  re.compile('%select'),
                  re.compile('%disable') ]
- def __init__(self, name, opts, macros = None):
+    def __init__(self, name, opts, macros = None, load = True):
          log.trace('config: %s: initialising' % (name))
          self.opts = opts
          self.init_name = name
@@ -267,7 +267,8 @@ class file:
          self.sf = re.compile(r'%\([^\)]+\)')
          self.set_macros(macros)
          self._reset(name)
-        self.load(name)
+        if load:
+            self.load(name)
def __str__(self): diff --git a/source-builder/sb/setbuilder.py b/source-builder/sb/setbuilder.py
index 55bd86f..36fca46 100644
--- a/source-builder/sb/setbuilder.py
+++ b/source-builder/sb/setbuilder.py
@@ -30,11 +30,14 @@ import glob
  import operator
  import os
  import sys
+import tarfile
+
  import textwrap
try:
      import build
      import check
+    import config
      import error
      import log
      import mailer
@@ -259,21 +262,31 @@ class buildset:
                  self.root_copy(_build.config.expand('%{buildroot}'),
                                 _build.config.expand('%{_tmproot}'))
- def bset_tar(self, _build):
-        tardir = _build.config.expand('%{_tardir}')
-        if (self.opts.get_arg('--bset-tar-file') or 
self.opts.canadian_cross()) \
-           and not _build.macros.get('%{_disable_packaging}'):
+    def bset_tar(self, stagingroot):
+        if self.opts.get_arg('--bset-tar-file') or self.opts.canadian_cross():
+            # Use a config to expand the macros because it supports all
+            # expansions, ie %{_cwd}
+            cfg = config.file(self.bset, self.opts, self.macros, load=False)
+            prefix = cfg.expand('%{_prefix}')
+            tardir = cfg.expand('%{_tardir}')
              path.mkdir(tardir)
-            tar = path.join(tardir,
-                            _build.config.expand('%s.tar.bz2' % \
-                                                 
(_build.main_package().name())))
-            log.notice('tarball: %s' % (os.path.relpath(path.host(tar))))
+            tarname = path.join(tardir,
+                                path.basename('%s.tar.bz2' % (self.bset)))
+            log.notice('tarfile: %s' % (os.path.relpath(path.host(tarname))))
              if not self.opts.dry_run():
-                tmproot = _build.config.expand('%{_tmproot}')
-                cmd = _build.config.expand('"cd ' + tmproot + \
-                                           ' && %{__tar} -cf - . | %{__bzip2} 
> ' + \
-                                           tar + '"')
-                _build.run(cmd, shell_opts = '-c', cwd = tmproot)
+                tar = None
+                try:
+                    tar = tarfile.open(tarname, 'w:bz2')
+                    for filedir in sorted(path.listdir(stagingroot)):
+                        src = path.join(stagingroot, filedir)
+                        dst = path.join(prefix, filedir)
+                        log.trace('tar: %s -> %s' % (src, dst))
+                        tar.add(src, dst)
+                except OSError as oe:
+                    raise error.general('tarfile: %s: %s' % (self.bset, oe))
+                finally:
+                    if tar is not None:
+                        tar.close()
def parse(self, bset): @@ -500,8 +513,6 @@ class buildset:
                                          copy.copy(self.macros),
                                          format = 'xml',
                                          mail = mail)
-                            if s == len(configs) - 1 and not have_errors:
-                                self.bset_tar(b)
                          else:
                              deps += b.config.includes()
                          builds += [b]
@@ -540,7 +551,7 @@ class buildset:
              log.trace('_bset: %2d: %s: builds: %s' % \
                        (nesting_count, self.install_mode(),
                         ', '.join([b.name() for b in builds])))
-            if deps is None and not self.opts.no_install() and not have_errors:
+            if deps is None and not have_errors:
                  for b in builds:
                      log.trace('_bset:   : %s: %r' % (self.install_mode(),
                                                       b.installable()))
@@ -550,7 +561,6 @@ class buildset:
                          if self.staging():
                              prefix = b.config.expand('%{stagingroot}')
                          self.install(self.install_mode(), b.name(), 
buildroot, prefix)
-
              #
              # Sizes ...
              #
@@ -604,16 +614,20 @@ class buildset:
                  del b
#
-            # If builds have been staged install into the finaly prefix.
+            # If builds have been staged install into the final prefix.
              #
-            if have_staging and not self.opts.no_install() and not have_errors:
+            if have_staging and not have_errors:
                  stagingroot = macro_expand(self.macros, '%{stagingroot}')
                  have_stagingroot = path.exists(stagingroot)
-                log.trace('_bset: %2d: install staging, present: %s' % \
-                          (nesting_count, have_stagingroot))
+                do_install = not self.opts.no_install()
+                if do_install:
+                    log.trace('_bset: %2d: install staging, present: %s' % \
+                              (nesting_count, have_stagingroot))
                  if have_stagingroot:
                      prefix = macro_expand(self.macros, '%{_prefix}')
-                    self.install(self.install_mode(), self.bset, stagingroot, 
prefix)
+                    if do_install:
+                        self.install(self.install_mode(), self.bset, 
stagingroot, prefix)
+                    self.bset_tar(stagingroot)
                      staging_size = path.get_size(stagingroot)
                      if not self.opts.no_clean() or self.opts.always_clean():
                          log.notice('clean staging: %s' % (self.bset))

_______________________________________________
vc mailing list
v...@rtems.org
http://lists.rtems.org/mailman/listinfo/vc

--
--------------------------------------------
embedded brains GmbH
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email:  christian.maude...@embedded-brains.de
phone:  +49-89-18 94 741 - 18
mobile: +49-176-152 206 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to