In some cases the license-identification header was missing, so I added that as well. Replaced the remaining headers that specifically identified "Versions 3.13.7 and higher". Makefiles and the build system were deliberately excluded.
87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
#!/usr/bin/env python
|
|
#*************************************************************************
|
|
# SPDX-License-Identifier: EPICS
|
|
# EPICS BASE is distributed subject to a Software License Agreement found
|
|
# in file LICENSE that is included with this distribution.
|
|
#*************************************************************************
|
|
|
|
from __future__ import print_function
|
|
|
|
import sys
|
|
import os
|
|
from collections import OrderedDict # used as OrderedSet
|
|
|
|
from argparse import ArgumentParser
|
|
|
|
if os.environ.get('EPICS_DEBUG_RPATH','')=='YES':
|
|
sys.stderr.write('%s'%sys.argv)
|
|
|
|
P = ArgumentParser(description='''Compute and output -rpath entries for each of the given paths.
|
|
Paths under --root will be computed as relative to --final .''',
|
|
epilog='''
|
|
eg. A library to be placed in /build/lib and linked against libraries in
|
|
'/build/lib', '/build/module/lib', and '/other/lib' would pass:
|
|
|
|
"makeRPath.py -F /build/lib -R /build /build/lib /build/module/lib /other/lib"
|
|
which prints "-Wl,-rpath,$ORIGIN/. -Wl,-rpath,$ORIGIN/../module/lib -Wl,-rpath,/other/lib"
|
|
''')
|
|
P.add_argument('-F','--final',default=os.getcwd(), help='Final install location for ELF file')
|
|
P.add_argument('-R','--root',default='', help='Root(s) of relocatable tree. Separate with :')
|
|
P.add_argument('-O', '--origin', default='$ORIGIN')
|
|
P.add_argument('path', nargs='*')
|
|
args = P.parse_args()
|
|
|
|
# eg.
|
|
# target to be installed as: /build/bin/blah
|
|
#
|
|
# post-install will copy as: /install/bin/blah
|
|
#
|
|
# Need to link against:
|
|
# /install/lib/libA.so
|
|
# /build/lib/libB.so
|
|
# /other/lib/libC.so
|
|
#
|
|
# Want final result to be:
|
|
# -rpath $ORIGIN/../lib -rpath /other/lib \
|
|
# -rpath-link /build/lib -rpath-link /install/lib
|
|
|
|
fdir = os.path.abspath(args.final)
|
|
roots = [os.path.abspath(root) for root in args.root.split(':') if len(root)]
|
|
|
|
# find the root which contains the final location
|
|
froot = None
|
|
for root in roots:
|
|
frel = os.path.relpath(fdir, root)
|
|
if not frel.startswith('..'):
|
|
# final dir is under this root
|
|
froot = root
|
|
break
|
|
|
|
if froot is None:
|
|
sys.stderr.write("makeRPath: Final location %s\nNot under any of: %s\n"%(fdir, roots))
|
|
# skip $ORIGIN handling below...
|
|
roots = []
|
|
|
|
output = OrderedDict()
|
|
for path in args.path:
|
|
path = os.path.abspath(path)
|
|
|
|
for root in roots:
|
|
rrel = os.path.relpath(path, root)
|
|
if not rrel.startswith('..'):
|
|
# path is under this root
|
|
|
|
# some older binutils don't seem to handle $ORIGIN correctly
|
|
# when locating dependencies of libraries. So also provide
|
|
# the absolute path for internal use by 'ld' only.
|
|
output['-Wl,-rpath-link,'+path] = True
|
|
|
|
# frel is final location relative to enclosing root
|
|
# rrel is target location relative to enclosing root
|
|
path = os.path.relpath(rrel, frel)
|
|
break
|
|
|
|
output['-Wl,-rpath,'+os.path.join(args.origin, path)] = True
|
|
|
|
print(' '.join(output))
|