blob: aa8443c198267f6d02c5c46c7f507fd3ae221070 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2013 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script to patch a configure script in-place such that the libtool
dynamic library detection works for NaCl.
Once this patch makes it into upstream libtool it should eventually
be possible to remove this completely.
"""
from __future__ import print_function
import argparse
import os
import re
import sys
# Shell fragment for detecting shared library support in the compiler.
detect_so_support = \
'libc_so=`$CC -print-file-name=libc.so` && [ "$libc_so" != libc.so ]'
# There are essentailly three patches here, which will make configure do
# the right things for shared library support when used with the NaCl
# GLIBC toolchain.
CONFIGURE_PATCHS = [
# Correct result for "dynamic linker characteristics"
# pylint: disable=line-too-long
['(\n\\*\\)\n dynamic_linker=no)',
'''
nacl)
# Patched by naclports using patch_configure.py
if %s; then
dynamic_linker="GNU/NaCl ld.so"
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
else
dynamic_linker=no
fi
;;
\\1''' % detect_so_support],
# Correct result for "supports shared libraries"
[r'''(
netbsd\*\)
if echo __ELF__ \| \$CC -E - \| grep __ELF__ >/dev/null; then
archive_cmds_CXX='\$LD -Bshareable -o \$lib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$linker_flags')
''',
'''
# Patched by naclports using patch_configure.py
nacl)
if %s; then
ld_shlibs_CXX=yes
else
ld_shlibs_CXX=no
fi
;;
\\1
''' % detect_so_support],
# Correct result for "how to recognize dependent libraries"
[r'''
(.*linux.*)\)
lt_cv_deplibs_check_method=pass_all''',
'''
# Patched by naclports using patch_configure.py
\\1 | nacl*)
lt_cv_deplibs_check_method=pass_all''']
]
def main(args):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('configure', metavar='CONFIGURE_SCRIPT',
help='configure script to patch')
options = parser.parse_args(args)
if not os.path.exists(options.configure):
sys.stderr.write('configure script not found: %s\n' % options.configure)
return 1
# Read configure
with open(options.configure) as input_file:
filedata = input_file.read()
if 'Patched by naclports' in filedata:
sys.stderr.write('Configure script already patched\n')
return 0
# Check for patch location
for i, (pattern, replacement) in enumerate(CONFIGURE_PATCHS):
if not re.search(pattern, filedata):
sys.stderr.write('Failed to find patch %s location in configure '
'script: %s\n' % (i, options.configure))
continue
# Apply patch
filedata = re.sub(pattern, replacement, filedata)
# Overwrite input file with patched file data
with open(options.configure, 'w') as output_file:
output_file.write(filedata)
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))