From patchwork Mon Jan 6 15:57:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 37221 Received: (qmail 95321 invoked by alias); 6 Jan 2020 15:57:32 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 95202 invoked by uid 89); 6 Jan 2020 15:57:31 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=customization X-HELO: mail.efficios.com DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com 49C961EA1C0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1578326241; bh=tiXUHsM93xqC3TTSfHwpu5ksYq7F6/2Kd7zQkyMAphs=; h=From:To:Date:Message-Id; b=EZdSeOs30M4cc7D/4BqBSOE5dZ1Fs/eTlqcnYz26OSwu/vJ1zfu0xOhp/w67fZC9c 3SqGmihvN1eK1axPcDSIXg4+qwKqfK5O9c7VzQIBkx0XkFELjxE+XwK6VFgIGq1Dne RXrek3mG43874iT1b003PPwI4Ahfpr7Dkc8Z7g+1G9fEpQO8nuN+/zX7k9mPacEt0J chRAg034RgeMt57C1SIr52URBM8zFHoS6iB7w7pyViZii86AlxMmNYsZLGZqxtOAXa d++0FgtDkw+w0Urf6nBuwwVj7bEAYiEb2omnVPO+RWlBbSrvfgYyWE85MaBUdSKVnp mgYAqQOtJoIcg== From: Mathieu Desnoyers To: Carlos O'Donell Cc: Florian Weimer , Joseph Myers , Szabolcs Nagy , libc-alpha@sourceware.org Subject: [RFC PATCH glibc 07/13] build-many-glibcs.py: Introduce glibc build policy classes Date: Mon, 6 Jan 2020 10:57:07 -0500 Message-Id: <20200106155713.397-8-mathieu.desnoyers@efficios.com> In-Reply-To: <20200106155713.397-1-mathieu.desnoyers@efficios.com> References: <20200106155713.397-1-mathieu.desnoyers@efficios.com> From: Florian Weimer The new classes GlibcPolicyForCompiler and GlibcPolicyForBuild allow customization of the Glibc.build_glibc method, replacing the existing for_compiler flag. --- scripts/build-many-glibcs.py | 129 ++++++++++++++++++++++------------- 1 file changed, 80 insertions(+), 49 deletions(-) diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py index 56160a16fc..58f2409b1d 100755 --- a/scripts/build-many-glibcs.py +++ b/scripts/build-many-glibcs.py @@ -1274,7 +1274,7 @@ class Config(object): for g in self.compiler_glibcs: cmdlist.push_subdesc('glibc') cmdlist.push_subdesc(g.name) - g.build_glibc(cmdlist, True) + g.build_glibc(cmdlist, GlibcPolicyForCompiler(g)) cmdlist.pop_subdesc() cmdlist.pop_subdesc() self.build_gcc(cmdlist, False) @@ -1395,6 +1395,76 @@ class Config(object): '--enable-shared', '--enable-threads'] self.build_cross_tool(cmdlist, 'gcc', tool_build, cfg_opts) +class GlibcPolicyDefault(object): + """Build policy for glibc: common defaults.""" + + def __init__(self, glibc): + self.srcdir = glibc.ctx.component_srcdir('glibc') + self.use_usr = glibc.os != 'gnu' + self.prefix = '/usr' if self.use_usr else '' + self.configure_args = [ + '--prefix=%s' % self.prefix, + '--enable-profile', + '--build=%s' % glibc.ctx.build_triplet, + '--host=%s' % glibc.triplet, + 'CC=%s' % glibc.tool_name('gcc'), + 'CXX=%s' % glibc.tool_name('g++'), + 'AR=%s' % glibc.tool_name('ar'), + 'AS=%s' % glibc.tool_name('as'), + 'LD=%s' % glibc.tool_name('ld'), + 'NM=%s' % glibc.tool_name('nm'), + 'OBJCOPY=%s' % glibc.tool_name('objcopy'), + 'OBJDUMP=%s' % glibc.tool_name('objdump'), + 'RANLIB=%s' % glibc.tool_name('ranlib'), + 'READELF=%s' % glibc.tool_name('readelf'), + 'STRIP=%s' % glibc.tool_name('strip'), + ] + if glibc.os == 'gnu': + self.configure_args.append('MIG=%s' % glibc.tool_name('mig')) + self.configure_args += glibc.cfg + + def configure(self, cmdlist): + """Invoked to add the configure command to the command list.""" + cmdlist.add_command('configure', + [os.path.join(self.srcdir, 'configure'), + *self.configure_args]) + + def extra_commands(self, cmdlist): + """Invoked to inject additional commands (make check) after build.""" + pass + +class GlibcPolicyForCompiler(GlibcPolicyDefault): + """Build policy for glibc during the compilers stage.""" + + def __init__(self, glibc): + super().__init__(glibc) + self.builddir = glibc.ctx.component_builddir( + 'compilers', glibc.compiler.name, 'glibc', glibc.name) + self.installdir = glibc.compiler.sysroot + +class GlibcPolicyForBuild(GlibcPolicyDefault): + """Build policy for glibc during the glibcs stage.""" + + def __init__(self, glibc): + super().__init__(glibc) + self.builddir = glibc.ctx.component_builddir( + 'glibcs', glibc.name, 'glibc') + self.installdir = glibc.ctx.glibc_installdir(glibc.name) + if glibc.ctx.strip: + self.strip = glibc.tool_name('strip') + else: + self.strip = None + self.save_logs = glibc.ctx.save_logs + + def extra_commands(self, cmdlist): + if self.strip: + cmdlist.add_command('strip', + ['sh', '-c', + ('%s $(find %s/lib* -name "*.so")' % + (self.strip, self.installdir))]) + cmdlist.add_command('check', ['make', 'check']) + cmdlist.add_command('save-logs', [self.save_logs], always_run=True) + class Glibc(object): """A configuration for building glibc.""" @@ -1442,66 +1512,27 @@ class Glibc(object): ['test', '-f', os.path.join(self.compiler.installdir, 'ok')]) cmdlist.use_path(self.compiler.bindir) - self.build_glibc(cmdlist, False) + self.build_glibc(cmdlist, GlibcPolicyForBuild(self)) self.ctx.add_makefile_cmdlist('glibcs-%s' % self.name, cmdlist, logsdir) - def build_glibc(self, cmdlist, for_compiler): + def build_glibc(self, cmdlist, policy): """Generate commands to build this glibc, either as part of a compiler build or with the bootstrapped compiler (and in the latter case, run tests as well).""" - srcdir = self.ctx.component_srcdir('glibc') - if for_compiler: - builddir = self.ctx.component_builddir('compilers', - self.compiler.name, 'glibc', - self.name) - installdir = self.compiler.sysroot - else: - builddir = self.ctx.component_builddir('glibcs', self.name, - 'glibc') - installdir = self.ctx.glibc_installdir(self.name) - cmdlist.create_use_dir(builddir) - use_usr = self.os != 'gnu' - prefix = '/usr' if use_usr else '' - cfg_cmd = [os.path.join(srcdir, 'configure'), - '--prefix=%s' % prefix, - '--enable-profile', - '--build=%s' % self.ctx.build_triplet, - '--host=%s' % self.triplet, - 'CC=%s' % self.tool_name('gcc'), - 'CXX=%s' % self.tool_name('g++'), - 'AR=%s' % self.tool_name('ar'), - 'AS=%s' % self.tool_name('as'), - 'LD=%s' % self.tool_name('ld'), - 'NM=%s' % self.tool_name('nm'), - 'OBJCOPY=%s' % self.tool_name('objcopy'), - 'OBJDUMP=%s' % self.tool_name('objdump'), - 'RANLIB=%s' % self.tool_name('ranlib'), - 'READELF=%s' % self.tool_name('readelf'), - 'STRIP=%s' % self.tool_name('strip')] - if self.os == 'gnu': - cfg_cmd += ['MIG=%s' % self.tool_name('mig')] - cfg_cmd += self.cfg - cmdlist.add_command('configure', cfg_cmd) + cmdlist.create_use_dir(policy.builddir) + policy.configure(cmdlist) cmdlist.add_command('build', ['make']) cmdlist.add_command('install', ['make', 'install', - 'install_root=%s' % installdir]) + 'install_root=%s' % policy.installdir]) # GCC uses paths such as lib/../lib64, so make sure lib # directories always exist. mkdir_cmd = ['mkdir', '-p', - os.path.join(installdir, 'lib')] - if use_usr: - mkdir_cmd += [os.path.join(installdir, 'usr', 'lib')] + os.path.join(policy.installdir, 'lib')] + if policy.use_usr: + mkdir_cmd += [os.path.join(policy.installdir, 'usr', 'lib')] cmdlist.add_command('mkdir-lib', mkdir_cmd) - if not for_compiler: - if self.ctx.strip: - cmdlist.add_command('strip', - ['sh', '-c', - ('%s $(find %s/lib* -name "*.so")' % - (self.tool_name('strip'), installdir))]) - cmdlist.add_command('check', ['make', 'check']) - cmdlist.add_command('save-logs', [self.ctx.save_logs], - always_run=True) + policy.extra_commands(cmdlist) cmdlist.cleanup_dir()