Merge pull request #658 from davydden/metis_parmetis_darwin

metis/parmetis/oce/boost: correct install_name on Darwin via a global tool
This commit is contained in:
Todd Gamblin 2016-03-27 16:10:05 -07:00
commit 8b45d6f84f
6 changed files with 76 additions and 27 deletions

View file

@ -27,9 +27,10 @@
'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file', 'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink', 'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
'set_executable', 'copy_mode', 'unset_executable_mode', 'set_executable', 'copy_mode', 'unset_executable_mode',
'remove_dead_links', 'remove_linked_tree'] 'remove_dead_links', 'remove_linked_tree', 'fix_darwin_install_name']
import os import os
import glob
import sys import sys
import re import re
import shutil import shutil
@ -38,6 +39,7 @@
import getpass import getpass
from contextlib import contextmanager, closing from contextlib import contextmanager, closing
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
import subprocess
import llnl.util.tty as tty import llnl.util.tty as tty
from spack.util.compression import ALLOWED_ARCHIVE_TYPES from spack.util.compression import ALLOWED_ARCHIVE_TYPES
@ -392,3 +394,29 @@ def remove_linked_tree(path):
os.unlink(path) os.unlink(path)
else: else:
shutil.rmtree(path, True) shutil.rmtree(path, True)
def fix_darwin_install_name(path):
"""
Fix install name of dynamic libraries on Darwin to have full path.
There are two parts of this task:
(i) use install_name('-id',...) to change install name of a single lib;
(ii) use install_name('-change',...) to change the cross linking between libs.
The function assumes that all libraries are in one folder and currently won't
follow subfolders.
Args:
path: directory in which .dylib files are alocated
"""
libs = glob.glob(join_path(path,"*.dylib"))
for lib in libs:
# fix install name first:
subprocess.Popen(["install_name_tool", "-id",lib,lib], stdout=subprocess.PIPE).communicate()[0]
long_deps = subprocess.Popen(["otool", "-L",lib], stdout=subprocess.PIPE).communicate()[0].split('\n')
deps = [dep.partition(' ')[0][1::] for dep in long_deps[2:-1]]
# fix all dependencies:
for dep in deps:
for loc in libs:
if dep == os.path.basename(loc):
subprocess.Popen(["install_name_tool", "-change",dep,loc,lib], stdout=subprocess.PIPE).communicate()[0]
break

View file

@ -1,5 +1,6 @@
from spack import * from spack import *
import spack import spack
import sys
class Boost(Package): class Boost(Package):
"""Boost provides free peer-reviewed portable C++ source """Boost provides free peer-reviewed portable C++ source
@ -208,3 +209,6 @@ def install(self, spec, prefix):
for threadingOpt in threadingOpts: for threadingOpt in threadingOpts:
b2('install', 'threading=%s' % threadingOpt, *b2_options) b2('install', 'threading=%s' % threadingOpt, *b2_options)
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -24,7 +24,7 @@
############################################################################## ##############################################################################
from spack import * from spack import *
import glob import glob,sys
class Metis(Package): class Metis(Package):
""" """
@ -90,3 +90,7 @@ def install(self, spec, prefix):
fs = glob.glob(join_path(source_directory,'GKlib',"*.h")) fs = glob.glob(join_path(source_directory,'GKlib',"*.h"))
for f in fs: for f in fs:
install(f, GKlib_dist) install(f, GKlib_dist)
# The shared library is not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -41,6 +41,11 @@ def install(self, spec, prefix):
make() make()
make("install") make("install")
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)
def setup_dependent_package(self, module, dependent_spec): def setup_dependent_package(self, module, dependent_spec):
spec = self.spec spec = self.spec
lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so' lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'

View file

@ -1,5 +1,5 @@
from spack import * from spack import *
import platform import platform, sys
class Oce(Package): class Oce(Package):
""" """
@ -45,3 +45,7 @@ def install(self, spec, prefix):
cmake('.', *options) cmake('.', *options)
make("install/strip") make("install/strip")
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin'):
fix_darwin_install_name(prefix.lib)

View file

@ -24,7 +24,7 @@
############################################################################## ##############################################################################
from spack import * from spack import *
import sys
class Parmetis(Package): class Parmetis(Package):
""" """
@ -83,3 +83,7 @@ def install(self, spec, prefix):
cmake(source_directory, *options) cmake(source_directory, *options)
make() make()
make("install") make("install")
# The shared library is not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)