1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

build-many-glibcs.py: Introduce glibc build policy classes

The new classes GlibcPolicyForCompiler and GlibcPolicyForBuild allow
customization of the Glibc.build_glibc method, replacing the existing
for_compiler flag.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
Florian Weimer
2020-01-02 10:18:31 +01:00
parent 65b6c9b02b
commit 857c7d7397

View File

@ -1274,7 +1274,7 @@ class Config(object):
for g in self.compiler_glibcs: for g in self.compiler_glibcs:
cmdlist.push_subdesc('glibc') cmdlist.push_subdesc('glibc')
cmdlist.push_subdesc(g.name) cmdlist.push_subdesc(g.name)
g.build_glibc(cmdlist, True) g.build_glibc(cmdlist, GlibcPolicyForCompiler(g))
cmdlist.pop_subdesc() cmdlist.pop_subdesc()
cmdlist.pop_subdesc() cmdlist.pop_subdesc()
self.build_gcc(cmdlist, False) self.build_gcc(cmdlist, False)
@ -1398,6 +1398,76 @@ class Config(object):
'--enable-shared', '--enable-threads'] '--enable-shared', '--enable-threads']
self.build_cross_tool(cmdlist, 'gcc', tool_build, cfg_opts) 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): class Glibc(object):
"""A configuration for building glibc.""" """A configuration for building glibc."""
@ -1445,66 +1515,27 @@ class Glibc(object):
['test', '-f', ['test', '-f',
os.path.join(self.compiler.installdir, 'ok')]) os.path.join(self.compiler.installdir, 'ok')])
cmdlist.use_path(self.compiler.bindir) 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, self.ctx.add_makefile_cmdlist('glibcs-%s' % self.name, cmdlist,
logsdir) 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 """Generate commands to build this glibc, either as part of a compiler
build or with the bootstrapped compiler (and in the latter case, run build or with the bootstrapped compiler (and in the latter case, run
tests as well).""" tests as well)."""
srcdir = self.ctx.component_srcdir('glibc') cmdlist.create_use_dir(policy.builddir)
if for_compiler: policy.configure(cmdlist)
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.add_command('build', ['make']) cmdlist.add_command('build', ['make'])
cmdlist.add_command('install', ['make', 'install', 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 # GCC uses paths such as lib/../lib64, so make sure lib
# directories always exist. # directories always exist.
mkdir_cmd = ['mkdir', '-p', mkdir_cmd = ['mkdir', '-p',
os.path.join(installdir, 'lib')] os.path.join(policy.installdir, 'lib')]
if use_usr: if policy.use_usr:
mkdir_cmd += [os.path.join(installdir, 'usr', 'lib')] mkdir_cmd += [os.path.join(policy.installdir, 'usr', 'lib')]
cmdlist.add_command('mkdir-lib', mkdir_cmd) cmdlist.add_command('mkdir-lib', mkdir_cmd)
if not for_compiler: policy.extra_commands(cmdlist)
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)
cmdlist.cleanup_dir() cmdlist.cleanup_dir()