Example #1
0
 def setUp(self):
     l = [
         '/dir1/liblapack.a',
         '/dir2/libfoo.dylib',
         '/dir1/libblas.a',
         '/dir3/libbar.so',
         'libbaz.so'
     ]
     self.liblist = LibraryList(l)
Example #2
0
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')
Example #3
0
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)
Example #4
0
    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)
Example #5
0
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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
 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)
     )
Example #9
0
 def libs(self):
     return LibraryList([])
Example #10
0
 def blas_libs(self):
     return LibraryList(os.path.join(self.prefix.lib, 'libsci.so'))
Example #11
0
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)
        )