#st = os.stat(str(source[0]))
#os.chmod(str(target[0]), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
-
-#
-# glob filenames
-#
-def globSource(dir, pattern, build_dir = None, exclude = [], include = []):
- ''' glob files, in dir and use build_dir as returned path name '''
- # exclude 'exclude+include' to avoid duplicate items in files
- files = include + filter(lambda x: x not in exclude + include, glob.glob1(dir, pattern))
- if build_dir is None:
- return files
- else:
- return ['%s/%s' % (build_dir, x) for x in files]
-
#
# autoconf tests
#
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:
+def checkBoostLibraries(conf, libs, lib_paths, inc_paths, version, isDebug):
+ ''' look for boost libraries
+ libs: library names
+ lib_paths: try these paths for boost libraries
+ inc_paths: try these paths for boost headers
+ version: required boost version
+ isDebug: if true, use debug libraries
+ '''
+ conf.Message('Checking for boost library %s... ' % ', '.join(libs))
+ found_lib = False
+ found_inc = False
+ lib_names = []
+ lib_path = None
+ inc_path = None
+ for path in lib_paths:
# 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
+ # ignore isDebug
+ if False not in [os.path.isfile(os.path.join(path, 'libboost_%s.a' % lib)) for lib in libs]:
conf.Result('yes')
- return (path, files[0].split(os.sep)[-1][3:-2])
- conf.Result('n')
- return ('','')
+ found_lib = True
+ lib_path = path
+ lib_names = libs
+ break
+ for lib in libs:
+ # get all the libs, then filter for the right library
+ files = glob.glob(os.path.join(path, 'libboost_%s-*.a' % lib))
+ # check things like libboost_iostreams-gcc-mt-d-1_33_1.a
+ if len(files) > 0:
+ # runtime code includes s,g,y,d,p,n, where we should look for
+ # d,g,y for debug, s,p,n for release
+ if isDebug:
+ lib_files = filter(lambda x: re.search('libboost_%s-\w+-mt-[^spn]+-%s.a' % (lib, version), x), files)
+ else:
+ lib_files = filter(lambda x: re.search('libboost_%s-\w+-mt-([^dgy]+-)*%s.a' % (lib, version), x), files)
+ if len(lib_files) == 0:
+ print 'Warning: Can not find an appropriate boost library in %s.' % path
+ lib_files = filter(lambda x: re.search('libboost_%s-[\w-]+%s.a' % (lib, version), x), files)
+ if len(lib_files) > 0:
+ print 'Use library %s' % lib_files[0]
+ if len(lib_files) > 0:
+ # get xxx-gcc-1_33_1 from /usr/local/lib/libboost_xxx-gcc-1_33_1.a
+ lib_names.append(lib_files[0].split(os.sep)[-1][3:-2])
+ if len(lib_names) == len(libs):
+ found_lib = True
+ lib_path = path
+ break
+ if not found_lib:
+ conf.Result('no')
+ return (None, None, None)
+ # check version number in boost/version.hpp
+ def isValidBoostDir(dir):
+ file = os.path.join(dir, 'boost', 'version.hpp')
+ version_string = '#define BOOST_LIB_VERSION "%s"' % version
+ return os.path.isfile(file) and version_string in open(file).read()
+ # check for boost header file
+ for path in inc_paths:
+ 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]):
+ inc_path = dirs[0]
+ found_inc = True
+ # return result
+ if found_inc:
+ conf.Result('yes')
+ return (lib_names, lib_path, inc_path)
+ else:
+ conf.Result('no')
+ return (None, None, None)
def checkCommand(conf, cmd):
def checkIconvConst(conf):
''' check the declaration of iconv '''
check_iconv_const = '''
-#include <stdlib.h>
#include <iconv.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-#if defined(__STDC__) || defined(__cplusplus)
-#ifndef LIBICONV_DLL_EXPORTED
-size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
-#endif
-#else
-size_t iconv();
-#endif
-
-int main()
-{
- return 1;
+// this declaration will fail when there already exists a non const char**
+// version which returns size_t
+double iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+int main() {
+ return 0;
}
'''
conf.Message('Check if the declaration of iconv needs const... ')
result[lib[2]] = ll
cont += configString('#define %s 1' % lib[1], desc = description)
break
- # if not found
+ # if not found
if not result[lib[1]]:
cont += configString('/* #undef %s */' % lib[1], desc = description)
# custom tests