Files
epics-base/src/tools/makeRPath.py
Andrew Johnson 3c99391d93 Added SPDX License ID to all EPICS-original source files
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.
2020-08-03 11:53:01 -05:00

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))