Esempio n. 1
0
    def test_flags_lib_dir(self):
        libdir = self.Path('/path/to/lib')
        lib = self.Path('/path/to/lib/foo.so')

        # Lib dir
        self.assertEqual(
            self.linker.flags(opts.option_list(opts.lib_dir(
                Directory(libdir)))), ['/LIBPATH:' + libdir])
        self.assertEqual(
            self.linker.flags(opts.option_list(opts.lib_dir(
                Directory(libdir))),
                              mode='pkg-config'), ['-L' + libdir])

        # Shared library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(SharedLibrary(lib, 'native')))), [])

        # Static library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(StaticLibrary(lib, 'native')))), [])

        # Mixed
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib_dir(Directory(libdir)),
                                 opts.lib(SharedLibrary(lib, 'native')))),
            ['/LIBPATH:' + libdir])
Esempio n. 2
0
    def test_windows_default_location(self):
        env = make_env('winnt', clear_variables=True)
        boost_incdir = r'C:\Boost\include\boost-1.23'

        def mock_walk(top):
            yield (top, ) + ([('boost-1.23', ntpath.join(top, 'boost-1.23'))
                              ], [])

        def mock_execute(*args, **kwargs):
            if args[0][1] == '/?':
                return 'cl.exe'
            raise ValueError()

        def mock_exists(x):
            if re.search(r'[/\\]boost[/\\]version.hpp$', x):
                return True
            return False

        with mock.patch('bfg9000.builtins.find._walk_flat', mock_walk), \
             mock.patch('bfg9000.builtins.packages._boost_version',
                        return_value=Version('1.23')), \
             mock.patch('bfg9000.shell.which', return_value=['command']), \
             mock.patch('bfg9000.shell.execute', mock_execute), \
             mock.patch('os.path.exists', mock_exists):  # noqa
            pkg = packages.boost_package(env, 'thread')
            self.assertEqual(pkg.name, 'boost(thread)')
            self.assertEqual(pkg.version, Version('1.23'))
            self.assertEqual(
                pkg._compile_options,
                opts.option_list(
                    opts.include_dir(HeaderDirectory(abspath(boost_incdir)))))
            self.assertEqual(
                pkg._link_options,
                opts.option_list(
                    opts.lib_dir(Directory(abspath(r'C:\Boost\lib')))))
Esempio n. 3
0
    def test_windows_default_location(self):
        env = make_env('winnt', clear_variables=True)
        context = self._make_context(env)
        boost_incdir = r'C:\Boost\include\boost-1.23'

        def mock_walk(top, variables=None):
            yield top, [top.append('boost-1.23/')], []

        def mock_execute(*args, **kwargs):
            if args[0][1] == '/?':
                return 'cl.exe'
            raise ValueError()

        def mock_exists(x):
            return bool(re.search(r'[/\\]boost[/\\]version.hpp$', x.string()))

        with mock.patch('bfg9000.builtins.find.walk', mock_walk), \
             mock.patch('bfg9000.builtins.packages._boost_version',
                        return_value=Version('1.23')), \
             mock.patch('bfg9000.shell.which', return_value=['command']), \
             mock.patch('bfg9000.shell.execute', mock_execute), \
             mock.patch('bfg9000.tools.msvc.exists', mock_exists):  # noqa
            pkg = context['boost_package']('thread')
            self.assertEqual(pkg.name, 'boost(thread)')
            self.assertEqual(pkg.version, Version('1.23'))
            self.assertEqual(
                pkg._compile_options,
                opts.option_list(
                    opts.include_dir(HeaderDirectory(abspath(boost_incdir)))))
            self.assertEqual(
                pkg._link_options,
                opts.option_list(
                    opts.lib_dir(Directory(abspath(r'C:\Boost\lib')))))
Esempio n. 4
0
    def test_link_options_coff(self):
        linker = AttrDict(flavor='gcc', builder=AttrDict(object_format='coff'))
        with mock.patch('bfg9000.shell.execute', mock_execute):
            pkg = PkgConfigPackage(self.tool, 'foo', format='elf')

            self.assertEqual(
                pkg.link_options(linker),
                opts.option_list('-pthread',
                                 opts.lib_dir(Directory(Path('/usr/lib'))),
                                 opts.lib_literal('-lfoo')))
