From patchwork Fri Dec 20 21:36:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 1214320 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-108288-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=efficios.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="TMYFTt53"; dkim=pass (2048-bit key; unprotected) header.d=efficios.com header.i=@efficios.com header.b="KoReCLL8"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47fhvb0M9Mz9sP3 for ; Sat, 21 Dec 2019 08:38:50 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=lGG2SOVIbvYTbe7TBwWyColgzGaHQ7x 0cneTkiGQsVx4GRqFGJMqZiqS2mWoCv3V3pvNU8OJ0L1cYftsiGolKeSMe2NH8rh ztCGxcllhVgL8QM020ne+IRDFS878gKldA+XzhddQoC8p1KglBU+DiLF3bhSkf/j IzHGmInhBo/A= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=I2T0VkKT9aFBoflx087/oyADrPE=; b=TMYFT t53ZJ1b6XBH09HWOVBeRj5PZK8EyKcJeeL2UtSfeasSEo12QCwyVF+BtTZKGhV5R KP9CDb3t6IPK5++WH5cAv/Kko9y7QwMaBcL5iumLDAi7EsU8Yz5HLDSe031BAZCU OTsetAjaHQtRHB3bYfMguMKEuDxIITs513VX+0= Received: (qmail 127727 invoked by alias); 20 Dec 2019 21:38:25 -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 127641 invoked by uid 89); 20 Dec 2019 21:38:25 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 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= X-HELO: mail.efficios.com DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com DB74C690A21 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1576877900; bh=GOgz0fwwucLmLEmAJ77erjj8mdmW4bd5Ta88teRe3Ao=; h=From:To:Date:Message-Id; b=KoReCLL8BcBwYwV7E51Jwz8IiIaxXJiFI4fM+LoX3EbzUjE1M+GgKjTtdWiW/MOxR Q6mTPrbHMFnj8/E+PNOiFfh6XC2Lf/VF/i4SBKAgGYdcLK++9Np7JOEDedvQae7HE7 BwfwrpWKGaYXIME4mbdJcwhlBW0jWVUH7WBcL5ApUSzJvEexHvdLaI8GmNasvdwc2D SlNwxHmzziOSHYaurZJFHmZa5R4jdLQSeDvbmvz5TudMefFVBgl3KqtTm8bXn3QCHj G/gA5XwtuAKe5Hx/PcRFhjtJQ4EuxLVjDexJ4nwHqSFRkJ80gkRFVBdf3MUmHhctdV SX77B6+Kd+dZQ== 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: Fri, 20 Dec 2019 16:36:44 -0500 Message-Id: <20191220213650.11281-8-mathieu.desnoyers@efficios.com> In-Reply-To: <20191220213650.11281-1-mathieu.desnoyers@efficios.com> References: <20191220213650.11281-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()