def setUp(self): l = [ '/dir1/liblapack.a', '/dir2/libfoo.dylib', '/dir1/libblas.a', '/dir3/libbar.so', 'libbaz.so' ] self.liblist = LibraryList(l)
def test_set_build_environment_variables(config, mock_packages, working_env, monkeypatch, installation_dir_with_headers): """Check that build_environment supplies the needed library/include directories via the SPACK_LINK_DIRS and SPACK_INCLUDE_DIRS environment variables. """ root = spack.spec.Spec('dt-diamond') root.concretize() for s in root.traverse(): s.prefix = '/{0}-prefix/'.format(s.name) dep_pkg = root['dt-diamond-left'].package dep_lib_paths = ['/test/path/to/ex1.so', '/test/path/to/subdir/ex2.so'] dep_lib_dirs = ['/test/path/to', '/test/path/to/subdir'] dep_libs = LibraryList(dep_lib_paths) dep2_pkg = root['dt-diamond-right'].package dep2_pkg.spec.prefix = str(installation_dir_with_headers) setattr(dep_pkg, 'libs', dep_libs) try: pkg = root.package env_mods = EnvironmentModifications() spack.build_environment.set_build_environment_variables(pkg, env_mods, dirty=False) env_mods.apply_modifications() def normpaths(paths): return list(os.path.normpath(p) for p in paths) link_dir_var = os.environ['SPACK_LINK_DIRS'] assert (normpaths(link_dir_var.split(':')) == normpaths(dep_lib_dirs)) root_libdirs = ['/dt-diamond-prefix/lib', '/dt-diamond-prefix/lib64'] rpath_dir_var = os.environ['SPACK_RPATH_DIRS'] # The 'lib' and 'lib64' subdirectories of the root package prefix # should always be rpathed and should be the first rpaths assert (normpaths(rpath_dir_var.split(':')) == normpaths(root_libdirs + dep_lib_dirs)) header_dir_var = os.environ['SPACK_INCLUDE_DIRS'] # The default implementation looks for header files only # in <prefix>/include and subdirectories prefix = str(installation_dir_with_headers) include_dirs = normpaths(header_dir_var.split(':')) assert os.path.join(prefix, 'include') in include_dirs assert os.path.join(prefix, 'include', 'boost') not in include_dirs assert os.path.join(prefix, 'path', 'to') not in include_dirs assert os.path.join(prefix, 'path', 'to', 'subdir') not in include_dirs finally: delattr(dep_pkg, 'libs')
def library_list(): """Returns an instance of LibraryList.""" l = [ '/dir1/liblapack.a', '/dir2/libfoo.dylib', '/dir1/libblas.a', '/dir3/libbar.so', 'libbaz.so' ] return LibraryList(l)
def libs(self): libs = find_libraries('libcuda', root=self.prefix, shared=True, recursive=True) filtered_libs = [] # CUDA 10.0 provides Compatability libraries for running newer versions # of CUDA with older drivers. These do not work with newer drivers. for lib in libs: if 'compat' not in lib.split(os.sep): filtered_libs.append(lib) return LibraryList(filtered_libs)
def library_list(): """Returns an instance of LibraryList.""" # Test all valid extensions: ['.a', '.dylib', '.so'] libs = [ '/dir1/liblapack.a', '/dir2/libpython3.6.dylib', # name may contain periods '/dir1/libblas.a', '/dir3/libz.so', 'libmpi.so.20.10.1', # shared object libraries may be versioned ] return LibraryList(libs)
def test_add(self, library_list): pylist = [ '/dir1/liblapack.a', # removed from the final list '/dir2/libmpi.so', '/dir4/libnew.a' ] another = LibraryList(pylist) both = library_list + another assert len(both) == 7 # Invariant assert both == both + both # Always produce an instance of LibraryList assert type(library_list + pylist) == type(library_list) assert type(pylist + library_list) == type(library_list)
def test_add(self, library_list): pylist = [ '/dir1/liblapack.a', # removed from the final list '/dir2/libbaz.so', '/dir4/libnew.a' ] another = LibraryList(pylist) l = library_list + another assert len(l) == 7 # Invariant : l == l + l assert l == l + l # Always produce an instance of LibraryList assert type(library_list + pylist) == type(library_list) assert type(pylist + library_list) == type(library_list)
def test_add(self): pylist = [ '/dir1/liblapack.a', # removed from the final list '/dir2/libbaz.so', '/dir4/libnew.a' ] another = LibraryList(pylist) l = self.liblist + another self.assertEqual(len(l), 7) # Invariant : l == l + l self.assertEqual(l, l + l) # Always produce an instance of LibraryList self.assertEqual( type(self.liblist), type(self.liblist + pylist) ) self.assertEqual( type(pylist + self.liblist), type(self.liblist) )
def libs(self): return LibraryList([])
def blas_libs(self): return LibraryList(os.path.join(self.prefix.lib, 'libsci.so'))
class LibraryListTest(unittest.TestCase): def setUp(self): l = [ '/dir1/liblapack.a', '/dir2/libfoo.dylib', '/dir1/libblas.a', '/dir3/libbar.so', 'libbaz.so' ] self.liblist = LibraryList(l) def test_repr(self): x = eval(repr(self.liblist)) self.assertEqual(self.liblist, x) def test_joined_and_str(self): s1 = self.liblist.joined() self.assertEqual( s1, '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # NOQA: ignore=E501 ) s2 = str(self.liblist) self.assertEqual(s1, s2) s3 = self.liblist.joined(';') self.assertEqual( s3, '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # NOQA: ignore=E501 ) def test_flags(self): search_flags = self.liblist.search_flags self.assertTrue('-L/dir1' in search_flags) self.assertTrue('-L/dir2' in search_flags) self.assertTrue('-L/dir3' in search_flags) self.assertTrue(isinstance(search_flags, str)) link_flags = self.liblist.link_flags self.assertEqual( link_flags, '-llapack -lfoo -lblas -lbar -lbaz' ) ld_flags = self.liblist.ld_flags self.assertEqual(ld_flags, search_flags + ' ' + link_flags) def test_paths_manipulation(self): names = self.liblist.names self.assertEqual(names, ['lapack', 'foo', 'blas', 'bar', 'baz']) directories = self.liblist.directories self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) def test_get_item(self): a = self.liblist[0] self.assertEqual(a, '/dir1/liblapack.a') b = self.liblist[:] self.assertEqual(type(b), type(self.liblist)) self.assertEqual(self.liblist, b) self.assertTrue(self.liblist is not b) def test_add(self): pylist = [ '/dir1/liblapack.a', # removed from the final list '/dir2/libbaz.so', '/dir4/libnew.a' ] another = LibraryList(pylist) l = self.liblist + another self.assertEqual(len(l), 7) # Invariant : l == l + l self.assertEqual(l, l + l) # Always produce an instance of LibraryList self.assertEqual( type(self.liblist), type(self.liblist + pylist) ) self.assertEqual( type(pylist + self.liblist), type(self.liblist) )