Esempio n. 5
0
 def check_package(self, pkg):
     self.assertEqual(pkg.name, 'foo')
     self.assertEqual(pkg.compile_options(self.compiler), option_list(
         '/DMACRO', opts.include_dir(HeaderDirectory(Path('/path')))
     ))
     self.assertEqual(pkg.link_options(self.linker), option_list(
         '/DEBUG', opts.lib_dir(Directory(Path('/path'))),
         opts.lib_literal('foo.lib'),
         (opts.rpath_dir(Path('/path')) if self.platform_name == 'linux'
          else None)
     ))
Esempio n. 6
0
    def test_lib_order(self):
        fmt = self.env.target_platform.object_format
        lib = opts.lib(
            file_types.SharedLibrary(Path('libfoo', Root.srcdir), fmt))
        pkg_libdir = opts.lib_dir(
            file_types.Directory(Path('/usr/lib', Root.absolute)))
        pkg = CommonPackage('pkg', fmt, None, opts.option_list(pkg_libdir))

        result = self.context['shared_library']('shared', ['main.cpp'],
                                                libs='libfoo',
                                                packages=pkg)
        self.assertEqual(result.creator.options,
                         opts.option_list(lib, pkg_libdir))
Esempio n. 7
0
 def test_link_options_static(self):
     linker = AttrDict(flavor='gcc')
     with mock.patch('bfg9000.shell.execute', mock_execute):
         pkg = PkgConfigPackage(self.tool,
                                'foo',
                                format='elf',
                                kind=PackageKind.static)
         self.assertEqual(pkg.static, True)
         self.assertEqual(
             pkg.link_options(linker),
             opts.option_list('-pthread',
                              opts.lib_dir(Directory(Path('/usr/lib'))),
                              opts.lib_literal('-lfoo'),
                              opts.lib_literal('-lstatic')))
Esempio n. 8
0
    def test_link_options_macho_uninst(self):
        linker = AttrDict(flavor='gcc',
                          builder=AttrDict(object_format='mach-o'))
        with mock.patch('bfg9000.shell.execute', mock_execute_uninst):
            pkg = PkgConfigPackage(self.tool, 'foo', format='elf')

            self.assertEqual(
                pkg.link_options(linker),
                opts.option_list(
                    '-pthread',
                    opts.lib_dir(Directory(Path('/path/to/build/foo'))),
                    opts.lib_literal('-lfoo'),
                    opts.install_name_change('/path/to/build/foo/libfoo.dylib',
                                             '/usr/lib/libfoo.dylib')))
Esempio n. 9
0
    def test_flags_lib_dir(self):
        libdir = self.Path('/path/to/lib')
        lib = self.Path('/path/to/lib/libfoo.a')
        srclibdir = self.Path('.', Root.srcdir)
        srclib = self.Path('libfoo.a', Root.srcdir)

        if self.shared:
            output = SharedLibrary(self.Path('out'), 'native')
            if self.env.target_platform.genus == 'darwin':
                soname = [
                    '-install_name',
                    self.Path('out').string(self.env.base_dirs)
                ]
            else:
                soname = ['-Wl,-soname,out']
        else:
            output = Executable(self.Path('exe'), 'native')
            soname = []

        if self.env.target_platform.genus == 'linux':
            rpath = ['-Wl,-rpath,' + libdir]
            srcdir_rpath = ['-Wl,-rpath,' + srclibdir]
        else:
            rpath = srcdir_rpath = []

        # Lib dir
        self.assertEqual(
            self.linker.flags(opts.option_list(opts.lib_dir(
                Directory(libdir)))), ['-L' + libdir])

        # Shared library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(SharedLibrary(lib, 'native')))),
            ['-L' + libdir] + rpath)
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(SharedLibrary(lib, 'native'))),
                output), ['-L' + libdir] + rpath + soname)
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(SharedLibrary(srclib, 'native'))),
                output), ['-L' + srclibdir] + srcdir_rpath + soname)

        if self.env.target_platform.genus == 'linux':
            libdir2 = self.Path('foo')
            lib2 = self.Path('foo/libbar.a')

            with self.assertRaises(ValueError):
                self.linker.flags(
                    opts.option_list(opts.lib(SharedLibrary(lib2, 'native'))))
            self.assertEqual(
                self.linker.flags(
                    opts.option_list(opts.lib(SharedLibrary(lib2, 'native'))),
                    output),
                ['-L' + libdir2, '-Wl,-rpath,$ORIGIN/foo'] + soname)

        # Static library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(StaticLibrary(lib, 'native')))), [])
        self.assertEqual(
            self.linker.flags(opts.option_list(
                opts.lib(StaticLibrary(lib, 'native'))),
                              mode='pkg-config'), ['-L' + libdir])

        # Generic library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(Library(lib, 'native')))),
            ['-L' + libdir])

        mingw_lib = self.Path('/path/to/lib/foo.lib')
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(Library(mingw_lib, 'native')))), [])
        with self.assertRaises(ValueError):
            self.linker.flags(opts.option_list(
                opts.lib(Library(mingw_lib, 'native'))),
                              mode='pkg-config')

        # Framework
        self.assertEqual(
            self.linker.flags(opts.option_list(opts.lib(Framework('cocoa')))),
            [])

        # Mixed
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib_dir(Directory(libdir)),
                                 opts.lib(SharedLibrary(lib, 'native')))),
            ['-L' + libdir] + rpath)
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib_dir(Directory(libdir)),
                                 opts.lib(SharedLibrary(lib, 'native'))),
                output), ['-L' + libdir] + rpath + soname)
