Source code for scipion.install.change_rpath

#!/usr/bin/python

# Watch out: not "/usr/bin/env python", because we will overwrite the
# python in SCIPION_HOME/software/bin and we cannot use itself to run it.

# **************************************************************************
# *
# * Authors:     J. Burguet Castell     (jburguet@cnb.csic.es)
# *
# * Unidad de Bioinformatica of Centro Nacional de Biotecnologia, CSIC
# *
# * This program is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation; either version 3 of the License, or
# * (at your option) any later version.
# *
# * This program is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# * GNU General Public License for more details.
# *
# * You should have received a copy of the GNU General Public License
# * along with this program; if not, write to the Free Software
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# * 02111-1307  USA
# *
# *  All comments concerning this program package may be sent to the
# *  e-mail address 'scipion@cnb.csic.es'
# *
# **************************************************************************

#
# To use after compiling with something like:
#   LDFLAGS=-Wl,-rpath,REPLACE_ME_WITH_FUNNY_ ./scipion install 
#

"""
Replaces in-place a text in binary files.
"""

import sys
import os
from tempfile import TemporaryFile


[docs]def main(): if len(sys.argv) < 2: sys.exit('usage: %s <dir1> [<dir2> [...]]' % sys.argv[0]) replacements = 0 for subdir in sys.argv[1:]: print('Replacing RPATH in elf files under %s ...' % subdir) for dirpath, dirnames, filenames in os.walk(subdir): for fname in filenames: fpath = os.path.join(dirpath, fname) if isElf(fpath): replacements += replace(fpath) print('Total replacements: %d' % replacements) if replacements == 0: print('Warning: You probably did not really compile. Clean and repeat.')
[docs]def isElf(fname): """Is fname a file in elf format?""" return os.path.isfile(fname) and open(fname).read(4) == '\x7fELF'
[docs]def replace(fname, txt_from='REPLACE_ME_WITH_FUNNY_', txt_to='$ORIGIN:$ORIGIN/../lib'): """Change txt_from to txt_to in binary file fname. Return 1 if changed.""" # First add write permission to the file if it does not have it. if os.stat(fname).st_mode & 0o200 == 0: # mode has no write permission print('Adding write permission to %s ...' % fname) os.chmod(fname, os.stat(fname).st_mode + 0o200) changed = 0 with TemporaryFile('wb+') as fout: with open(fname, 'rb') as fin: for line in fin: if txt_from in line: print('Replacing in %s' % fname) line = line.replace(txt_from, txt_to) changed += 1 fout.write(line) fout.seek(0) open(fname, 'wb').writelines(fout) # overwrite fname return changed
if __name__ == '__main__': main()