Пример #1
0
 def test_run_build_src_package(self):
     """Test run_build, source and backup packages built."""
     self.args.build_source_packages = True
     # We need to create dummy source trees, but they do not
     # actually need to come from checking out the given version
     # control locations.
     srcdir = os.path.join(self.tempdir, 'src')
     create_files(
         srcdir, ['build_src_open-123', 'build_src_closed-456'], {
             'build_src_open-123/x': 'x',
             'build_src_closed-456/y': 'y',
             'build_src_closed-456/.git': 'ignore'
         }, {})
     self.setup_rc('cfg.add_component("build_src_open")\n'
                   'cfg.build_src_open.version.set("123")\n'
                   'cfg.build_src_open.vc.set(TarVC("/dummy"))\n'
                   'cfg.add_component("build_src_closed")\n'
                   'cfg.build_src_closed.version.set("456")\n'
                   'cfg.build_src_closed.vc.set(GitVC("/dummy"))\n'
                   'cfg.source_date_epoch.set(1111199990)\n')
     with self.redirect_stdout_stderr():
         self.build_context.run_build()
     pkg_src = self.relcfg.pkgdir_path(None, '.src.tar.xz')
     pkg_backup = self.relcfg.pkgdir_path(None, '.backup.tar.xz')
     dir_src = os.path.join(self.tempdir,
                            'toolchain-1.0-1-aarch64-linux-gnu')
     dir_backup = os.path.join(self.tempdir,
                               'toolchain-1.0-1-aarch64-linux-gnu.backup')
     subprocess.run(['tar', '-x', '-f', pkg_src],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(os.listdir(dir_src), ['build_src_open-1.0-1.tar.xz'])
     subprocess.run(['tar', '-x', '-f', pkg_backup],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(os.listdir(dir_backup),
                      ['build_src_closed-1.0-1.tar.xz'])
     tar_open = os.path.join(dir_src, 'build_src_open-1.0-1.tar.xz')
     tar_closed = os.path.join(dir_backup, 'build_src_closed-1.0-1.tar.xz')
     self.assertEqual(os.stat(tar_open).st_mtime, 1111199990)
     self.assertEqual(os.stat(tar_closed).st_mtime, 1111199990)
     subprocess.run(['tar', '-x', '-f', tar_open],
                    cwd=self.tempdir,
                    check=True)
     subprocess.run(['tar', '-x', '-f', tar_closed],
                    cwd=self.tempdir,
                    check=True)
     dir_open = os.path.join(self.tempdir, 'build_src_open-1.0-1')
     dir_closed = os.path.join(self.tempdir, 'build_src_closed-1.0-1')
     self.assertEqual(read_files(dir_open), (set(), {'x': 'x'}, {}))
     self.assertEqual(read_files(dir_closed), (set(), {'y': 'y'}, {}))
     self.assertEqual(
         os.stat(os.path.join(dir_open, 'x')).st_mtime, 1111199990)
     self.assertEqual(
         os.stat(os.path.join(dir_closed, 'y')).st_mtime, 1111199990)
Пример #2
0
 def test_move_sysroot_executables(self):
     """Test move_sysroot_executables."""
     loader = ReleaseConfigTextLoader()
     relcfg_text = ('cfg.build.set("x86_64-linux-gnu")\n'
                    'cfg.target.set("aarch64-linux-gnu")\n'
                    'cfg.add_component("generic")\n'
                    'cfg.generic.vc.set(GitVC("dummy"))\n'
                    'cfg.generic.version.set("1.23")\n'
                    'cfg.add_component("sysrooted_libc")\n'
                    'cfg.sysrooted_libc.vc.set(GitVC("dummy"))\n'
                    'cfg.sysrooted_libc.version.set("1.23")\n'
                    'cfg.multilibs.set((Multilib("generic", '
                    '"sysrooted_libc", ()), Multilib("generic", '
                    '"sysrooted_libc", ("-m64",), '
                    'sysroot_osdir="../lib64"), Multilib("generic", '
                    '"sysrooted_libc", ("-mfoo",), '
                    'sysroot_suffix="foo")))\n')
     relcfg = ReleaseConfig(self.context, relcfg_text, loader, self.args)
     multilibs = relcfg.multilibs.get()
     create_files(self.indir, ['bin1', 'bin2'], {
         'bin1/a': 'file bin1/a',
         'bin2/b': 'file bin2/b'
     }, {})
     tree = FSTreeCopy(self.context, self.indir, {'name'})
     tree_moved = multilibs[0].move_sysroot_executables(
         tree, ('bin1', 'bin2'))
     tree_moved.export(self.outdir)
     self.assertEqual(read_files(self.outdir),
                      ({'bin1', 'bin2', 'usr', 'usr/lib', 'usr/lib/bin'}, {
                          'usr/lib/bin/a': 'file bin1/a',
                          'usr/lib/bin/b': 'file bin2/b'
                      }, {}))
     shutil.rmtree(self.outdir)
     tree_moved = multilibs[1].move_sysroot_executables(
         tree, ['bin1', 'bin2'])
     tree_moved.export(self.outdir)
     self.assertEqual(
         read_files(self.outdir),
         ({'bin1', 'bin2', 'usr', 'usr/lib64', 'usr/lib64/bin'}, {
             'usr/lib64/bin/a': 'file bin1/a',
             'usr/lib64/bin/b': 'file bin2/b'
         }, {}))
     shutil.rmtree(self.outdir)
     # When only one multilib uses the sysroot, the files are kept
     # in their original locations as well as being copied.
     tree_moved = multilibs[2].move_sysroot_executables(
         tree, ('bin1', 'bin2'))
     tree_moved.export(self.outdir)
     self.assertEqual(read_files(self.outdir),
                      ({'bin1', 'bin2', 'usr', 'usr/lib', 'usr/lib/bin'}, {
                          'bin1/a': 'file bin1/a',
                          'bin2/b': 'file bin2/b',
                          'usr/lib/bin/a': 'file bin1/a',
                          'usr/lib/bin/b': 'file bin2/b'
                      }, {}))
Пример #3
0
 def test_svn_copy_without_metadata(self):
     """Test copying checkouts from SVN."""
     subprocess.run(['svnadmin', 'create', self.svndir], check=True)
     svn_uri = 'file://%s' % self.svndir
     subprocess.run(['svn', '-q', 'co', svn_uri, self.codir], check=True)
     self.co_file_write('svnfile', 'svnfile contents')
     os.mkdir(self.co_file('dir'))
     self.co_file_write('dir/file2', 'file2 contents')
     subprocess.run(['svn', '-q', 'add', 'svnfile', 'dir'],
                    cwd=self.codir,
                    check=True)
     subprocess.run(['svn', '-q', 'commit', '-m', 'commit message'],
                    cwd=self.codir,
                    check=True)
     vc_obj = SvnVC(self.context, svn_uri)
     vc_obj.vc_checkout(self.srcdir, False)
     os.chmod(os.path.join(self.srcdir, 'svnfile'), stat.S_IRWXU)
     vc_obj.copy_without_metadata(self.srcdir, self.srcdir_copy)
     self.assertEqual(read_files(self.srcdir_copy),
                      ({'dir'}, {
                          'svnfile': 'svnfile contents',
                          'dir/file2': 'file2 contents'
                      }, {}))
     mode = stat.S_IMODE(
         os.stat(os.path.join(self.srcdir_copy, 'svnfile')).st_mode)
     self.assertEqual(mode, (stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP
                             | stat.S_IROTH | stat.S_IXOTH))
 def test_fix_perms(self):
     """Test the fix_perms function."""
     create_files(self.indir, ['a', 'b', 'b/c'],
                  {'x': 'file x', 'b/c/y': 'file b/c/y'},
                  {'dead-symlink': 'bad', 'ext-symlink': '/'})
     os.chmod(self.indir, stat.S_IRWXU)
     os.chmod(os.path.join(self.indir, 'x'), stat.S_IRWXU | stat.S_IROTH)
     os.chmod(os.path.join(self.indir, 'b/c/y'), 0)
     fix_perms(self.indir)
     self.assertEqual(read_files(self.indir),
                      ({'a', 'b', 'b/c'},
                       {'x': 'file x', 'b/c/y': 'file b/c/y'},
                       {'dead-symlink': 'bad', 'ext-symlink': '/'}))
     mode_ex = (stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP
                | stat.S_IROTH | stat.S_IXOTH)
     mode_noex = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH
     mode = stat.S_IMODE(os.stat(self.indir).st_mode)
     self.assertEqual(mode, mode_ex)
     mode = stat.S_IMODE(os.stat(os.path.join(self.indir, 'a')).st_mode)
     self.assertEqual(mode, mode_ex)
     mode = stat.S_IMODE(os.stat(os.path.join(self.indir, 'b')).st_mode)
     self.assertEqual(mode, mode_ex)
     mode = stat.S_IMODE(os.stat(os.path.join(self.indir, 'b/c')).st_mode)
     self.assertEqual(mode, mode_ex)
     mode = stat.S_IMODE(os.stat(os.path.join(self.indir, 'x')).st_mode)
     self.assertEqual(mode, mode_ex)
     mode = stat.S_IMODE(os.stat(os.path.join(self.indir, 'b/c/y')).st_mode)
     self.assertEqual(mode, mode_noex)
 def test_tar_command_run(self):
     """Test running the command from the tar_command function."""
     create_files(self.indir, ['a', 'b', 'b/c'],
                  {'a1': 'a', 'a2': 'a', 'b/c/a3': 'a', 'b/a4': 'a',
                   'b1': 'b', 'b/b2': 'b', 'c': 'c'},
                  {'a-link': 'a1', 'dead-link': 'bad'})
     hard_link_files(self.context, self.indir)
     test_tar_xz = os.path.join(self.tempdir, 'test.tar.xz')
     subprocess.run(tar_command(test_tar_xz, 'top+dir-1.0', 1234567890),
                    cwd=self.indir, check=True)
     subprocess.run(['tar', '-x', '-f', test_tar_xz], cwd=self.tempdir,
                    check=True)
     outdir = os.path.join(self.tempdir, 'top+dir-1.0')
     self.assertEqual(read_files(outdir),
                      ({'a', 'b', 'b/c'},
                       {'a1': 'a', 'a2': 'a', 'b/c/a3': 'a', 'b/a4': 'a',
                        'b1': 'b', 'b/b2': 'b', 'c': 'c'},
                       {'a-link': 'a1', 'dead-link': 'bad'}))
     stat_a1 = os.stat(os.path.join(outdir, 'a1'))
     self.assertEqual(stat_a1.st_nlink, 4)
     self.assertEqual(stat_a1.st_mtime, 1234567890)
     stat_dead_link = os.stat(os.path.join(outdir, 'dead-link'),
                              follow_symlinks=False)
     self.assertEqual(stat_dead_link.st_mtime, 1234567890)
     # Test that the files are correctly sorted in the tarball.
     subprocess.run(['xz', '-d', test_tar_xz], check=True)
     tarfile_obj = tarfile.open(os.path.join(self.tempdir, 'test.tar'),
                                'r:')
     self.assertEqual(tarfile_obj.getnames(),
                      ['top+dir-1.0', 'top+dir-1.0/a', 'top+dir-1.0/a-link',
                       'top+dir-1.0/a1', 'top+dir-1.0/a2', 'top+dir-1.0/b',
                       'top+dir-1.0/b/a4', 'top+dir-1.0/b/b2',
                       'top+dir-1.0/b/c', 'top+dir-1.0/b/c/a3',
                       'top+dir-1.0/b1', 'top+dir-1.0/c',
                       'top+dir-1.0/dead-link'])
Пример #6
0
 def test_run_build_install_tree(self):
     """Test run_build, implicit install tree creation."""
     self.setup_rc('cfg.add_component("build_install_tree")\n')
     with self.redirect_stdout_stderr():
         self.build_context.run_build()
     hosts = self.relcfg.hosts.get()
     host_b0 = hosts[0].build_cfg
     instdir_def = self.relcfg.install_tree_path(host_b0, 'impl-def')
     instdir_empty = self.relcfg.install_tree_path(host_b0, 'impl-empty')
     instdir_one = self.relcfg.install_tree_path(host_b0, 'impl-one')
     instdir_two = self.relcfg.install_tree_path(host_b0, 'impl-two')
     self.assertEqual(read_files(instdir_def), ({'q'}, {'q/a': 'a\n'}, {}))
     self.assertEqual(read_files(instdir_empty), (set(), {}, {}))
     self.assertEqual(read_files(instdir_one), (set(), {'b': 'b\n'}, {}))
     self.assertEqual(read_files(instdir_two), (set(), {
         'b': 'b\n',
         'c': 'c\n'
     }, {}))
Пример #7
0
 def test_run_build_package(self):
     """Test run_build, nonempty packages built."""
     self.setup_rc('cfg.add_component("build_package")\n'
                   'cfg.source_date_epoch.set(1111199990)\n')
     with self.redirect_stdout_stderr():
         self.build_context.run_build()
     hosts = self.relcfg.hosts.get()
     pkg_0 = self.relcfg.pkgdir_path(hosts[0], '.tar.xz')
     pkg_1 = self.relcfg.pkgdir_path(hosts[1], '.tar.xz')
     dir_out = os.path.join(self.tempdir, 'toolchain-1.0')
     subprocess.run(['tar', '-x', '-f', pkg_0],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(read_files(dir_out), (set(), {
         'a1': 'a\n',
         'a2': 'a\n',
         'a3': 'a\n',
         'b': 'b\n'
     }, {
         'c': 'b'
     }))
     stat_a1 = os.stat(os.path.join(dir_out, 'a1'))
     self.assertEqual(stat_a1.st_nlink, 3)
     self.assertEqual(stat_a1.st_mtime, 1111199990)
     stat_b = os.stat(os.path.join(dir_out, 'b'))
     self.assertEqual(stat_b.st_nlink, 1)
     self.assertEqual(stat_b.st_mtime, 1111199990)
     shutil.rmtree(dir_out)
     subprocess.run(['tar', '-x', '-f', pkg_1],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(read_files(dir_out), (set(), {
         'a1': 'a\n',
         'a2': 'a\n',
         'a3': 'a\n',
         'b': 'b\n',
         'c': 'b\n'
     }, {}))
     stat_a1 = os.stat(os.path.join(dir_out, 'a1'))
     self.assertEqual(stat_a1.st_nlink, 3)
     self.assertEqual(stat_a1.st_mtime, 1111199990)
     stat_b = os.stat(os.path.join(dir_out, 'b'))
     self.assertEqual(stat_b.st_nlink, 2)
     self.assertEqual(stat_b.st_mtime, 1111199990)
 def test_replace_symlinks(self):
     """Test the replace_symlinks function."""
     create_files(self.indir, ['d1', 'd2'],
                  {'f': 'f', 'd1/f': 'd1/f', 'd2/f': 'd2/f'},
                  {'d1/link': '../f', 'd1/d2': '../d2', 'd2/link': '../f'})
     replace_symlinks(self.context, self.indir)
     self.assertEqual(read_files(self.indir),
                      ({'d1', 'd2', 'd1/d2'},
                       {'f': 'f', 'd1/f': 'd1/f', 'd2/f': 'd2/f',
                        'd1/link': 'f', 'd2/link': 'f', 'd1/d2/f': 'd2/f',
                        'd1/d2/link': 'f'},
                       {}))
Пример #9
0
 def test_tar_copy_without_metadata(self):
     """Test copying checkouts from tarballs."""
     os.mkdir(self.codir)
     self.co_file_write('.git', '.git contents')
     self.co_file_write('.svn', '.svn contents')
     subprocess.run(['tar', '-c', '-z', '-f', 'test.tar.gz', 'co'],
                    cwd=self.tempdir,
                    check=True)
     vc_obj = TarVC(self.context, os.path.join(self.tempdir, 'test.tar.gz'))
     vc_obj.vc_checkout(self.srcdir, False)
     vc_obj.copy_without_metadata(self.srcdir, self.srcdir_copy)
     self.assertEqual(read_files(self.srcdir_copy), (set(), {
         '.git': '.git contents',
         '.svn': '.svn contents'
     }, {}))
Пример #10
0
 def test_git_copy_without_metadata(self):
     """Test copying checkouts from git."""
     os.mkdir(self.codir)
     subprocess.run(['git', 'init', '-q'], cwd=self.codir, check=True)
     self.co_file_write('gitfile', 'gitfile contents')
     subprocess.run(['git', 'add', '.'], cwd=self.codir, check=True)
     subprocess.run(['git', 'commit', '-q', '-m', 'commit message'],
                    cwd=self.codir,
                    check=True)
     vc_obj = GitVC(self.context, self.codir)
     vc_obj.vc_checkout(self.srcdir, False)
     os.chmod(os.path.join(self.srcdir, 'gitfile'), stat.S_IRUSR)
     vc_obj.copy_without_metadata(self.srcdir, self.srcdir_copy)
     self.assertEqual(read_files(self.srcdir_copy),
                      (set(), {
                          'gitfile': 'gitfile contents'
                      }, {}))
     mode = stat.S_IMODE(
         os.stat(os.path.join(self.srcdir_copy, 'gitfile')).st_mode)
     self.assertEqual(mode, (stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP
                             | stat.S_IROTH))
 def test_hard_link_files(self):
     """Test the hard_link_files function."""
     create_files(self.indir, ['a', 'b', 'b/c'],
                  {'a1': 'a', 'a2': 'a', 'b/c/a3': 'a', 'b/a4': 'a',
                   'b1': 'b', 'b/b2': 'b', 'c': 'c'},
                  {'a-link': 'a1', 'dead-link': 'bad'})
     os.chmod(os.path.join(self.indir, 'a1'), stat.S_IRWXU)
     os.chmod(os.path.join(self.indir, 'b/c/a3'), stat.S_IRWXU)
     os.chmod(os.path.join(self.indir, 'a2'), stat.S_IRUSR)
     os.chmod(os.path.join(self.indir, 'b/a4'), stat.S_IRUSR)
     hard_link_files(self.context, self.indir)
     self.assertEqual(read_files(self.indir),
                      ({'a', 'b', 'b/c'},
                       {'a1': 'a', 'a2': 'a', 'b/c/a3': 'a', 'b/a4': 'a',
                        'b1': 'b', 'b/b2': 'b', 'c': 'c'},
                       {'a-link': 'a1', 'dead-link': 'bad'}))
     stat_a1 = os.stat(os.path.join(self.indir, 'a1'))
     self.assertEqual(stat.S_IMODE(stat_a1.st_mode), stat.S_IRWXU)
     stat_a3 = os.stat(os.path.join(self.indir, 'b/c/a3'))
     self.assertEqual(stat.S_IMODE(stat_a3.st_mode), stat.S_IRWXU)
     stat_a2 = os.stat(os.path.join(self.indir, 'a2'))
     self.assertEqual(stat.S_IMODE(stat_a2.st_mode), stat.S_IRUSR)
     stat_a4 = os.stat(os.path.join(self.indir, 'b/a4'))
     self.assertEqual(stat.S_IMODE(stat_a4.st_mode), stat.S_IRUSR)
     self.assertEqual(stat_a1.st_nlink, 2)
     self.assertEqual(stat_a2.st_nlink, 2)
     self.assertEqual(stat_a3.st_nlink, 2)
     self.assertEqual(stat_a4.st_nlink, 2)
     self.assertEqual(stat_a1.st_dev, stat_a3.st_dev)
     self.assertEqual(stat_a1.st_ino, stat_a3.st_ino)
     self.assertEqual(stat_a2.st_dev, stat_a4.st_dev)
     self.assertEqual(stat_a2.st_ino, stat_a4.st_ino)
     stat_b1 = os.stat(os.path.join(self.indir, 'b1'))
     stat_b2 = os.stat(os.path.join(self.indir, 'b/b2'))
     self.assertEqual(stat_b1.st_nlink, 2)
     self.assertEqual(stat_b2.st_nlink, 2)
     self.assertEqual(stat_b1.st_dev, stat_b2.st_dev)
     self.assertEqual(stat_b1.st_ino, stat_b2.st_ino)
Пример #12
0
 def test_run_build(self):
     """Test run_build, simple successful build."""
     self.setup_rc('cfg.add_component("build_test")\n'
                   'cfg.multilibs.set((Multilib("build_test", '
                   '"build_test", ()), Multilib("build_test", '
                   '"build_test", ("-mtest",), osdir="test")))\n')
     with self.redirect_stdout_stderr():
         self.build_context.run_build()
     stdout, stderr = self.stdout_stderr_read()
     hosts = self.relcfg.hosts.get()
     host_b0 = hosts[0].build_cfg
     host_b1 = hosts[1].build_cfg
     h0_all_objdir = self.relcfg.objdir_path(host_b0, 'build_test-all')
     h0_all_objdir2 = self.relcfg.objdir_path(host_b0, 'build_test-all2')
     h1_all_objdir = self.relcfg.objdir_path(host_b1, 'build_test-all')
     h1_all_objdir2 = self.relcfg.objdir_path(host_b1, 'build_test-all2')
     self.assertEqual(read_files(h0_all_objdir), (set(), {
         'out1': 'all-hosts\n',
         'out2': 'all-hosts-2\n'
     }, {}))
     self.assertEqual(read_files(h0_all_objdir2), (set(), {}, {}))
     self.assertEqual(read_files(h1_all_objdir), (set(), {
         'out1': 'all-hosts\n',
         'out2': 'all-hosts-2\n'
     }, {}))
     self.assertEqual(read_files(h1_all_objdir2), (set(), {}, {}))
     first_objdir = self.relcfg.objdir_path(host_b0, 'build_test-first')
     first_objdir2 = self.relcfg.objdir_path(host_b0, 'build_test-first2')
     self.assertEqual(read_files(first_objdir), ({'x', 'x/y'}, {
         'GNUmakefile': 'all:; echo first-host $(X) > out\n',
         'out': 'first-host Y\n'
     }, {}))
     self.assertEqual(read_files(first_objdir2), ({'x', 'x/y'}, {}, {}))
     other_objdir = self.relcfg.objdir_path(host_b1, 'build_test-other')
     self.assertEqual(read_files(other_objdir), (set(), {
         'out': 'test python\n'
     }, {}))
     first_objdir_m0 = self.relcfg.objdir_path(
         host_b0, 'build_test-first-aarch64-linux-gnu')
     first_objdir_m1 = self.relcfg.objdir_path(
         host_b0, 'build_test-first-aarch64-linux-gnu-mtest')
     other_objdir_m0 = self.relcfg.objdir_path(
         host_b1, 'build_test-other-aarch64-linux-gnu')
     other_objdir_m1 = self.relcfg.objdir_path(
         host_b1, 'build_test-other-aarch64-linux-gnu-mtest')
     self.assertEqual(read_files(first_objdir_m0),
                      (set(), {
                          'out': 'aarch64-linux-gnu\n'
                      }, {}))
     self.assertEqual(read_files(first_objdir_m1),
                      (set(), {
                          'out': 'aarch64-linux-gnu-mtest\n'
                      }, {}))
     self.assertEqual(read_files(other_objdir_m0),
                      (set(), {
                          'out': 'test aarch64-linux-gnu\n'
                      }, {}))
     self.assertEqual(read_files(other_objdir_m1),
                      (set(), {
                          'out': 'test aarch64-linux-gnu-mtest\n'
                      }, {}))
     init_objdir = self.relcfg.objdir_path(None, 'build_test-init')
     host_indep_objdir = self.relcfg.objdir_path(None,
                                                 'build_test-host-indep')
     fini_objdir = self.relcfg.objdir_path(None, 'build_test-fini')
     self.assertEqual(read_files(init_objdir), (set(), {
         'out': 'init\n'
     }, {}))
     self.assertEqual(read_files(host_indep_objdir), (set(), {
         'out': 'host-indep\n'
     }, {}))
     self.assertEqual(read_files(fini_objdir), (set(), {
         'out': 'fini\n'
     }, {}))
     self.assertEqual(stdout, '')
     lines = stderr.splitlines()
     self.assertEqual(len(lines), 36)
     for line in lines:
         self.assertRegex(
             line, r'^\[[0-2][0-9]:[0-5][0-9]:[0-6][0-9]\] '
             r'\[00[0-1][0-9]/0018\] /.*(start|end)\Z')
     self.assertIn('[0001/0018]', stderr)
     self.assertIn('[0018/0018]', stderr)
     self.assertIn('/x86_64-linux-gnu/all-hosts start', stderr)
     self.assertIn('/x86_64-w64-mingw32/other-hosts end', stderr)
     self.assertIn('/install-trees-x86_64-linux-gnu/package-input start',
                   stderr)
     self.assertIn('/install-trees-x86_64-w64-mingw32/package-input end',
                   stderr)
     self.assertIn('/x86_64-linux-gnu/package-output start', stderr)
     self.assertIn('/x86_64-w64-mingw32/package-output end', stderr)
     self.assertIn('/x86_64-linux-gnu/package-tar-xz end', stderr)
     self.assertIn('/x86_64-w64-mingw32/package-tar-xz start', stderr)
     self.assertIn('/init/init start', stderr)
     self.assertIn('/init/pkgdir end', stderr)
     self.assertIn('/host-indep/host-indep start', stderr)
     self.assertIn('/fini/fini end', stderr)
     # In this case, the created packages are empty.
     pkg_0 = self.relcfg.pkgdir_path(hosts[0], '.tar.xz')
     pkg_1 = self.relcfg.pkgdir_path(hosts[1], '.tar.xz')
     dir_out = os.path.join(self.tempdir, 'toolchain-1.0')
     subprocess.run(['tar', '-x', '-f', pkg_0],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(read_files(dir_out), (set(), {}, {}))
     shutil.rmtree(dir_out)
     subprocess.run(['tar', '-x', '-f', pkg_1],
                    cwd=self.tempdir,
                    check=True)
     self.assertEqual(read_files(dir_out), (set(), {}, {}))