Esempio n. 10
0
    def test_flags_lib_dir(self):
        libdir = Path('/path/to/lib')
        lib = Path('/path/to/lib/libfoo.a')
        output = file_types.Executable(Path('exe'), 'native')

        if self.env.target_platform.name == 'linux':
            rpath = rpath_with_output = ['-Wl,-rpath,' + libdir]
        elif self.env.target_platform.name == 'darwin':
            rpath = []
            rpath_with_output = [jbos('-Wl,-rpath,', '@loader_path')]
        else:
            rpath = rpath_with_output = []

        # Lib dir
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib_dir(file_types.Directory(libdir)))),
            ['-L' + libdir])

        # Shared library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib(file_types.SharedLibrary(lib, 'native')))),
            ['-L' + libdir] + rpath)
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib(file_types.SharedLibrary(lib, 'native'))),
                output), ['-L' + libdir] + rpath_with_output)

        if self.env.target_platform.name == 'linux':
            libdir2 = Path('foo')
            lib2 = Path('foo/libbar.a')

            with self.assertRaises(ValueError):
                self.linker.flags(
                    opts.option_list(
                        opts.lib(file_types.SharedLibrary(lib2, 'native'))))
            self.assertEqual(
                self.linker.flags(
                    opts.option_list(
                        opts.lib(file_types.SharedLibrary(lib2, 'native'))),
                    output),
                ['-L' + libdir2,
                 jbos('-Wl,-rpath,', '$ORIGIN/foo')])

        # Static library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib(file_types.StaticLibrary(lib, 'native')))), [])
        self.assertEqual(
            self.linker.flags(opts.option_list(
                opts.lib(file_types.StaticLibrary(lib, 'native'))),
                              mode='pkg-config'), ['-L' + libdir])

        # Generic library
        self.assertEqual(
            self.linker.flags(
                opts.option_list(opts.lib(file_types.Library(lib, 'native')))),
            ['-L' + libdir])

        mingw_lib = Path('/path/to/lib/foo.lib')
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib(file_types.Library(mingw_lib, 'native')))), [])
        with self.assertRaises(ValueError):
            self.linker.flags(opts.option_list(
                opts.lib(file_types.Library(mingw_lib, 'native'))),
                              mode='pkg-config')

        # Framework
        self.assertEqual(
            self.linker.flags(opts.option_list(opts.lib(Framework('cocoa')))),
            [])

        # Mixed
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib_dir(file_types.Directory(libdir)),
                    opts.lib(file_types.SharedLibrary(lib, 'native')))),
            ['-L' + libdir] + rpath)
        self.assertEqual(
            self.linker.flags(
                opts.option_list(
                    opts.lib_dir(file_types.Directory(libdir)),
                    opts.lib(file_types.SharedLibrary(lib, 'native'))),
                output), ['-L' + libdir] + rpath_with_output)