From: Bo Peng Date: Mon, 29 May 2006 16:58:14 +0000 (+0000) Subject: Scons: initial msvc support, and separate fast_start and load_option options. X-Git-Tag: 1.6.10~13173 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=44d2042c9a03ab5740fa4b210ede5966de753078;p=features.git Scons: initial msvc support, and separate fast_start and load_option options. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13962 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/development/scons/SConscript b/development/scons/SConscript index 0229ec9659..3ca70f9130 100644 --- a/development/scons/SConscript +++ b/development/scons/SConscript @@ -62,6 +62,8 @@ if build_qt3: elif build_qt4: frontend = 'qt4' env['frontend'] = 'qt4' +else: + frontend = env['frontend'] if build_boost: @@ -143,6 +145,7 @@ if build_intl: intlenv = env.Copy() # we need the original C compiler for these files intlenv['CC'] = intlenv['C_COMPILER'] + intlenv['CCFLAGS'] = intlenv['C_CCFLAGS'] intlenv['CPPPATH'] += ['intl'] intlenv.Append(CCFLAGS = [ @@ -500,7 +503,6 @@ if build_controllers: ControlVSpace.C ControlWrap.C helper_funcs.C - helper_funcs.h ''')] ) Alias('controllers', controllers) @@ -772,7 +774,7 @@ if build_qt4: '-DQT_GENUINE_STR', '-DQT_NO_STL', '-DQT3_SUPPORT', - '-Winvalid-pch'] + ] ) qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split(''' @@ -1176,9 +1178,12 @@ if build_lyxbase: vc-backend.C version.C vspace.C - main.C ''') + # temporary fix for MSVC, will remove later. + if not env['USE_VC']: + lyx_source_pre.append('main.C') + lyx_source_post = Split(''' tabular.C dimension.C @@ -1211,9 +1216,14 @@ if build_lyx: # # Build lyx with given frontend # + # temporary fix for MSVC, will remove later. + if env['USE_VC']: + lyx_source = ['$BUILDDIR/common/main.C'] + else: + lyx_source = [] lyx = env.Program( target = '$BUILDDIR/$frontend/lyx', - source = [], + source = lyx_source, LIBS = [ 'lyxbase_pre', 'mathed', diff --git a/development/scons/SConstruct b/development/scons/SConstruct index 487625a316..e0d84c6c31 100644 --- a/development/scons/SConstruct +++ b/development/scons/SConstruct @@ -240,6 +240,8 @@ opts.AddOptions( allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ), # BoolOption('fast_start', 'Whether or not use cached tests and keep current config.h', True), + # + BoolOption('load_option', 'load option from previous scons run', True), # FIXME: I do not know how pch is working. Ignore this option now. BoolOption('pch', '(NA) Whether or not use pch', default_pch_opt), # enable assertion, (config.h has ENABLE_ASSERTIOS @@ -256,7 +258,9 @@ opts.AddOptions( BoolOption('std_debug', '(NA) Whether or not turn on stdlib debug', False), # using x11? BoolOption('X11', 'Use x11 windows system', default_with_x), - # + # use MS VC++ to build lyx + BoolOption('use_vc', 'Use MS VC++ to build lyx', False), + # PathOption('qt_dir', 'Path to qt directory', None), # PathOption('qt_include_path', 'Path to qt include directory', None), @@ -305,27 +309,34 @@ if (not ARGUMENTS.has_key('fast_start') or \ cache_file = open(env_cache_file) env_cache = cPickle.load(cache_file) cache_file.close() - # import cached options, but we should ignore qt_dir when frontend changes - if ARGUMENTS.has_key('frontend') and env_cache['arg_cache'].has_key('frontend') \ - and ARGUMENTS['frontend'] != env_cache['arg_cache']['frontend'] \ - and env_cache['arg_cache'].has_key('qt_dir'): - env_cache['arg_cache'].pop('qt_dir') - # and we do not cache fast_start - if env_cache['arg_cache'].has_key('fast_start'): - env_cache['arg_cache'].pop('fast_start') print '------------ fast_start mode --------------------' print ' Use cached test results and current config.h' print ' use fast_start=no to override' print - for key in env_cache['arg_cache'].keys(): - if not ARGUMENTS.has_key(key): - ARGUMENTS[key] = env_cache['arg_cache'][key] - print "Restoring cached option %s=%s" % (key, ARGUMENTS[key]) - print '-------------------------------------------------' else: fast_start = False env_cache = {} +if (not ARGUMENTS.has_key('load_option') or \ + ARGUMENTS['load_option'] in ['y', 'yes', 't', 'true', '1', 'all']) \ + and os.path.isfile(env_cache_file): + cache_file = open(env_cache_file) + opt_cache = cPickle.load(cache_file)['arg_cache'] + cache_file.close() + # import cached options, but we should ignore qt_dir when frontend changes + if ARGUMENTS.has_key('frontend') and opt_cache.has_key('frontend') \ + and ARGUMENTS['frontend'] != opt_cache['frontend'] \ + and opt_cache.has_key('qt_dir'): + opt_cache.pop('qt_dir') + # and we do not cache fast_start + if opt_cache.has_key('fast_start'): + opt_cache.pop('fast_start') + for key in opt_cache.keys(): + if not ARGUMENTS.has_key(key): + ARGUMENTS[key] = opt_cache[key] + print "Restoring cached option %s=%s" % (key, ARGUMENTS[key]) + print + # save arguments env_cache['arg_cache'] = ARGUMENTS @@ -334,6 +345,8 @@ env_cache['arg_cache'] = ARGUMENTS # Setting up environment #--------------------------------------------------------- +# Note that I do not really like ENV=os.environ, but you may +# add it here if you experience some environment related problem env = Environment(options = opts) # Determine the frontend to use, which may be loaded @@ -343,11 +356,17 @@ frontend = env.get('frontend', default_frontend) env['frontend'] = frontend # use_X11 = env.get('X11', default_with_x) +use_vc = env.get('use_vc', False) +# use it only once for s scons-bug, will remove it later. +env['USE_VC'] = use_vc # set individual variables since I do not really like ENV = os.environ env['ENV']['PATH'] = os.environ.get('PATH') env['ENV']['HOME'] = os.environ.get('HOME') +# these are defined for MSVC +env['ENV']['LIB'] = os.environ.get('LIB') +env['ENV']['INCLUDE'] = os.environ.get('INCLUDE') env['TOP_SRC_DIR'] = TOP_SRC_DIR env['SCONS_DIR'] = SCONS_DIR # install to default_prefix by default @@ -374,10 +393,13 @@ env['LOCALE_DEST_DIR'] = os.path.join(env['DEST_DIR'], locale_dir) # # this is a bit out of place (after auto-configration) but # it is required to do the tests. Since Tool('mingw') will -# reset CCFLAGS etc, this should be before getEnvVariable -if platform_name == 'win32': +# reset CCFLAGS etc, this should be done before getEnvVariable +if platform_name == 'win32' and not use_vc: env.Tool('mingw') env.AppendUnique(CPPPATH = ['#c:/MinGW/include']) +elif use_vc: + env.Tool('msvc') + env.Tool('mslink') # speed up source file processing @@ -482,14 +504,23 @@ if env.has_key('aikasurus_path') and env['aikasurus_path']: # Note that this step has to be after env.Tool('mingw') step # since env.Tool('mingw') will set env['CC'] etc. # -# save the old c compiler -env['C_COMPILER'] = env['CC'] -if env.has_key('CXX') and env['CXX']: - env['CC'] = env['CXX'] - env['LINK'] = env['CXX'] -else: - env['CC'] = 'g++' - env['LINK'] = 'g++' +# save the old c compiler and CCFLAGS (used by libintl) +env['C_COMPILER'] = env.subst('$CC') +env['C_CCFLAGS'] = env.subst('$CCFLAGS') +# if we use ms vc, the commands are fine (cl.exe and link.exe) +if not use_vc: + if env.has_key('CXX') and env['CXX']: + env['CC'] = env.subst('$CXX') + env['LINK'] = env.subst('$CXX') + else: + env['CC'] = 'g++' + env['LINK'] = 'g++' +else: + # /TP treat all source code as C++ + # C4819: The file contains a character that cannot be represented + # in the current code page (number) + # C4996: foo was decleared deprecated + env.Append(CCFLAGS=['/TP', '/EHsc', '/wd4819', '/wd4996']) #---------------------------------------------------------- @@ -504,6 +535,7 @@ conf = Configure(env, 'CheckSelectArgType' : utils.checkSelectArgType, 'CheckBoostLibraries' : utils.checkBoostLibraries, 'CheckCommand' : utils.checkCommand, + 'CheckCXXGlobalCstd' : utils.checkCXXGlobalCstd, } ) @@ -639,8 +671,9 @@ if not fast_start: # we do not need to set LIBPATH now. env['INCLUDED_GETTEXT'] = True env['INTL_LIBS'] = ['included_intl'] - if platform_name == 'win32': + if platform_name == 'win32' and not use_vc: # for functions AddFontResouceA, RemoveFontResourceA + # if use_vc, gdi32 will be added anyway later env['INTL_LIBS'].append('gdi32') env_cache['INCLUDED_GETTEXT'] = env['INCLUDED_GETTEXT'] env_cache['INTL_LIBS'] = env['INTL_LIBS'] @@ -682,6 +715,7 @@ if not fast_start: # HAVE_UNISTD_H # HAVE_UTIME_H # HAVE_STRINGS_H + # HAVE_DIRECT_H # HAVE_ISTREAM # HAVE_OSTREAM # HAVE_IOS @@ -720,6 +754,7 @@ if not fast_start: ('utime.h', 'HAVE_UTIME_H', 'c'), ('string.h', 'HAVE_STRING_H', 'c'), ('strings.h', 'HAVE_STRINGS_H', 'c'), + ('direct.h', 'HAVE_DIRECT_H', 'c'), ('istream', 'HAVE_ISTREAM', 'cxx'), ('ostream', 'HAVE_OSTREAM', 'cxx'), ('ios', 'HAVE_IOS', 'cxx'), @@ -885,7 +920,18 @@ int count() utils.addToConfig('#define %s 1' % t[1]) else: utils.addToConfig('/* #undef %s */' % t[1]) + + # windows/msvc sys/types.h does not have pid_t + # FIXME: #include is the right way? + if not conf.CheckType('pid_t', includes='#include '): + utils.addToConfig('#define pid_t int') + # determine the use of std::tolower or tolower + if conf.CheckCXXGlobalCstd(): + utils.addToConfig('#define CXX_GLOBAL_CSTD 1') + else: + utils.addToConfig('/* #undef CXX_GLOBAL_CSTD */') + # PACKAGE # PACKAGE_VERSION # DEVEL_VERSION @@ -909,11 +955,16 @@ int count() for val in values: if (env.has_key(val[0]) and env[val[0]]) or \ - ARGUMENTS.get(val[1]): + (env.has_key(val[1]) and env[val[1]]): utils.addToConfig('#define %s 1' % val[0]) else: utils.addToConfig('/* #undef %s */' % val[0]) + # disable automatic linking of boost libraries. + # This is an interesting feature that is supposed to be useful under + # windows but since I can not find a way to use it on all platforms, + # I disable it for now. + utils.addToConfig('#define BOOST_ALL_NO_LIB 1') env['EXTRA_LIBS'] = [] # HAVE_LIBAIKSAURUS @@ -1073,7 +1124,11 @@ except: if platform_name in ['win32', 'cygwin']: # the final link step needs stdc++ to succeed under mingw # FIXME: shouldn't g++ automatically link to stdc++? - env['SYSTEM_LIBS'] = ['shlwapi', 'z', 'stdc++'] + env['SYSTEM_LIBS'] = ['shlwapi', 'z'] + if use_vc: + env['SYSTEM_LIBS'].extend(['gdi32', 'shell32', 'advapi32']) + else: + env['SYSTEM_LIBS'].append('stdc++') else: env['SYSTEM_LIBS'] = ['z'] diff --git a/development/scons/scons_utils.py b/development/scons/scons_utils.py index d71a4881a8..42e0d76ca9 100644 --- a/development/scons/scons_utils.py +++ b/development/scons/scons_utils.py @@ -56,8 +56,13 @@ def env_subst(target, source, env): contents = source_file.read() for k, v in env.items(): try: - contents = re.sub('@'+k+'@', env.subst('$'+k).replace('\n',r'\\n\\\n'), contents) - contents = re.sub('%'+k+'%', env.subst('$'+k).replace('\n',r'\\n\\\n'), contents) + val = env.subst('$'+k) + # temporary fix for the \Resource backslash problem + val = val.replace('\\', '/') + # multi-line replacement + val = val.replace('\n',r'\\n\\\n') + contents = re.sub('@'+k+'@', val, contents) + contents = re.sub('%'+k+'%', val, contents) except: pass target_file.write(contents + "\n") @@ -180,7 +185,8 @@ int main() """ conf.Message('Checking for the number of args for mkdir... ') ret = conf.TryLink(check_mkdir_one_arg_source, '.c') or \ - conf.TryLink('#include ' + check_mkdir_one_arg_source, '.c') + conf.TryLink('#include ' + check_mkdir_one_arg_source, '.c') or \ + conf.TryLink('#include ' + check_mkdir_one_arg_source, '.c') if ret: conf.Result('one') else: @@ -188,6 +194,23 @@ int main() return ret +# CXX_GLOBAL_CSTD +def checkCXXGlobalCstd(conf): + ''' Check the use of std::tolower or tolower ''' + check_global_cstd_source = ''' +#include +using std::tolower; +int main() +{ + return 0; +} +''' + conf.Message('Check for the use of global cstd... ') + ret = conf.TryLink(check_global_cstd_source, '.c') + conf.Result(ret) + return ret + + # SELECT_TYPE_ARG1 # SELECT_TYPE_ARG234 # SELECT_TYPE_ARG5