- ret = conf.TryLink(check_select_source, '.c')
- if ret:
- conf.Result(ret)
- return (arg1, arg234, arg5)
- conf.Result('no (use default)')
- return ('int', 'int *', 'struct timeval *')
-
-
-def checkBoostLibraries(conf, lib, pathes):
- ''' look for boost libraries '''
- conf.Message('Checking for boost library %s... ' % lib)
- for path in pathes:
- # direct form: e.g. libboost_iostreams.a
- if os.path.isfile(os.path.join(path, 'lib%s.a' % lib)):
- conf.Result('yes')
- return (path, lib)
- # check things like libboost_iostreams-gcc.a
- files = glob.glob(os.path.join(path, 'lib%s-*.a' % lib))
- # if there are more than one, choose the first one
- # FIXME: choose the best one.
- if len(files) >= 1:
- # get xxx-gcc from /usr/local/lib/libboost_xxx-gcc.a
- conf.Result('yes')
- return (path, files[0].split(os.sep)[-1][3:-2])
- conf.Result('n')
- return ('','')
+ ret = conf.TryLink(check_select_source, '.c')
+ if ret:
+ conf.Result(ret)
+ return (arg1, arg234, arg5)
+ conf.Result('no (use default)')
+ return ('int', 'int *', 'struct timeval *')
+
+
+def checkBoostLibraries(conf, libs, lib_paths, inc_paths, versions, isDebug):
+ ''' look for boost libraries
+ libs: library names
+ lib_paths: try these paths for boost libraries
+ inc_paths: try these paths for boost headers
+ versions: supported boost versions
+ isDebug: if true, use debug libraries
+ '''
+ conf.Message('Checking for boost library %s... ' % ', '.join(libs))
+ libprefix = conf.env['LIBPREFIX']
+ libsuffix = '(%s|%s)' % (conf.env['LIBSUFFIX'], conf.env['SHLIBSUFFIX'])
+ found_lib = False
+ found_inc = False
+ lib_names = []
+ lib_path = None
+ inc_path = None
+ for path in lib_paths:
+ conf.Log("Looking into %s\n" % path)
+ for lib in libs:
+ # get all the libs, then filter for the right library
+ files = glob.glob(os.path.join(path, '%sboost_%s-*.*' % (libprefix, lib)))
+ # check things like libboost_iostreams-gcc-mt-d-1_33_1.a
+ if len(files) > 0:
+ conf.Log("Find boost libraries: %s\n" % files)
+ # runtime code includes s,g,y,d,p,n, where we should look for
+ # d,g,y for debug, s,p,n for release
+ lib_files = []
+ if isDebug:
+ for ver in versions:
+ lib_files += filter(lambda x: re.search('%sboost_%s-\w+-mt-[^spn]+-%s%s' % (libprefix, lib, ver, libsuffix), x), files)
+ else:
+ for ver in versions:
+ lib_files += filter(lambda x: re.search('%sboost_%s-\w+-mt-([^dgy]+-)*%s%s' % (libprefix, lib, ver, libsuffix), x), files)
+ if len(lib_files) == 0:
+ # use alternative libraries
+ for ver in versions:
+ lib_files += filter(lambda x: re.search('%sboost_%s-[\w-]+%s%s' % (libprefix, lib, ver, libsuffix), x), files)
+ if len(lib_files) > 0:
+ # get xxx-gcc-1_33_1 from /usr/local/lib/libboost_xxx-gcc-1_33_1.a
+ name = lib_files[0].split(os.sep)[-1][len(libprefix):]
+ lib_names.append(name.split('.')[0])
+ conf.Log("Qualified libraries: %s\n" % lib_names)
+ else:
+ conf.Log("No qualified library is found.\n")
+ break
+ if len(lib_names) == len(libs):
+ found_lib = True
+ lib_path = path
+ break
+ if not found_lib:
+ if len(lib_names) == 0:
+ conf.Log("No boost library is found\n")
+ else:
+ conf.Log("Found boost libraries: %s\n" % lib_names)
+ conf.Result('no')
+ return (None, None, None)
+ # check version number in boost/version.hpp
+ def isValidBoostDir(dir):
+ version_file = os.path.join(dir, 'boost', 'version.hpp')
+ if not os.path.isfile(version_file):
+ return False
+ version_file_content = open(version_file).read()
+ version_strings = ['#define BOOST_LIB_VERSION "%s"' % ver for ver in versions]
+ return True in [x in version_file_content for x in version_strings]
+ # check for boost header file
+ for path in inc_paths:
+ conf.Log("Checking for inc path: %s\n" % path)
+ if isValidBoostDir(path):
+ inc_path = path
+ found_inc = True
+ else: # check path/boost_1_xx_x/boost
+ dirs = glob.glob(os.path.join(path, 'boost-*'))
+ if len(dirs) > 0 and isValidBoostDir(dirs[0]):
+ conf.Log("Checing for sub directory: %s\n" % dirs[0])
+ inc_path = dirs[0]
+ found_inc = True
+ # return result
+ if found_inc:
+ conf.Result('yes')
+ conf.Log('Using boost libraries %s\n' % (', '.join(lib_names)))
+ return (lib_names, lib_path, inc_path)
+ else:
+ conf.Result('no')
+ return (None, None, None)