def fix_install_paths(installdir, arch): ''' After unpacking a set of pre-built binaries, in given directory, fix any paths to point to the current directory. ''' print('Fixing paths in libtool control files, etc.') control_files = glob(P.join(installdir,'include','*config.h')) + \ glob(P.join(installdir,'lib','*.la')) + \ glob(P.join(installdir,'lib','*.prl')) + \ glob(P.join(installdir,'lib','*', '*.pc')) + \ glob(P.join(installdir,'bin','*')) + \ glob(P.join(installdir,'mkspecs','*.pri')) + \ list_recursively(P.join(installdir,'share')) for control in control_files: # Skip folders and binaries if os.path.isdir(control): continue if is_binary(control): continue print(' %s' % P.basename(control)) # ensure we can read and write (some files have odd permissions) st = os.stat(control) os.chmod(control, st.st_mode | stat.S_IREAD | stat.S_IWRITE) # replace the temporary install directory with the one we're deploying to. (Modify file in-place) lines = [] with open(control,'r') as f: lines = f.readlines() with open(control,'w') as f: for line in lines: line = re.sub('[\/\.]+[\w\/\.\-]*?' + binary_builder_prefix() + '\w*[\w\/\.]*?/install', installdir, line) f.write( line ) # Create libblas.la (out of existing libsuperlu.la). We need # libblas.la to force blas to show up before superlu when linking # on Linux to avoid a bug with corruption when invoking lapack in # a multi-threaded environment. A better long-term solution is needed. superlu_la = installdir + '/lib/libsuperlu.la' blas_la = installdir + '/lib/libblas.la' if arch.os == 'linux' and os.path.exists(superlu_la): lines = [] with open(superlu_la,'r') as f: lines = f.readlines() with open(blas_la,'w') as f: for line in lines: line = re.sub('libsuperlu', 'libblas', line) line = re.sub('dlname=\'.*?\'', 'dlname=\'libblas.so\'', line) line = re.sub('library_names=\'.+?\'', 'library_names=\'libblas.so\'', line) # Force blas to depend on superlu line = re.sub('dependency_libs=\'.*?\'', 'dependency_libs=\' -L' + installdir + '/lib -lsuperlu -lm\'', line) f.write( line ) library_ext = ["so"] if arch.os == 'osx': library_ext.append("dylib") # Ensure installdir/bin is in the path, to be able to find chrpath, etc. if "PATH" not in os.environ: os.environ["PATH"] = "" os.environ["PATH"] = P.join(installdir, 'bin') + \ os.pathsep + os.environ["PATH"] SEARCHPATH = [P.join(installdir,'lib'), P.join(installdir,'lib','osgPlugins*')] print('Fixing RPATHs') for curr_path in SEARCHPATH: for extension in library_ext: for library in glob(P.join(curr_path,'*.'+extension+'*')): if not is_binary(library): continue print(' %s' % P.basename(library)) try: set_rpath(library, installdir, map(lambda path: P.relpath(path, installdir), SEARCHPATH), False) except: print(' Failed %s' % P.basename(library)) print('Fixing Binaries') for binary in glob(P.join(installdir,'bin','*')): if not is_binary(binary): continue print(' %s' % P.basename(binary)) try: set_rpath(binary, installdir, map(lambda path: P.relpath(path, installdir), SEARCHPATH), False) except: print(' Failed %s' % P.basename(binary))
global opt (opt, args) = parser.parse_args() info('Using %d build processes' % opt.threads) if opt.ccache and opt.save_temps: die('--save-temps was specified. Disable ccache with --no-ccache.') if opt.build_root is not None and not P.exists(opt.build_root): os.makedirs(opt.build_root) if opt.resume and opt.build_root is None: opt.build_root = grablink('last-run') if opt.build_root is None: opt.build_root = mkdtemp(prefix=binary_builder_prefix()) # Things misbehave if directories have symlinks or are relative opt.build_root = P.realpath(opt.build_root) opt.download_dir = P.realpath(opt.download_dir) # We count in deploy-base.py on opt.build_root to contain the # string binary_builder_prefix() m = re.match("^.*?" + binary_builder_prefix(), opt.build_root) if not m: raise Exception('Build directory: %s must contain the string: "%s".' % (opt.build_root, binary_builder_prefix())) makelink(opt.build_root, 'last-run') print("Using build root directory: %s" % opt.build_root)
global opt (opt, args) = parser.parse_args() info('Using %d build processes' % opt.threads) if opt.ccache and opt.save_temps: die('--save-temps was specified. Disable ccache with --no-ccache.') if opt.build_root is not None and not P.exists(opt.build_root): os.makedirs(opt.build_root) if opt.resume and opt.build_root is None: opt.build_root = grablink('last-run') if opt.build_root is None: opt.build_root = mkdtemp(prefix=binary_builder_prefix()) # Things misbehave if directories have symlinks or are relative opt.build_root = P.realpath(opt.build_root) opt.download_dir = P.realpath(opt.download_dir) # We count in deploy-base.py on opt.build_root to contain the # string binary_builder_prefix() m = re.match("^.*?" + binary_builder_prefix(), opt.build_root) if not m: raise Exception('Build directory: %s must contain the string: "%s".' % ( opt.build_root, binary_builder_prefix()) ) makelink(opt.build_root, 'last-run') print("Using build root directory: %s" % opt.build_root)
global opt (opt, args) = parser.parse_args() info('Using %d build processes' % opt.threads) if opt.ccache and opt.save_temps: die('--save-temps was specified. Disable ccache with --no-ccache.') if opt.build_root is not None and not P.exists(opt.build_root): os.makedirs(opt.build_root) if opt.resume and opt.build_root is None: opt.build_root = grablink('last-run') if opt.build_root is None: opt.build_root = mkdtemp(prefix=binary_builder_prefix()) # Things misbehave if directories have symlinks or are relative opt.build_root = P.realpath(opt.build_root) opt.download_dir = P.realpath(opt.download_dir) makelink(opt.build_root, 'last-run') print("Using build root directory: %s" % opt.build_root) # Ensure that opt.build_root/install/bin is in the path, as there we keep # chrpath, etc. if "PATH" not in os.environ: os.environ["PATH"] = "" os.environ["PATH"] = P.join(opt.build_root, 'install/bin') + \ os.pathsep + os.environ["PATH"]