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])
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')))))
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')))))
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')))
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) ))
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))
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')))
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')))
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)
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)