# check boost libraries
boost_opt = ARGUMENTS.get('boost', 'auto')
# check for system boost
- paths = env['LIBPATH'] + ['/usr/lib', '/usr/local/lib']
- # real libraries (included or system)
- boost_libraries = []
+ lib_paths = env['LIBPATH'] + ['/usr/lib', '/usr/local/lib']
+ inc_paths = env['CPPPATH'] + ['/usr/include', '/usr/local/include']
+ # default to $BUILDDIR/libs (use None since this path will be added anyway)
boost_libpath = None
# here I assume that all libraries are in the same directory
- for lib in boost_libs:
- if boost_opt == 'included':
- boost_libraries.append('included_boost_%s' % lib)
- env['INCLUDED_BOOST'] = True
- elif boost_opt == 'auto':
- res = conf.CheckBoostLibraries('boost_%s' % lib , paths)
- # if not found
- if res[0] == '':
- boost_libraries.append('included_boost_%s' % lib)
- env['INCLUDED_BOOST'] = True
- else:
- boost_libraries.append(res[1])
- env['INCLUDED_BOOST'] = False
- boost_libpath = res[0]
- elif boost_opt == 'system':
- res = conf.CheckBoostLibraries('boost_%s' % lib , paths)
- if res[0] == '':
- print "Can not find system boost libraries"
- print "Please supply a path through extra_lib_path and try again."
- print "Or use boost=included to use included boost libraries."
- Exit(2)
- else:
- boost_libraries.append(res[1])
- env.AppendUnique(LIBPATH = [res[0]])
- boost_libpath = res[0]
+ if boost_opt == 'included':
+ boost_libraries = ['included_boost_%s' % x for x in boost_libs]
+ included_boost = True
+ env['BOOST_INC_PATH'] = '$TOP_SRCDIR/boost'
+ elif boost_opt == 'auto':
+ res = conf.CheckBoostLibraries(boost_libs, lib_paths, inc_paths, mode == 'debug')
+ # if not found, use local boost
+ if res[0] is None:
+ boost_libraries = ['included_boost_%s' % x for x in boost_libs]
+ included_boost = True
+ env['BOOST_INC_PATH'] = '$TOP_SRCDIR/boost'
+ else:
+ included_boost = False
+ (boost_libraries, boost_libpath, env['BOOST_INC_PATH']) = res
+ elif boost_opt == 'system':
+ res = conf.CheckBoostLibraries(boost_libs, lib_paths, inc_paths, mode == 'debug')
+ if res[0] is None:
+ print "Can not find system boost libraries"
+ print "Please supply a path through extra_lib_path and try again."
+ print "Or use boost=included to use included boost libraries."
+ Exit(2)
+ else:
+ included_boost = False
+ (boost_libraries, boost_libpath, env['BOOST_INC_PATH']) = res
env_cache['BOOST_LIBRARIES'] = boost_libraries
- env_cache['INCLUDED_BOOST'] = env['INCLUDED_BOOST']
+ env_cache['INCLUDED_BOOST'] = included_boost
+ env_cache['BOOST_INC_PATH'] = env['BOOST_INC_PATH']
env_cache['BOOST_LIBPATH'] = boost_libpath
else:
boost_libraries = env_cache['BOOST_LIBRARIES']
- env['INCLUDED_BOOST'] = env_cache['INCLUDED_BOOST']
+ included_boost = env_cache['INCLUDED_BOOST']
+ env['BOOST_INC_PATH'] = env_cache['BOOST_INC_PATH']
boost_libpath = env_cache['BOOST_LIBPATH']
if boost_libpath is not None:
# BUILDDIR/common: for config.h
# TOP_SRCDIR/src: for support/* etc
#
-env['CPPPATH'] += ['$TOP_SRCDIR/boost', '$BUILDDIR/common', '$TOP_SRCDIR/src']
+env['CPPPATH'] += ['$BUILDDIR/common', '$TOP_SRCDIR/src']
+#
+# Separating boost directories from CPPPATH stops scons from building
+# the dependency tree of boost header files, and effectively reduce
+# the null build time of lyx from 29s to 16s.
+if use_vc:
+ env.AppendUnique(CCFLAGS = ['/I$BOOST_INC_PATH'])
+else:
+ env.AppendUnique(CCFLAGS = ['-I$BOOST_INC_PATH'])
+
# for intl/config.h, intl/libintl.h and intl/libgnuintl.h
if env['nls'] and included_gettext:
env['CPPPATH'].append('$BUILDDIR/intl')
# msvc need to pass full target name, so I have to look for path/lyx etc
build_lyx = targets == [] or True in ['lyx' in x for x in targets] \
or 'install' in targets or 'all' in targets
-build_boost = (env['INCLUDED_BOOST'] and not libExists('boost_regex')) or 'boost' in targets
+build_boost = (included_boost and not libExists('boost_regex')) or 'boost' in targets
build_intl = (included_gettext and not libExists('included_intl')) or 'intl' in targets
build_support = build_lyx or True in [x in targets for x in ['support', 'client', 'tex2lyx']]
build_mathed = build_lyx or 'mathed' in targets
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, isDebug):
+ ''' look for boost libraries
+ libs: library names
+ lib_paths: try these paths for boost libraries
+ inc_paths: try these paths for boost headers
+ 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:
+ if isDebug:
+ files = filter(lambda x: re.search('libboost_%s-\w+-mt-d-[\d-]+' % lib, x), files)
+ else:
+ files = filter(lambda x: re.search('libboost_%s-\w+-mt-[\d-]+' % lib, x), files)
+ if len(files) == 0:
+ print 'Warning: %s directory seems to have the boost libraries, but ' % path
+ print 'I can not find one that has the form lib%s-xxx-mt[-d]-x_xx_x.a' % lib
+ print 'Check your boost installation, or change select criteria in scons_util.py'
+ if len(files) > 0:
+ # get xxx-gcc-1_33_1 from /usr/local/lib/libboost_xxx-gcc-1_33_1.a
+ lib_names.append(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 for boost header file
+ for path in inc_paths:
+ # check path/boost/regex.h
+ if os.path.isfile(os.path.join(path, 'boost', 'regex.h')):
+ 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 os.path.isfile(os.path.join(dirs[0], 'boost', 'regex.h')):
+ 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):
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