diff --git a/waflib/extras/boost.py b/waflib/extras/boost.py index cdfe2849..d80e4521 100644 --- a/waflib/extras/boost.py +++ b/waflib/extras/boost.py @@ -30,7 +30,6 @@ When using this tool, the wscript will look like: Options are generated, in order to specify the location of boost includes/libraries. The `check_boost` configuration function allows to specify the used boost libraries. -It can also provide default arguments to the --boost-static and --boost-mt command-line arguments. Everything will be packaged together in a BOOST component that you can use. When using MSVC, a lot of compilation flags need to match your BOOST build configuration: @@ -111,14 +110,8 @@ def options(opt): default='', dest='boost_libs', help='''path to the directory where the boost libs are e.g. /path/to/boost_1_47_0/stage/lib''') - opt.add_option('--boost-static', action='store_true', - default=False, dest='boost_static', - help='link with static boost libraries (.lib/.a)') - opt.add_option('--boost-mt', action='store_true', - default=False, dest='boost_mt', - help='select multi-threaded libraries') opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', - help='''select libraries with tags (s for static, gd for debug), + help='''select libraries with tags (mt- for multithreaded, s for static, gd for debug. ex: mt-sgd), see doc Boost, Getting Started, chapter 6.1''') opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect', help="auto-detect boost linkage options (don't get used to it / might break other stuff)") @@ -231,12 +224,7 @@ def boost_get_libs(self, *k, **kw): according to the parameters ''' path, files = self.__boost_get_libs_path(**kw) - t = [] - if kw.get('mt', False): - t.append('mt') - if kw.get('abi', None): - t.append(kw['abi']) - tags = t and '(-%s)+' % '-'.join(t) or '' + tags = kw.get('abi', None) and '(-%s)+' % kw.get('abi') or '' toolset = self.boost_get_toolset(kw.get('toolset', '')) toolset_pat = '(-%s[0-9]{0,3})+' % toolset version = '(-%s)+' % self.env.BOOST_VERSION @@ -253,27 +241,34 @@ def boost_get_libs(self, *k, **kw): name = name[3:] return name[:name.rfind('.')] - libs = [] - for lib in Utils.to_list(k and k[0] or kw.get('lib', None)): - py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' - # Trying libraries, from most strict match to least one - for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version), - 'boost_%s%s%s%s' % (lib, tags, py, version), - 'boost_%s%s%s' % (lib, tags, version), - # Give up trying to find the right version - 'boost_%s%s%s%s' % (lib, toolset_pat, tags, py), - 'boost_%s%s%s' % (lib, tags, py), - 'boost_%s%s' % (lib, tags)]: - self.to_log('Trying pattern %s' % pattern) - file = find_lib(re.compile(pattern), files) - if file: - libs.append(format_lib_name(file.name)) - break - else: - self.end_msg('lib %s not found in %s' % (lib, path.abspath())) - self.fatal('The configuration failed') + def match_libs(lib_names): + libs = [] + lib_names = Utils.to_list(lib_names) + if not lib_names: + return libs + for lib in lib_names: + py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' + # Trying libraries, from most strict match to least one + for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version), + 'boost_%s%s%s%s' % (lib, tags, py, version), + 'boost_%s%s%s' % (lib, tags, version), + # Give up trying to find the right version + 'boost_%s%s%s%s' % (lib, toolset_pat, tags, py), + 'boost_%s%s%s' % (lib, tags, py), + 'boost_%s%s' % (lib, tags)]: + self.to_log('Trying pattern %s' % pattern) + file = find_lib(re.compile(pattern), files) + if file: + libs.append(format_lib_name(file.name)) + break + else: + self.end_msg('lib %s not found in %s' % (lib, path.abspath())) + self.fatal('The configuration failed') + return libs - return path.abspath(), libs + return path.abspath(), \ + match_libs(kw.get('lib', None)), \ + match_libs(kw.get('stlib', None)) @conf @@ -287,7 +282,10 @@ def check_boost(self, *k, **kw): if not self.env['CXX']: self.fatal('load a c++ compiler first, conf.load("compiler_cxx")') - params = {'lib': k and k[0] or kw.get('lib', None)} + params = { + 'lib': k and k[0] or kw.get('lib', None), + 'stlib': kw.get('stlib', None) + } for key, value in self.options.__dict__.items(): if not key.startswith('boost_'): continue @@ -303,23 +301,29 @@ def check_boost(self, *k, **kw): if Logs.verbose: Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var]) - if not params['lib']: + if not params['lib'] and not params['stlib']: return + if 'static' in kw or 'static' in params: + Logs.warn('boost: static parameter is deprecated, use stlib instead.') self.start_msg('Checking boost libs') - suffix = params.get('static', None) and 'ST' or '' - path, libs = self.boost_get_libs(**params) - self.env['%sLIBPATH_%s' % (suffix, var)] = [path] - self.env['%sLIB_%s' % (suffix, var)] = libs + path, libs, stlibs = self.boost_get_libs(**params) + self.env['LIBPATH_%s' % var] = [path] + self.env['STLIBPATH_%s' % var] = [path] + self.env['LIB_%s' % var] = libs + self.env['STLIB_%s' % var] = stlibs self.end_msg('ok') if Logs.verbose: Logs.pprint('CYAN', ' path : %s' % path) - Logs.pprint('CYAN', ' libs : %s' % libs) + Logs.pprint('CYAN', ' shared libs : %s' % libs) + Logs.pprint('CYAN', ' static libs : %s' % stlibs) def try_link(): - if 'system' in params['lib']: + if (params['lib'] and 'system' in params['lib']) or \ + params['stlib'] and 'system' in params['stlib']: self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False) - if 'thread' in params['lib']: + if (params['lib'] and 'thread' in params['lib']) or \ + params['stlib'] and 'thread' in params['stlib']: self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False) if params.get('linkage_autodetect', False):