diff --git a/development/scons/SConstruct b/development/scons/SConstruct index b22720ca53..07c8cbbe14 100644 --- a/development/scons/SConstruct +++ b/development/scons/SConstruct @@ -701,42 +701,43 @@ if not fast_start: # 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: @@ -1307,7 +1308,16 @@ if env['X11']: # 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') @@ -1429,7 +1439,7 @@ targets = BUILD_TARGETS # 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 diff --git a/development/scons/scons_utils.py b/development/scons/scons_utils.py index 136ac7a200..5030f07221 100644 --- a/development/scons/scons_utils.py +++ b/development/scons/scons_utils.py @@ -153,24 +153,69 @@ int main() 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)): + # 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, 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 ('','') + 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): @@ -314,7 +359,7 @@ def createConfigFile(conf, config_file, 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