]> git.lyx.org Git - lyx.git/commitdiff
gettext support, fast_start option, scons all, mingw bug fix and some cleanup for...
authorBo Peng <bpeng@lyx.org>
Mon, 15 May 2006 20:35:01 +0000 (20:35 +0000)
committerBo Peng <bpeng@lyx.org>
Mon, 15 May 2006 20:35:01 +0000 (20:35 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13849 a592a061-630c-0410-9148-cb99ea01b6c8

development/scons/SConscript
development/scons/SConstruct
development/scons/scons_utils.py

index b7842f0a729bf7873f3eb7afa9be52bd8ff9d7c1..56e335d2a3afbecf036eca0dd8a11e668862def7 100644 (file)
@@ -4,7 +4,7 @@
 #
 # This file is part of LyX, the document processor.
 # Licence details can be found in the file COPYING.
-# 
+#
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 
@@ -13,21 +13,21 @@ import os, sys
 Import('env')
 
 targets = env['BUILD_TARGETS']
-build_lyx = (targets == [] or 'lyx' in targets or 'install' in targets)
+build_lyx = (targets == [] or 'lyx' in targets or 'install' in targets or 'all' in targets)
+
 
-#
-# boost libraries
-#
 if env['INCLUDED_BOOST'] or 'boost' in targets:
+  #
+  # boost libraries
+  #
+  # special builddir
   env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
-  
+
   boostenv = env.Copy()
-  boostenv.Append(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
-  # for config.h
-  boostenv.Append(CPPPATH = ['$TOP_SRC_DIR/src'])
-  
+  boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
+
   print 'Processing files in boost/libs/filesystem/src...'
-  
+
   filesystem = boostenv.StaticLibrary(
     target = '$LOCALLIBPATH/boost_filesystem',
     source = ["$BUILDDIR/boost/filesystem/src/%s" % x for x in Split('''
@@ -37,9 +37,9 @@ if env['INCLUDED_BOOST'] or 'boost' in targets:
       path_posix_windows.cpp
     ''')]
   )
-  
+
   print 'Processing files in boost/libs/regex/src...'
-  
+
   regex = boostenv.StaticLibrary(
     target = '$LOCALLIBPATH/boost_regex',
     source = ["$BUILDDIR/boost/regex/src/%s" % x for x in Split('''
@@ -54,9 +54,9 @@ if env['INCLUDED_BOOST'] or 'boost' in targets:
       w32_regex_traits.cpp
     ''')]
   )
-  
+
   print 'Processing files in boost/libs/signals/src...'
-  
+
   signals = boostenv.StaticLibrary(
     target = '$LOCALLIBPATH/boost_signals',
     source = ["$BUILDDIR/boost/signals/src/%s" % x for x in Split('''
@@ -67,9 +67,9 @@ if env['INCLUDED_BOOST'] or 'boost' in targets:
       trackable.cpp
     ''')]
   )
-  
+
   print 'Processing files in boost/libs/iostreams/src...'
-  
+
   iostreams = boostenv.StaticLibrary(
     target = '$LOCALLIBPATH/boost_iostreams',
     source = ["$BUILDDIR/boost/iostreams/src/%s" % x for x in Split('''
@@ -82,25 +82,23 @@ if env['INCLUDED_BOOST'] or 'boost' in targets:
   Alias('boost', regex)
   Alias('boost', signals)
   Alias('boost', iostreams)
-  
+
+
 #
 # Now, src code under src/
 #
-
 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
 
-#
-# src/support 
-#
 
 if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']]:
+  #
+  # src/support
+  #
   print "Processing files in src/support"
-  
-  env.Append(CPPPATH = ['.'])
-  
+
   env['SUBST_KEYS'] = ['LYX_DIR', 'LOCALEDIR', 'TOP_SRCDIR', 'PROGRAM_SUFFIX']
   env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
-  
+
   supports = env.StaticLibrary(
     target = '$LOCALLIBPATH/supports',
     source = ['$BUILDDIR/common/support/%s' % x for x in Split('''
@@ -136,13 +134,13 @@ if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']
   )
   Alias('supports', supports)
 
-#
-# src/mathed
-#
-  
+
 if build_lyx or 'mathed' in targets:
+  #
+  # src/mathed
+  #
   print "Processing files in src/mathed"
-  
+
   mathed = env.StaticLibrary(
     target = '$LOCALLIBPATH/mathed',
     source = ["$BUILDDIR/common/mathed/%s" % x for x in Split('''
@@ -228,7 +226,7 @@ if build_lyx or 'insets' in targets:
   # src/insets
   #
   print "Processing files in src/insets"
-  
+
   insets = env.StaticLibrary(
     target = '$LOCALLIBPATH/insets',
     source = ["$BUILDDIR/common/insets/%s" % x for x in Split('''
@@ -285,14 +283,13 @@ if build_lyx or 'insets' in targets:
   )
   Alias('insets', insets)
 
-  
+
 if build_lyx or 'frontends' in targets:
   #
   # src/frontends
   #
-  
   print "Processing files in src/frontends"
-  
+
   frontends = env.StaticLibrary(
     target = '$LOCALLIBPATH/frontends',
     source = ["$BUILDDIR/common/frontends/%s" % x for x in Split('''
@@ -310,13 +307,12 @@ if build_lyx or 'frontends' in targets:
   Alias('frontends', frontends)
 
 
-if build_lyx or 'graphics' in targets:  
+if build_lyx or 'graphics' in targets:
   #
   # src/graphics
   #
-  
   print "Processing files in src/graphics"
-  
+
   graphics = env.StaticLibrary(
     target = '$LOCALLIBPATH/graphics',
     source = ["$BUILDDIR/common/graphics/%s" % x for x in Split('''
@@ -340,9 +336,8 @@ if build_lyx or 'controllers' in targets:
   #
   # src/frontends/controllers
   #
-  
   print "Processing files in src/frontends/controllers"
-  
+
   controllers = env.StaticLibrary(
     target = '$LOCALLIBPATH/controllers',
     source = ["$BUILDDIR/common/frontends/controllers/%s" % x for x in Split('''
@@ -397,6 +392,7 @@ if build_lyx or 'controllers' in targets:
     )
   Alias('controllers', controllers)
 
+
 #
 # src/frontend/qt3/4
 #
@@ -417,20 +413,21 @@ if frontend == 'qt3':
   print "Processing files in src/frontends/qt3"
 
   qt3env = env.Copy()
+  # disable auto scan to speed up non build time
+  qt3env['QT_AUTOSCAN'] = 0
 
   # load qt3 tools
   qt3env.Tool('qt')
 
-  qt3env.Append(CPPPATH = [
+  qt3env.AppendUnique(CPPPATH = [
     '$BUILDDIR/common',
+    '$BUILDDIR/common/images',
     '$BUILDDIR/common/frontends',
     '$BUILDDIR/common/frontends/qt3',
-    '$BUILDDIR/common/images',
     '$BUILDDIR/common/frontends/controllers',
-    '$BUILDDIR/common/frontends/qt3',
-    '$QT_INC_DIR']
+    '$QT_INC_PATH']
   )
-  
+
   qt3_ui_files = Split('''
     BiblioModuleBase.ui
     BranchesModuleBase.ui
@@ -502,8 +499,7 @@ if frontend == 'qt3':
     QVSpaceDialogBase.ui
     QWrapDialogBase.ui
   ''')
-  
-  
+
   qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
     BulletsModule.C
     emptytable.C
@@ -563,15 +559,16 @@ if frontend == 'qt3':
     socket_callback.C
     validators.C
   ''')]
+
+  # manually moc and uic files for better performance 
+  # (stop autoscan, 13:20s->12:50s :-)
+  qt3_moced_files = [qt3env.Moc(x.replace('.C', '.h')) for x in qt3_moc_files]
   
-  # under windows, because of the .C/.c confusion
-  # moc_files are not moced automatically.
-  # I am doing it manually here, until lyx changes
-  # file extension from .C to .cpp
-  qt3_moced_files = []
-  if os.name == 'nt' or sys.platform == 'cygwin':
-    qt3_moced_files = [qt3env.Moc(x.replace('.C', '.h')) for x in qt3_moc_files]
-  
+  qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in qt3_ui_files]
+  qt3_uiced_cc_files = []
+  for x in qt3_uiced_files:
+    qt3_uiced_cc_files.extend(x[1:])
+
   qt3 = qt3env.StaticLibrary(
     target = '$LOCALLIBPATH/qt3',
     source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
@@ -636,8 +633,7 @@ if frontend == 'qt3':
       qscreen.C
       qt_helpers.C
     ''')] +
-    qt3_moc_files + qt3_moced_files +
-    ['$BUILDDIR/common/frontends/qt3/ui/' + x for x in qt3_ui_files]
+    qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
   )
   Alias('qt3', qt3)
 
@@ -646,7 +642,8 @@ elif frontend == 'qt4':
   print "Processing files in src/frontends/qt4"
 
   qt4env = env.Copy()
-  
+  qt4env['QT_AUTOSCAN'] = 0
+
   # local qt4 toolset from
   # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
   #
@@ -655,8 +652,8 @@ elif frontend == 'qt4':
   #
   qt4env.Tool('qt4', [env['SCONS_DIR']])
   qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
-  
-  qt4env.Append(CPPPATH = [
+
+  qt4env.AppendUnique(CPPPATH = [
     '$BUILDDIR/common',
     '$BUILDDIR/common/images',
     '$BUILDDIR/common/frontends',
@@ -667,7 +664,7 @@ elif frontend == 'qt4':
     '$QT_INC_PATH/QtCore',
     '$QT_INC_PATH/QtGui']
   )
-  
+
   # FIXME: replace by something from pkg_config
   qt4env.Append(CCFLAGS = [
     '-DHAVE_CONFIG_H',
@@ -677,8 +674,8 @@ elif frontend == 'qt4':
     '-DQT3_SUPPORT',
     '-Winvalid-pch']
   )
-  
-  qt4_ui_files = Split('''
+
+  qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
     BiblioUi
     BranchesUi
     BulletsUi
@@ -748,9 +745,9 @@ elif frontend == 'qt4':
     QURLUi
     QVSpaceUi
     QWrapUi
-  ''')
-  
-  qt4_moc_files = Split('''
+  ''')]
+
+  qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
     BulletsModule.C
     emptytable.C
     FileDialog_private.C
@@ -811,15 +808,9 @@ elif frontend == 'qt4':
     QLToolbar.C
     socket_callback.C
     validators.C
-  ''')
-  
-  #
-  # Compile resources
-  #
-  for x in qt4_ui_files:
-    qt4env.Uic4('$BUILDDIR/common/frontends/qt4/ui/' + x)
-  
-  qt4_source_files = Split('''
+  ''') ]
+
+  qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
     QDialogView.C
     Alert_pimpl.C
     Dialogs.C
@@ -881,52 +872,67 @@ elif frontend == 'qt4':
     qfont_metrics.C
     qscreen.C
     qt_helpers.C
-  ''')
-  
+  ''')]
+
+  #
+  # Compile resources
+  #
+  resources = [qt4env.Uic4(x) for x in qt4_ui_files]
+
+  # 
+  # moc qt4_moc_files
+  #
+  qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
+
+  # if the moced files are included in the .C file
+  # the Flatten(...) part will not be needed
   qt4 = qt4env.StaticLibrary(
     target = '$LOCALLIBPATH/qt4',
     LIBS = qt4env['QT_LIB'],
-    source = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in qt4_source_files] + \
-       ["$BUILDDIR/common/frontends/qt4/%s" % x for x in qt4_moc_files]
-   )
+    source = qt4_source_files + qt4_moc_files + Flatten(qt4_moced_files)
+  )
   Alias('qt4', qt4)
 
 
-if 'client' in targets or 'install' in targets:
+if 'client' in targets or 'install' in targets or 'all' in targets:
   #
   # src/client
   #
   env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
-  
+
   print "Processing files in src/client"
-  
-  client = env.Program(
-    target = '$BUILDDIR/common/client/lyxclient',
-    LIBS = env['BOOST_LIBRARIES'] + env['SOCKET_LIBS'] + ['supports'],
-    source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
-      boost.C
-      client.C
-      debug.C
-      gettext.C
-      messages.C
-    ''')]
-  )
-  Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]), 
-    client, [Copy('$TARGET', '$SOURCE')]))
+
+  try:
+    client = env.Program(
+      target = '$BUILDDIR/common/client/lyxclient',
+      LIBS = env['BOOST_LIBRARIES'] + env['SOCKET_LIBS'] + ['supports'],
+      source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
+        boost.C
+        client.C
+        debug.C
+        gettext.C
+        messages.C
+      ''')]
+    )
+    Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
+      client, [Copy('$TARGET', '$SOURCE')]))
+  except:
+    print "Building of program lyxclient failed"
+    client = None
   Alias('client', client)
 
 
-if 'tex2lyx' in targets or 'install' in targets:
+if 'tex2lyx' in targets or 'install' in targets or 'all' in targets:
   #
   # tex2lyx
   #
   print "Processing files in src/tex2lyx"
-  
+
   tex2lyx_env = env.Copy()
   # the order is important here.
   tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
-  tex2lyx_env.Append(LIBPATH = ['#$LOCALLIBPATH'])
-  
+  tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
+
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/FloatList.C', '$TOP_SRC_DIR/src/FloatList.C')
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/Floating.C', '$TOP_SRC_DIR/src/Floating.C')
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/counters.C', '$TOP_SRC_DIR/src/counters.C')
@@ -937,33 +943,37 @@ if 'tex2lyx' in targets or 'install' in targets:
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/lyxtextclass.C', '$TOP_SRC_DIR/src/lyxtextclass.C')
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/lyxlex.C', '$TOP_SRC_DIR/src/lyxlex.C')
   tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/lyxlex_pimpl.C', '$TOP_SRC_DIR/src/lyxlex_pimpl.C')
-  
-  tex2lyx = tex2lyx_env.Program(
-    target = '$BUILDDIR/common/tex2lyx/tex2lyx',
-    LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
-    source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
-      FloatList.C
-      Floating.C
-      counters.C
-      lyxlayout.C
-      lyxtextclass.C
-      lyxlex.C
-      lyxlex_pimpl.C
-      boost.C
-      context.C
-      gettext.C
-      lengthcommon.C
-      lyxfont.C
-      texparser.C
-      tex2lyx.C
-      preamble.C
-      math.C
-      table.C
-      text.C
-    ''')]
-  )
-  Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]), 
-    tex2lyx, [Copy('$TARGET', '$SOURCE')]))
+
+  try:
+    tex2lyx = tex2lyx_env.Program(
+      target = '$BUILDDIR/common/tex2lyx/tex2lyx',
+      LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
+      source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
+        FloatList.C
+        Floating.C
+        counters.C
+        lyxlayout.C
+        lyxtextclass.C
+        lyxlex.C
+        lyxlex_pimpl.C
+        boost.C
+        context.C
+        gettext.C
+        lengthcommon.C
+        lyxfont.C
+        texparser.C
+        tex2lyx.C
+        preamble.C
+        math.C
+        table.C
+        text.C
+      ''')]
+    )
+    Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
+      tex2lyx, [Copy('$TARGET', '$SOURCE')]))
+  except:
+    print "Building of program tex2lyx failed"
+    tex2lyx = None
   Alias('tex2lyx', tex2lyx)
 
 
@@ -972,10 +982,10 @@ if build_lyx or 'lyxbase' in targets:
   # src/
   #
   print "Processing files in src"
-  
+
   env['SUBST_KEYS'] = ['PACKAGE_VERSION', 'VERSION_INFO']
   env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
-  
+
   lyx_source_pre = Split('''
     Bidi.C
     BufferView.C
@@ -1081,7 +1091,7 @@ if build_lyx or 'lyxbase' in targets:
     vspace.C
     main.C
   ''')
-  
+
   lyx_source_post = Split('''
     tabular.C
     dimension.C
@@ -1090,14 +1100,14 @@ if build_lyx or 'lyxbase' in targets:
     Thesaurus.C
     SpellBase.C
   ''')
-  
+
   if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
     lyx_source_post.append('aspell.C')
   elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
     lyx_source_post.append('pspell.C')
   elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
     lyx_source_post.append('ispell.C')
-  
+
   lyxbase_pre = env.StaticLibrary(
     target = '$LOCALLIBPATH/lyxbase_pre',
     source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
@@ -1114,40 +1124,83 @@ if build_lyx or 'lyx' in targets:
   #
   # Build lyx with given frontend
   #
-  lyx = env.Program(
-    target = '$BUILDDIR/$frontend/lyx',
-    source = [],
-    LIBS = [
-      'lyxbase_pre',
-      'mathed',
-      'insets',
-      'frontends',
-      env['frontend'],
-      'controllers',
-      'graphics',
-      'supports',
-      'lyxbase_post',
-      ] +
-      env['BOOST_LIBRARIES'] +
-      env['EXTRA_LIBS'] +
-      env['SOCKET_LIBS'] +
-      env['SYSTEM_LIBS']
-  )
-  # [/path/to/lyx.ext] => lyx-qt3.ext
-  target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
-  Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
-    [Copy('$TARGET', '$SOURCE')]))
+  try:
+    lyx = env.Program(
+      target = '$BUILDDIR/$frontend/lyx',
+      source = [],
+      LIBS = [
+        'lyxbase_pre',
+        'mathed',
+        'insets',
+        'frontends',
+        env['frontend'],
+        'controllers',
+        'graphics',
+        'supports',
+        'lyxbase_post',
+        ] +
+        env['BOOST_LIBRARIES'] +
+        env['EXTRA_LIBS'] +
+        env['SOCKET_LIBS'] +
+        env['SYSTEM_LIBS']
+    )
+    # [/path/to/lyx.ext] => lyx-qt3.ext
+    target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
+    Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
+      [Copy('$TARGET', '$SOURCE')]))
+  except:
+    print "Building of program lyx failed"
+    lyx = None
+    raise
   Alias('lyx', lyx)
 
 
-if 'install' in targets:
+if 'po' in targets or 'install' in targets or 'all' in targets:
   #
-  # This does not look clever right now. I am using the basic
-  # install builder of scons instead of fancier wiki solutions
-  # with the hope that scons can finish standarding this soon.
+  # po/
   #
+  print 'Processing files in po...'
+
   import glob
-  
+  # handle po files
+  #
+  # files to translate
+  transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
+  # possibly *only* handle these languages
+  languages = None
+  if env.has_key('languages'):
+    languages = env.make_list(env['lanauges'])
+  # use defulat msgfmt
+  if not env['MSGFMT']:
+    print 'msgfmt does not exist. Can not process po files'
+  else:
+    # create a builder
+    env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
+    #
+    gmo_files = []
+    for f in transfiles:
+      # get filename
+      fname = os.path.split(f)[1]
+      # country code
+      country = fname.split('.')[0]
+      #
+      if not languages or country in languages:
+        gmo_files.extend(env.Transfiles(f))
+
+
+if 'install' in targets:
+  # create the directory if needed
+  if not os.path.isdir(env['PREFIX']):
+    try:
+      os.makedirs(env['PREFIX'])
+    except:
+      pass
+    if not os.path.isdir(env['PREFIX']):
+      print 'Can not create directory', env['PREFIX']
+      Exit(3)
+  #
+  import glob
+  #
   # windows: $PREFIX/Resources
   # others:  $PREDIX/share/lyx
   share_dir = env['SHARE_DIR']
@@ -1157,9 +1210,9 @@ if 'install' in targets:
   # windows: $PREFIX/Resources/locale
   # others:  $PREFIX/share/locale
   locale_dir = env['LOCALE_DIR']
-  
+
   def install(dest, src):
-    ''' recusive installation of src '''
+    ''' recusive installation of src to dest '''
     # separate file and directory
     files = filter(os.path.isfile, [x for x in src])
     dirs = filter(os.path.isdir, [x for x in src])
@@ -1168,21 +1221,20 @@ if 'install' in targets:
     # install directory
     ins_dir = [dest]
     for dir in dirs:
-      ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)), 
+      ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
         glob.glob(os.path.join(dir, '*'))) )
     return ins_dir
   #
-  # executables
-  env.Install(env['BIN_DIR'], [lyx, tex2lyx, client])
+  # executables (some of them may be none)
+  env.Install(env['BIN_DIR'], filter(lambda x: x != None, [lyx, tex2lyx, client]))
   Alias('install', env['BIN_DIR'])
   #
   # share/lyx
-  dirs = install(env['SHARE_DIR'], 
-    [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings', 
+  dirs = install(env['SHARE_DIR'],
+    [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
      'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
-     'lyxrc.example', 'syntax.default', \
-     'images', 'layouts', 'scripts', 'templates', \
-     'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc',  'ui']]
+     'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts', 
+     'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc',  'ui']]
   )
   Alias('install', dirs)
   # man
@@ -1194,7 +1246,14 @@ if 'install' in targets:
     env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
   Alias('install', [os.path.join(env['MAN_DIR'], x) for
     x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
+  # locale files?
+  # ru.gmo ==> ru/LC_MESSAGES/lyx.mo
+  for gmo in gmo_files:
+    lan = os.path.split(str(gmo))[1].split('.')[0]
+    dest_file = os.path.join(env['LOCALE_DIR'], lan, 'LC_MESSAGES', 'lyx.mo')
+    env.InstallAs(dest_file, gmo)
+    Alias('install', dest_file)
 
 
 Default('lyx')
-
+Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])
index f3daf1f7b17e384bf3e98b7808f7b0cfc18430ff..d6e032a79c57e75e42d3fbbc41fc2fa22e75e5c9 100644 (file)
@@ -1,31 +1,31 @@
 # vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
 #
 # file SConstruct
-# 
+#
 # This file is part of LyX, the document processor.
 # Licence details can be found in the file COPYING.
-# 
+#
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 #
 #
 # This is a scons based building system for lyx, you can use it as follows:
-# (after of course installation of scons from www.scons.org)
-#  
+#
 #   $ cd development/scons
 #   $ scons [options] [targets]
 # or:
 #   $ scons -f development/scons/SConstruct [options] [targets]
-#
-# After compiling, you can install lyx by
+# and:
 #   $ scons [prefix=.] install
 #
 # Where:
-#   * targets can be one or more of lyx, tex2lyx, client, default to lyx
-#   * options: use scons -h for details about parameters, the most important 
+#   * targets can be one or more of lyx, tex2lyx, client, po, install.
+#     default to lyx, you can use 'scons all' to build all targets except 
+#     for install
+#   * options: use scons -h for details about options, the most important
 #     one is frontend=qt3|qt4.
-#     * qt3 is used by default on linux, cygwin and mac
-#     * qt4 is used by default on win32/mingw
+#     - qt3 is used by default on linux, cygwin and mac
+#     - qt4 is used by default on win32/mingw
 #
 # File layouts (Important):
 #   * Unless you specify builddir=dir, building will happen
 #   * $BUILDDIR has subdirectories
 #       libs:      all intermediate libraries
 #       boost:     boost libraries, if boost=included is used
-#       qt3:       build result
-#   * lyx executable will be in directories like debug/linux-qt3
-#  
+#       qt3/4:     frontend-specific objects
+#   * executables will be copied to $BUILDDIR/
+#
 # Hints:
+#   * scons fast_start=yes
+#     If env.cache exists, bypass all tests and use existing src/config.h
+#
 #   * scons --config=force
 #     force re-configuration (use scons -H for details)
-#   
+#
 #   * check config.log to see why config has failed
 #
 #   * use extra_inc_path, extra_lib_path, qt_dir, qt_inc_path
-#     qt_lib_path to help locate qt and other libraries
-#     (there are extra_inc_path1, extra_lib_path1 for now)
+#     qt_lib_path to help locate qt and other libraries.
+#     There are also extra_inc_path1, extra_lib_path1 if you need to spacify
+#     more than one extra paths.
 #
-#   * (Important) use scons logfile=logfile.log to enable command line
-#     logging. (default is no logging)
+#   * executed commands will be logged in scons_lyx.log. You can use logfile=
+#     option to save log to another file.
 #
 # Notes:
-#   * Currently, all scons does is building lyx in
-#       $LYXROOT/$mode/$build_dir/
-#     where $mode is debug or release, $build_dir is the build_dir name 
-#     listed above
 #
-#   * scons install etc may be added later. Interested contributors can follow
+#   * scons dist etc may be added later. Interested contributors can follow
 #       http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/AccumulateBuilder
 #     or
 #       http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/DistTarBuilder
 #     Please also see the commented out code in scons_utils.py
-#       
+#   
 #   * NSIS support can be found here.
 #     http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/NsisSconsTool
 #
 #   features.
 #
 
-import os, sys
+import os, sys, copy, cPickle
 
 # config/scons_utils.py defines a few utility function
 sys.path.append('config')
 import scons_utils as utils
 
-SetOption('implicit_cache', 1)
-
 #----------------------------------------------------------
 # Required runtime environment
 #----------------------------------------------------------
@@ -114,18 +112,15 @@ PACKAGE_NAME = 'LyX'
 PACKAGE_TARNAME = 'lyx'
 PACKAGE_STRING = '%s %s' % (PACKAGE_NAME, PACKAGE_VERSION)
 PROGRAM_SUFFIX = ''
+
+# various cache/log files
 default_log_file = 'scons_lyx.log'
+env_cache_file = 'env.cache'
 
-# FIXME: what is this? (They are used in src/support/package.C.in
-LOCALEDIR = "../locale/"
-LYX_DIR = "/usr/local/share/lyx"
 
-# platform dependent default build_dir and other settings
-#
-# I know, somebody would say: 
-#   This is TOTALLY wrong! Everything should be automatically
-#   determined.
-#
+#----------------------------------------------------------
+# platform dependent settings
+#----------------------------------------------------------
 if os.name == 'nt':
   platform_name = 'win32'
   default_frontend = 'qt4'
@@ -135,13 +130,13 @@ if os.name == 'nt':
   default_pch_opt = False
   default_with_x = False
   spell_checker = 'auto'
-  # FIXME: I need to know what exactly is boost_posix
-  # EF: It indicates to boost which API to use (posix or windows).
+  # boost_posix indicates to boost which API to use (posix or windows).
   # If not specified, boost tries to figure out by itself, but it may fail.
   boost_posix = False
   packaging_method = 'windows'
+  default_prefix = 'c:/program files/lyx'
   share_dir = 'Resources'
-  man_dir = 'Resouces/man/man1'
+  man_dir = 'Resources/man/man1'
   locale_dir = 'Resources/locale'
 elif os.name == 'posix' and sys.platform != 'cygwin':
   platform_name = sys.platform
@@ -153,6 +148,7 @@ elif os.name == 'posix' and sys.platform != 'cygwin':
   default_with_x = True
   boost_posix = True
   packaging_method = 'posix'
+  default_prefix = '/usr/local/'
   share_dir = 'share/lyx'
   man_dir = 'man/man1'
   locale_dir = 'share/locale'
@@ -166,6 +162,7 @@ elif os.name == 'posix' and sys.platform == 'cygwin':
   default_with_x = True
   boost_posix = True
   packaging_method = 'posix'
+  default_prefix = '/usr/local/'
   share_dir = 'share/lyx'
   man_dir = 'man/man1'
   locale_dir = 'share/locale'
@@ -178,9 +175,11 @@ elif os.name == 'darwin':
   default_pch_opt = False
   default_with_x = False
   boost_posix = True
-  packaging_method = 'msc'
+  packaging_method = 'mac'
+  # FIXME: where to install?
+  default_prefix = '/usr/local/'
   share_dir = 'Resources'
-  man_dir = 'Resouces/man/man1'
+  man_dir = 'Resources/man/man1'
   locale_dir = 'Resources/locale'
 else:  # unsupported system
   platform_name = 'others'
@@ -192,107 +191,107 @@ else:  # unsupported system
   default_with_x = True
   boost_posix = False
   packaging_method = 'posix'
+  default_prefix = '/usr/local/'
   share_dir = 'share/lyx'
   man_dir = 'man/man1'
   locale_dir = 'share/locale'
 
+
 #---------------------------------------------------------
 # Handling options
 #----------------------------------------------------------
-# Note that if you set the options via the command line, 
-# they will be remembered in the file 'options.cache'
-# 
-# NOTE: the scons people are trying to fix scons so that
-# options like --prefix will be accepted. Right now,
-# we have to use the KEY=VALUE style of scons
-# 
-if os.path.isfile('options.cache'):
-  print "Getting options from auto-saved options.cache..."
-  print open('options.cache').read()
+#
 if os.path.isfile('config.py'):
   print "Getting options from config.py..."
   print open('config.py').read()
 
-opts = Options(['options.cache', 'config.py'])
+opts = Options(['config.py'])
 opts.AddOptions(
-  # frontend, 
-  EnumOption('frontend', 'Main GUI', 
-    default_frontend,
+  # frontend,
+  EnumOption('frontend', 'Main GUI', default_frontend,
     allowed_values = ('xform', 'qt3', 'qt4', 'gtk') ),
   # debug or release build
   EnumOption('mode', 'Building method', default_build_mode,
     allowed_values = ('debug', 'release') ),
   # boost libraries
-  EnumOption('boost', 
-    'Use included, system boost library, or try sytem first.', 
+  EnumOption('boost',
+    'Use included, system boost library, or try sytem boost first.',
     default_boost_opt,
     allowed_values = (
       'auto',       # detect boost, if not found, use included
       'included',   # always use included boost
       'system',     # always use system boost, fail if can not find
       ) ),
-  EnumOption('gettext', 
-    'Use included, system gettext library, or try sytem first', 
+  # FIXME: not implemented yet.
+  EnumOption('gettext',
+    'Use included, system gettext library, or try sytem gettext first',
     default_gettext_opt,
     allowed_values = (
       'auto',       # detect gettext, if not found, use included
       'included',   # always use included gettext
       'system',     # always use system gettext, fail if can not find
       ) ),
-  # FIXME: I am not allowed to use '' as default, '.' is not good either.
-  PathOption('qt_dir', 'Path to qt directory', '.'),
-  PathOption('qt_include_path', 'Path to qt include directory', '.'),
-  PathOption('qt_lib_path', 'Path to qt library directory', '.'),
+  #
+  EnumOption('spell', 'Choose spell checker to use.', 'auto',
+    allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
+  #
+  BoolOption('fast_start', 'Whether or not use cached tests and keep current config.h', 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),
   # FIXME: Not implemented yet.
   BoolOption('version_suffix', '(NA) Whether or not add version suffix', False),
-  # build directory, will replace build_dir if set
-  PathOption('build_dir', 'Build directory', '.'),
-  # extra include and libpath
-  PathOption('extra_inc_path', 'Extra include path', '.'),
-  PathOption('extra_lib_path', 'Extra library path', '.'),
-  PathOption('extra_inc_path1', 'Extra include path', '.'),
-  PathOption('extra_lib_path1', 'Extra library path', '.'),
-  # enable assertion, (config.h has  ENABLE_ASSERTIOS
+  # enable assertion, (config.h has ENABLE_ASSERTIOS
   BoolOption('assertions', 'Use assertions', True),
-  # enable warning, (config.h has  WITH_WARNINGS)
+  # enable warning, (config.h has WITH_WARNINGS)
   BoolOption('warnings', 'Use warnings', True),
-  # enable glib, (config.h has  _GLIBCXX_CONCEPT_CHECKS)
+  # enable glib, (config.h has _GLIBCXX_CONCEPT_CHECKS)
   BoolOption('concept_checks', 'Enable concept checks', True),
   # FIXME: I do not know what is nls
   BoolOption('nls', '(NA) Whether or not use native language support', False),
   # FIXME: not implemented
   BoolOption('profile', '(NA) Whether or not enable profiling', False),
-  # 
-  PathOption('prefix', 'install architecture-independent files in PREFIX', '.'),
-  # 
-  PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', '.'),
   # FIXME: not implemented
   BoolOption('std_debug', '(NA) Whether or not turn on stdlib debug', False),
   # using x11?
   BoolOption('X11', 'Use x11 windows system', default_with_x),
   # FIXME: not implemented
   BoolOption('libintl', '(NA) Use libintl library', False),
+  # 
+  PathOption('qt_dir', 'Path to qt directory', None),
+  #
+  PathOption('qt_include_path', 'Path to qt include directory', None),
+  #
+  PathOption('qt_lib_path', 'Path to qt library directory', None),
+  # build directory, will use $mode if not set
+  PathOption('build_dir', 'Build directory', None),
+  # extra include and libpath
+  PathOption('extra_inc_path', 'Extra include path', None),
+  #
+  PathOption('extra_lib_path', 'Extra library path', None),
+  #
+  PathOption('extra_inc_path1', 'Extra include path', None),
+  #
+  PathOption('extra_lib_path1', 'Extra library path', None),
+  # can be set to a non-existing directory
+  ('prefix', 'install architecture-independent files in PREFIX', None),
+  #
+  PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', None),
   # FIXME: not implemented
-  PathOption('intl_prefix', '(NA) Path to intl library', '.'),
+  PathOption('intl_prefix', '(NA) Path to intl library', None),
   # log file
   ('logfile', 'save commands (not outputs) to logfile', default_log_file),
   # Path to aikasurus
-  PathOption('aikasurus_path', 'Path to aikasurus library', '.'),
-  #
-  EnumOption('spell', 'Choose spell checker to use.', 'auto',
-    allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
-  # environment variable can be set as options
-  ('CC', '$CC', 'gcc'),
-  ('CPP', '$CPP', 'gcc -E'),
-  ('CXX', '$CXX', 'g++'),
-  ('CXXCPP', '$CXXCPP', 'g++ -E'),
-  ('CCFLAGS', '$CCFLAGS', ''),
-  ('CPPFLAGS', '$CPPFLAGS', ''),
-  ('CPPPATH', '$CPPPATH', ''),
-  ('LDFLAGS', '$LDFLAGS', ''),
-)  
+  PathOption('aikasurus_path', 'Path to aikasurus library', None),
+  # environment variable can be set as options. (DO NOT set defaults)
+  ('CC', '$CC', None),
+  ('LINK', '$LINK', None),
+  ('CPP', '$CPP', None),
+  ('CXX', '$CXX', None),
+  ('CXXCPP', '$CXXCPP', None),
+  ('CCFLAGS', '$CCFLAGS', None),
+  ('CPPFLAGS', '$CPPFLAGS', None),
+  ('LDFLAGS', '$LDFLAGS', None),
+)
 
 
 #---------------------------------------------------------
@@ -301,19 +300,38 @@ opts.AddOptions(
 
 env = Environment(options = opts)
 
-# Determine the frontend to use, which may be loaded 
+# Determine the frontend to use, which may be loaded
 # from option cache
 frontend = env.get('frontend', default_frontend)
+# make sure the key exists
+env['frontend'] = frontend
+#
 use_X11 = env.get('X11', default_with_x)
 
-# set environment since I do not really like ENV = os.environ
+# whether or not use current config.h, and cached tests
+if env['fast_start'] and os.path.isfile(env_cache_file):
+  fast_start = True
+  SetOption('implicit_cache', 1)
+  cache_file = open(env_cache_file)
+  env_cache = cPickle.load(cache_file)
+  cache_file.close()
+  print '------------ fast_start mode --------------------'
+  print '  Use cached test results and current config.h'
+  print '  use fast_start=no to override'
+  print '-------------------------------------------------'
+else:
+  fast_start = False
+  SetOption('implicit_cache', 0)
+  env_cache = {}
+
+# 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')
 env['TOP_SRC_DIR'] = TOP_SRC_DIR
 env['SCONS_DIR'] = SCONS_DIR
-# install to current directory by default
-env['PREFIX'] = env.get('prefix', '.')
-if env.has_key('exec_prefix') and env['exec_prefix'] != '.':
+# install to default_prefix by default
+env['PREFIX'] = env.get('prefix', default_prefix)
+if env.has_key('exec_prefix'):
   env['BIN_DIR'] = env['exec_prefix']
 else:
   env['BIN_DIR'] = os.path.join(env['PREFIX'], 'bin')
@@ -329,50 +347,36 @@ def getEnvVariable(env, name):
   # first try command line argument (override environment settings)
   if ARGUMENTS.has_key(name) and ARGUMENTS[name].strip() != '':
     env[name] = ARGUMENTS[name]
-  # then try environment variable  
+  # then use environment default
   elif os.environ.has_key(name) and os.environ[name].strip() != '':
     env[name] = os.environ[name]
     print "Acquiring varaible %s from system environment: %s" % (name, env[name])
+  # finally, env['CC'] etc is set to the default values of Options.
+  # and env['CPP'] etc does not exist
 
 getEnvVariable(env, 'CC')
+getEnvVariable(env, 'LINK')
 getEnvVariable(env, 'CPP')
 getEnvVariable(env, 'CXX')
 getEnvVariable(env, 'CXXCPP')
 getEnvVariable(env, 'CCFLAGS')
 getEnvVariable(env, 'CXXFLAGS')
 getEnvVariable(env, 'CPPFLAGS')
-getEnvVariable(env, 'CPPPATH')
 getEnvVariable(env, 'LDFLAGS')
 
-# under windows, scons is confused by .C/.c and uses gcc instead of 
-# g++. I am forcing the use of g++ here. This is expected to change
-# after lyx renames all .C files to .cpp
-#
-# Solaris seems to use gcc for the last step as well, so, to
-# make sure everyone uses a C++ compiler, linker, I do this for
-# all platform
-#
-# just to be safe
-if env.has_key('CXX') and env['CXX'] != '':
-  env['CC'] = env['CXX']
-  env['LINK'] = env['CXX']
-else:
-  env['CC'] = 'g++'
-  env['LINK'] = 'g++'
 
 #
 # frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
-# 
-env['frontend'] = frontend
+#
 env['mode'] = env.get('mode', default_build_mode)
 # lyx will be built to $build/build_dir so it is possible
-# to build multiple build_dirs using the same source 
+# to build multiple build_dirs using the same source
 # $mode can be debug or release
-if ARGUMENTS.has_key('build_dir'):
-  build_dir = ARGUMENTS['build_dir']
+if env.has_key('build_dir') and env['build_dir']:
+  build_dir = env['build_dir']
   env['BUILDDIR'] = build_dir
 else:
-  # Determine the name of the build (platform+frontend
+  # Determine the name of the build $mode
   env['BUILDDIR'] = '#' + env['mode']
 # all built libraries will go to build_dir/libs
 # (This is different from the make file approach)
@@ -382,20 +386,16 @@ env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
 #
 # QTDIR, QT_LIB_PATH, QT_INC_PATH
 #
-if platform_name == 'win32':
-  env.Tool('mingw')
-
-if env.has_key('qt_dir') and env['qt_dir'] != '.':
+if env.has_key('qt_dir') and env['qt_dir']:
   env['QTDIR'] = env['qt_dir']
   # add path to the qt tools
   env.AppendUnique(LIBPATH = [os.path.join(env['qt_dir'], 'lib')])
-  env.AppendUnique(CPPPATH = [os.path.join(env['qt_dir'], 'include')])
   # set environment so that moc etc can be found even if its path is not set properly
   env.PrependENVPath('PATH', os.path.join(env['qt_dir'], 'bin'))
 else:
   env['QTDIR'] = os.environ.get('QTDIR', '/usr/lib/qt-3.3')
 
-if env.has_key('qt_lib_path') and env['qt_lib_path'] != '.':
+if env.has_key('qt_lib_path') and env['qt_lib_path']:
   env['QT_LIB_PATH'] = env['qt_lib_path']
 else:
   env['QT_LIB_PATH'] = '$QTDIR/lib'
@@ -403,26 +403,28 @@ env.AppendUnique(LIBPATH = ['$QT_LIB_PATH'])
 # qt4 seems to be using pkg_config
 env.PrependENVPath('PKG_CONFIG_PATH', env.subst('$QT_LIB_PATH'))
 
-if env.has_key('qt_inc_path') and env['qt_inc_path'] != '.':
+if env.has_key('qt_inc_path') and env['qt_inc_path']:
   env['QT_INC_PATH'] = env['qt_inc_path']
 elif os.path.isdir(os.path.join(env.subst('$QTDIR'), 'include')):
   env['QT_INC_PATH'] = '$QTDIR/include'
 else: # have to guess
   env['QT_INC_PATH'] = '/usr/include/$frontend/'
-env.AppendUnique(CPPPATH = env['QT_INC_PATH'])  
+# Note that this CPPPATH is for testing only
+# it will be removed before calling SConscript
+env.AppendUnique(CPPPATH = env['QT_INC_PATH'])
 
 #
 # extra_inc_path and extra_lib_path
 #
-if env.has_key('extra_inc_path'):
+if env.has_key('extra_inc_path') and env['extra_inc_path']:
   env.AppendUnique(CPPPATH = [env['extra_inc_path']])
-if env.has_key('extra_lib_path'):
+if env.has_key('extra_lib_path') and env['extra_lib_path']:
   env.AppendUnique(LIBPATH = [env['extra_lib_path']])
-if env.has_key('extra_inc_path1'):
+if env.has_key('extra_inc_path1') and env['extra_inc_path1']:
   env.AppendUnique(CPPPATH = [env['extra_inc_path1']])
-if env.has_key('extra_lib_path1'):
+if env.has_key('extra_lib_path1') and env['extra_lib_path1']:
   env.AppendUnique(LIBPATH = [env['extra_lib_path1']])
-if env.has_key('aikasurus_path'):
+if env.has_key('aikasurus_path') and env['aikasurus_path']:
   env.AppendUnique(LIBPATH = [env['aikasurus_path']])
 
 #
@@ -430,9 +432,25 @@ if env.has_key('aikasurus_path'):
 # but it is required to do the tests.
 if platform_name == 'win32':
   env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
+  env.Tool('mingw')
+
+# under windows, scons is confused by .C/.c and uses gcc instead of
+# g++. I am forcing the use of g++ here. This is expected to change
+# after lyx renames all .C files to .cpp
+#
+# Note that this step has to be after env.Tool('mingw') step
+# since env.Tool('mingw') will set env['CC'] etc.
+#
+if env.has_key('CXX') and env['CXX']:
+  env['CC'] = env['CXX']
+  env['LINK'] = env['CXX']
+else:
+  env['CC'] = 'g++'
+  env['LINK'] = 'g++'
+
 
 #----------------------------------------------------------
-# Autoconf business 
+# Autoconf business
 #----------------------------------------------------------
 
 conf = Configure(env,
@@ -445,329 +463,378 @@ conf = Configure(env,
     'CheckStdCount' : utils.checkStdCount,
     'CheckSelectArgType' : utils.checkSelectArgType,
     'CheckBoostLibraries' : utils.checkBoostLibraries,
+    'CheckMsgFmt' : utils.checkMsgFmt,
   }
 )
 
 # pkg-config? (if not, we use hard-coded options)
-if conf.CheckPkgConfig('0.15.0'):
-  env['HAS_PKG_CONFIG'] = True
+if not fast_start:
+  if conf.CheckPkgConfig('0.15.0'):
+    env['HAS_PKG_CONFIG'] = True
+  else:
+    print 'pkg-config >= 0.1.50 is not found'
+    env['HAS_PKG_CONFIG'] = False
+  env_cache['HAS_PKG_CONFIG'] = env['HAS_PKG_CONFIG']
 else:
-  print 'pkg-config >= 0.1.50 is not found'
-  env['HAS_PKG_CONFIG'] = False
+  env['HAS_PKG_CONFIG'] = env_cache['HAS_PKG_CONFIG']
 
-# zlib? This is required.
-if not conf.CheckLibWithHeader('z', 'zlib.h', 'C'): 
-  print 'Did not find libz or zlib.h, exiting!'
-  Exit(1)
+# zlib? This is required. (fast_start assumes the existance of zlib)
+if not fast_start and not conf.CheckLibWithHeader('z', 'zlib.h', 'C'):
+    print 'Did not find libz or zlib.h, exiting!'
+    Exit(1)
 
 # qt libraries?
-#
-# qt3 does not use pkg_config
-if env['frontend'] == 'qt3':
-  if not conf.CheckLibWithHeader('qt-mt', 'qapp.h', 'c++', 'QApplication qapp();'):
-    print 'Did not find qt libraries, exiting!'
-    Exit(1)
-elif env['frontend'] == 'qt4':
+if not fast_start:
+  #
+  # qt3 does not use pkg_config
+  if frontend == 'qt3':
+    if not conf.CheckLibWithHeader('qt-mt', 'qapp.h', 'c++', 'QApplication qapp();'):
+      print 'Did not find qt libraries, exiting!'
+      Exit(1)
+  elif frontend == 'qt4':
+    succ = False
+    # first: try pkg_config
+    if env['HAS_PKG_CONFIG']:
+      succ = conf.CheckPackage('QtCore') or conf.CheckPackage('QtCore4')
+      env['QT4_PKG_CONFIG'] = succ
+    # second: try to link to it
+    if not succ:
+      # FIXME: under linux, I can test the following perfectly
+      # However, under windows, lib names need to passed as libXXX4.a ...
+      succ = conf.CheckLibWithHeader('QtCore', 'QtGui/QApplication', 'c++', 'QApplication qapp();') or \
+        conf.CheckLibWithHeader('QtCore4', 'QtGui/QApplication', 'c++', 'QApplication qapp();')
+    # third: try to look up the path
+    if not succ:
+      succ = True
+      for lib in ['QtCore', 'QtGui']:
+        # windows version has something like QtGui4 ...
+        if not (os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s.a' % lib)) or \
+          os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s4.a' % lib))):
+          succ = False
+          break
+    # still can not find it
+    if succ:
+      print "Qt4 libraries are found."
+    else:
+      print 'Did not find qt libraries, exiting!'
+      Exit(1)
+
+
+# check socket libs
+if not fast_start:
+  env['SOCKET_LIBS'] = []
+  if conf.CheckLib('socket'):
+    env['SOCKET_LIBS'].append('socket')
+
+  # nsl is the network services library and provides a
+  # transport-level interface to networking services.
+  if conf.CheckLib('nsl'):
+    env['SOCKET_LIBS'].append('nsl')
+
+  env_cache['SOCKET_LIBS'] = env['SOCKET_LIBS']
+else:
+  env['SOCKET_LIBS'] = env_cache['SOCKET_LIBS']
+
+if not fast_start:
+  # check boost libraries
+  boost_opt = ARGUMENTS.get('boost', default_boost_opt)
+  # check for system boost
   succ = False
-  # first: try pkg_config
-  if env['HAS_PKG_CONFIG']:
-    succ = conf.CheckPackage('QtCore') or conf.CheckPackage('QtCore4')
-    env['QT4_PKG_CONFIG'] = succ
-  # second: try to link to it
-  if not succ:
-    # FIXME: under linux, I can test the following perfectly
-    # However, under windows, lib names need to passed as libXXX4.a ...
-    succ = conf.CheckLibWithHeader('QtCore', 'QtGui/QApplication', 'c++', 'QApplication qapp();') or \
-      conf.CheckLibWithHeader('QtCore4', 'QtGui/QApplication', 'c++', 'QApplication qapp();')
-  # third: try to look up the path
+  if boost_opt in ['auto', 'system']:
+    pathes = env['LIBPATH'] + ['/usr/lib', '/usr/local/lib']
+    sig = conf.CheckBoostLibraries('boost_signals', pathes)
+    reg = conf.CheckBoostLibraries('boost_regex', pathes)
+    fil = conf.CheckBoostLibraries('boost_filesystem', pathes)
+    ios = conf.CheckBoostLibraries('boost_iostreams', pathes)
+    # if any of them is not found
+    if ('' in [sig[0], reg[0], fil[0], ios[0]]):
+      if boost_opt == 'system':
+        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:
+      env['BOOST_LIBRARIES'] = [sig[1], reg[1], fil[1], ios[1]]
+      # assume all boost libraries are in the same path...
+      env.AppendUnique(LIBPATH = [sig[0]])
+      env['INCLUDED_BOOST'] = False
+      succ = True
+  # now, auto and succ = false, or boost=included
   if not succ:
-    succ = True
-    for lib in ['QtCore', 'QtGui']:
-      # windows version has something like QtGui4 ...
-      if not (os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s.a' % lib)) or \
-        os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s4.a' % lib))):
-        succ = False
-        break
-  # still can not find it
-  if succ:
-    print "Qt4 libraries are found."
-  else:
-    print 'Did not find qt libraries, exiting!'
-    Exit(1)
+    # we do not need to set LIBPATH now.
+    env['BOOST_LIBRARIES'] = ['boost_signals', 'boost_regex',
+      'boost_filesystem', 'boost_iostreams']
+    env['INCLUDED_BOOST'] = True
+  env_cache['BOOST_LIBRARIES'] = env['BOOST_LIBRARIES']
+  env_cache['INCLUDED_BOOST'] = env['INCLUDED_BOOST']
+else:
+  env['BOOST_LIBRARIES'] = env_cache['BOOST_LIBRARIES']
+  env['INCLUDED_BOOST'] = env_cache['INCLUDED_BOOST']
 
-# check socket libs
-env['SOCKET_LIBS'] = []
-if conf.CheckLib('socket'):
-  env['SOCKET_LIBS'].append('socket')
-
-# EF: This is the network services library and provides a
-# transport-level interface to networking services.
-if conf.CheckLib('nsl'):
-  env['SOCKET_LIBS'].append('nsl')
-
-# check boost libraries
-boost_opt = ARGUMENTS.get('boost', default_boost_opt)
-# check for system boost
-succ = False
-if boost_opt in ['auto', 'system']:
-  pathes = env['LIBPATH'] + ['/usr/lib', '/usr/local/lib']
-  sig = conf.CheckBoostLibraries('boost_signals', pathes)
-  reg = conf.CheckBoostLibraries('boost_regex', pathes)
-  fil = conf.CheckBoostLibraries('boost_filesystem', pathes)
-  ios = conf.CheckBoostLibraries('boost_iostreams', pathes)
-  # if any them is not found
-  if ('' in [sig[0], reg[0], fil[0], ios[0]]):
-    if boost_opt == 'system':
-      print "Can not find system boost libraries"
-      print "Please supply a path through extra_lib_path"
-      print "and try again."
-      Exit(2)
-  else:
-    env['BOOST_LIBRARIES'] = [sig[1], reg[1], fil[1], ios[1]]
-    # assume all boost libraries are in the same path...
-    print sig[0]
-    env.AppendUnique(LIBPATH = [sig[0]])
-    env['INCLUDED_BOOST'] = False
-    succ = True
-# now, auto and succ = false, or included
-if not succ:
-  # we do not need to set LIBPATH now.
-  env['BOOST_LIBRARIES'] = ['boost_signals', 'boost_regex', 
-    'boost_filesystem', 'boost_iostreams']
-  env['INCLUDED_BOOST'] = True
-  
-#
-# Building config.h
-# 
+#
+# check for msgfmt command
+if not fast_start:
+  env['MSGFMT'] = conf.CheckMsgFmt()
+  env_cache['MSGFMT'] = env['MSGFMT']
+else:
+  env['MSGFMT'] = env_cache['MSGFMT']
 
-print "Generating ", utils.config_h, "..."
 
-# I do not handle all macros in src/config.h.in, rather I am following a list
-# of *used-by-lyx* macros compiled by Abdelrazak Younes <younes.a@free.fr> 
-# 
-# Note: addToConfig etc are defined in scons_util
-utils.startConfigH(TOP_SRC_DIR)
-
-# HAVE_IO_H
-# HAVE_LIMITS_H
-# HAVE_LOCALE_H
-# HAVE_LOCALE
-# HAVE_PROCESS_H
-# HAVE_STDLIB_H
-# HAVE_SYS_STAT_H
-# HAVE_SYS_TIME_H
-# HAVE_SYS_TYPES_H
-# HAVE_SYS_UTIME_H
-# HAVE_UNISTD_H
-# HAVE_UTIME_H
-# HAVE_ISTREAM
-# HAVE_OSTREAM
-# HAVE_IOS
-
-# Check header files
-headers = [
-  ('io.h', 'HAVE_IO_H', 'c'),
-  ('limits.h', 'HAVE_LIMITS_H', 'c'),
-  ('locale.h', 'HAVE_LOCALE_H', 'c'),
-  ('locale', 'HAVE_LOCALE', 'cxx'),
-  ('process.h', 'HAVE_PROCESS_H', 'c'),
-  ('stdlib.h', 'HAVE_STDLIB_H', 'c'),
-  ('sys/stat.h', 'HAVE_SYS_STAT_H', 'c'),
-  ('sys/time.h', 'HAVE_SYS_TIME_H', 'c'),
-  ('sys/types.h', 'HAVE_SYS_TYPES_H', 'c'),
-  ('sys/utime.h', 'HAVE_SYS_UTIME_H', 'c'),
-  ('sys/socket.h', 'HAVE_SYS_SOCKET_H', 'c'),
-  ('unistd.h', 'HAVE_UNISTD_H', 'c'),
-  ('utime.h', 'HAVE_UTIME_H', 'c'),
-  ('istream', 'HAVE_ISTREAM', 'cxx'),
-  ('ostream', 'HAVE_OSTREAM', 'cxx'),
-  ('ios', 'HAVE_IOS', 'cxx')
-]
-
-for header in headers:
-  if (header[2] == 'c' and conf.CheckCHeader(header[0])) or \
-    (header[2] == 'cxx' and conf.CheckCXXHeader(header[0])):
-    utils.addToConfig('#define %s 1' % header[1], TOP_SRC_DIR)
+#----------------------------------------------------------
+# Generating config.h
+#----------------------------------------------------------
+if not fast_start:
+  print "Generating ", utils.config_h, "..."
+
+  # I do not handle all macros in src/config.h.in, rather I am following a list
+  # of *used-by-lyx* macros compiled by Abdelrazak Younes <younes.a@free.fr>
+  #
+  # Note: addToConfig etc are defined in scons_util
+  utils.startConfigH(TOP_SRC_DIR)
+
+  # HAVE_IO_H
+  # HAVE_LIMITS_H
+  # HAVE_LOCALE_H
+  # HAVE_LOCALE
+  # HAVE_PROCESS_H
+  # HAVE_STDLIB_H
+  # HAVE_SYS_STAT_H
+  # HAVE_SYS_TIME_H
+  # HAVE_SYS_TYPES_H
+  # HAVE_SYS_UTIME_H
+  # HAVE_UNISTD_H
+  # HAVE_UTIME_H
+  # HAVE_ISTREAM
+  # HAVE_OSTREAM
+  # HAVE_IOS
+
+  # Check header files
+  headers = [
+    ('io.h', 'HAVE_IO_H', 'c'),
+    ('limits.h', 'HAVE_LIMITS_H', 'c'),
+    ('locale.h', 'HAVE_LOCALE_H', 'c'),
+    ('locale', 'HAVE_LOCALE', 'cxx'),
+    ('process.h', 'HAVE_PROCESS_H', 'c'),
+    ('stdlib.h', 'HAVE_STDLIB_H', 'c'),
+    ('sys/stat.h', 'HAVE_SYS_STAT_H', 'c'),
+    ('sys/time.h', 'HAVE_SYS_TIME_H', 'c'),
+    ('sys/types.h', 'HAVE_SYS_TYPES_H', 'c'),
+    ('sys/utime.h', 'HAVE_SYS_UTIME_H', 'c'),
+    ('sys/socket.h', 'HAVE_SYS_SOCKET_H', 'c'),
+    ('unistd.h', 'HAVE_UNISTD_H', 'c'),
+    ('utime.h', 'HAVE_UTIME_H', 'c'),
+    ('istream', 'HAVE_ISTREAM', 'cxx'),
+    ('ostream', 'HAVE_OSTREAM', 'cxx'),
+    ('ios', 'HAVE_IOS', 'cxx')
+  ]
+
+  for header in headers:
+    if (header[2] == 'c' and conf.CheckCHeader(header[0])) or \
+      (header[2] == 'cxx' and conf.CheckCXXHeader(header[0])):
+      utils.addToConfig('#define %s 1' % header[1], TOP_SRC_DIR)
+    else:
+      utils.addToConfig('/* #undef %s */' % header[1], TOP_SRC_DIR)
+
+  # HAVE_OPEN
+  # HAVE_CLOSE
+  # HAVE_POPEN
+  # HAVE_PCLOSE
+  # HAVE__OPEN
+  # HAVE__CLOSE
+  # HAVE__POPEN
+  # HAVE__PCLOSE
+  # HAVE_GETPID
+  # HAVE__GETPID
+  # HAVE_MKDIR
+  # HAVE__MKDIR
+  # HAVE_MKTEMP
+  # HAVE_MKSTEMP
+  # HAVE_STRERROR
+  # HAVE_FCNTL
+
+  # Check functions
+  functions = [
+    ('open', 'HAVE_OPEN'),
+    ('close', 'HAVE_CLOSE'),
+    ('popen', 'HAVE_POPEN'),
+    ('pclose', 'HAVE_PCLOSE'),
+    ('_open', 'HAVE__OPEN'),
+    ('_close', 'HAVE__CLOSE'),
+    ('_popen', 'HAVE__POPEN'),
+    ('_pclose', 'HAVE__PCLOSE'),
+    ('getpid', 'HAVE_GETPID'),
+    ('_getpid', 'HAVE__GETPID'),
+    ('mkdir', 'HAVE_MKDIR'),
+    ('_mkdir', 'HAVE__MKDIR'),
+    ('mktemp', 'HAVE_MKTEMP'),
+    ('mkstemp', 'HAVE_MKSTEMP'),
+    ('strerror', 'HAVE_STRERROR'),
+    ('fcntl', 'HAVE_FCNTL')
+  ]
+
+  for func in functions:
+    if conf.CheckFunc(func[0]):
+      utils.addToConfig('#define %s 1' % func[1], TOP_SRC_DIR)
+    else:
+      utils.addToConfig('/* #undef %s */' % func[1], TOP_SRC_DIR)
+
+  # PACKAGE
+  # PACKAGE_VERSION
+  # DEVEL_VERSION
+  utils.addToConfig('#define PACKAGE "%s"' % PACKAGE, TOP_SRC_DIR)
+  utils.addToConfig('#define PACKAGE_VERSION "%s"' % PACKAGE_VERSION, TOP_SRC_DIR)
+  if DEVEL_VERSION:
+    utils.addToConfig('#define DEVEL_VERSION 1', TOP_SRC_DIR)
+
+  # ENABLE_ASSERTIONS
+  # ENABLE_NLS
+  # WITH_WARNINGS
+  # _GLIBCXX_CONCEPT_CHECKS
+
+  # items are (ENV, ARGUMENTS)
+  values = [
+    ('ENABLE_ASSERTIONS', 'assertions'),
+    ('ENABLE_NLS', 'nls'),
+    ('WITH_WARNINGS', 'warnings'),
+    ('_GLIBCXX_CONCEPT_CHECKS', 'concept_checks'),
+  ]
+
+  for val in values:
+    if (env.has_key(val[0]) and env[val[0]]) or \
+        ARGUMENTS.get(val[1]):
+      utils.addToConfig('#define %s 1' % val[0], TOP_SRC_DIR)
+    else:
+      utils.addToConfig('/* #undef %s */' % val[0], TOP_SRC_DIR)
+
+
+  env['EXTRA_LIBS'] = []
+  # HAVE_LIBAIKSAURUS
+  # AIKSAURUS_H_LOCATION
+  if conf.CheckLib('Aiksaurus'):
+    utils.addToConfig("#define HAVE_LIBAIKSAURUS 1", TOP_SRC_DIR)
+    if (conf.CheckCXXHeader("Aiksaurus.h")):
+      utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus.h>", TOP_SRC_DIR)
+    elif (conf.CheckCXXHeader("Aiksaurus/Aiksaurus.h")):
+      utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus/Aiksaurus.h>", TOP_SRC_DIR)
+    else:
+      utils.addToConfig("#define AIKSAURUS_H_LOCATION", TOP_SRC_DIR)
+    env['EXTRA_LIBS'].append('Aiksaurus')
+
+  # USE_ASPELL
+  # USE_PSPELL
+  # USE_ISPELL
+
+  # determine headers to use
+  spell_engine = ARGUMENTS.get('spell', 'auto')
+  spell_detected = False
+  if spell_engine in ['auto', 'aspell'] and \
+    conf.CheckLib('aspell'):
+    utils.addToConfig('#define USE_ASPELL 1', TOP_SRC_DIR)
+    env['USE_ASPELL'] = True
+    env['USE_PSPELL'] = False
+    env['USE_ISPELL'] = False
+    env['EXTRA_LIBS'].append('aspell')
+    spell_detected = True
+  elif spell_engine in ['auto', 'pspell'] and \
+    conf.CheckLib('pspell'):
+    utils.addToConfig('#define USE_PSPELL 1', TOP_SRC_DIR)
+    env['USE_ASPELL'] = False
+    env['USE_PSPELL'] = True
+    env['USE_ISPELL'] = False
+    env['EXTRA_LIBS'].append('pspell')
+    spell_detected = True
+  elif spell_engine in ['auto', 'ispell'] and \
+    conf.CheckLib('ispell'):
+    utils.addToConfig('#define USE_ISPELL 1', TOP_SRC_DIR)
+    env['USE_ASPELL'] = False
+    env['USE_PSPELL'] = False
+    env['USE_ISPELL'] = True
+    env['EXTRA_LIBS'].append('ispell')
+    spell_detected = True
+
+  if not spell_detected:
+    env['USE_ASPELL'] = False
+    env['USE_PSPELL'] = False
+    env['USE_ISPELL'] = False
+    # FIXME: can lyx work without an spell engine
+    if spell_engine == 'auto':
+      print "Warning: Can not locate any spell checker"
+    else:
+      print "Warning: Can not locate specified spell checker:", spell_engine
+
+  # env['EXTRA_LIBS'] will be modified later, so a unique copy is needed
+  # NOTE that we do *not* save qt_libs in environment.
+  env_cache['EXTRA_LIBS'] = copy.copy(env['EXTRA_LIBS'])
+  env_cache['USE_ASPELL'] = env['USE_ASPELL']
+  env_cache['USE_PSPELL'] = env['USE_PSPELL']
+  env_cache['USE_ISPELL'] = env['USE_ISPELL']
+
+  # USE_POSIX_PACKAGING
+  # USE_MACOSX_PACKAGING
+  # USE_WINDOWS_PACKAGING
+  if packaging_method == 'windows':
+    utils.addToConfig('#define USE_WINDOWS_PACKAGING 1', TOP_SRC_DIR)
+  elif packaging_method == 'posix':
+    utils.addToConfig('#define USE_POSIX_PACKAGING 1', TOP_SRC_DIR)
+  elif packaging_method == 'mac':
+    utils.addToConfig('#define USE_MACOSX_PACKAGING 1', TOP_SRC_DIR)
+
+  # BOOST_POSIX
+  if boost_posix:
+    utils.addToConfig('#define BOOST_POSIX 1', TOP_SRC_DIR)
   else:
-    utils.addToConfig('/* #undef %s */' % header[1], TOP_SRC_DIR)
-
-# HAVE_OPEN
-# HAVE_CLOSE
-# HAVE_POPEN
-# HAVE_PCLOSE
-# HAVE__OPEN
-# HAVE__CLOSE
-# HAVE__POPEN
-# HAVE__PCLOSE
-# HAVE_GETPID
-# HAVE__GETPID
-# HAVE_MKDIR
-# HAVE__MKDIR
-# HAVE_MKTEMP
-# HAVE_MKSTEMP
-# HAVE_STRERROR
-# HAVE_FCNTL
-
-# Check functions
-functions = [
-  ('open', 'HAVE_OPEN'),
-  ('close', 'HAVE_CLOSE'),
-  ('popen', 'HAVE_POPEN'),
-  ('pclose', 'HAVE_PCLOSE'),
-  ('_open', 'HAVE__OPEN'),
-  ('_close', 'HAVE__CLOSE'),
-  ('_popen', 'HAVE__POPEN'),
-  ('_pclose', 'HAVE__PCLOSE'),
-  ('getpid', 'HAVE_GETPID'),
-  ('_getpid', 'HAVE__GETPID'),
-  ('mkdir', 'HAVE_MKDIR'),
-  ('_mkdir', 'HAVE__MKDIR'),
-  ('mktemp', 'HAVE_MKTEMP'),
-  ('mkstemp', 'HAVE_MKSTEMP'),
-  ('strerror', 'HAVE_STRERROR'),
-  ('fcntl', 'HAVE_FCNTL')
-]
-
-for func in functions:
-  if conf.CheckFunc(func[0]):
-    utils.addToConfig('#define %s 1' % func[1], TOP_SRC_DIR)
+    utils.addToConfig('/* #undef BOOST_POSIX */', TOP_SRC_DIR)
+
+  # HAVE_PUTENV
+  if conf.CheckPutenv():
+    utils.addToConfig('#define HAVE_PUTENV 1', TOP_SRC_DIR)
   else:
-    utils.addToConfig('/* #undef %s */' % func[1], TOP_SRC_DIR)
-
-# PACKAGE
-# PACKAGE_VERSION
-# DEVEL_VERSION
-utils.addToConfig('#define PACKAGE "%s"' % PACKAGE, TOP_SRC_DIR)
-utils.addToConfig('#define PACKAGE_VERSION "%s"' % PACKAGE_VERSION, TOP_SRC_DIR)
-if DEVEL_VERSION:
-  utils.addToConfig('#define DEVEL_VERSION 1', TOP_SRC_DIR)
-
-# ENABLE_ASSERTIONS
-# ENABLE_NLS
-# WITH_WARNINGS
-# _GLIBCXX_CONCEPT_CHECKS
-
-# items are (ENV, ARGUMENTS)
-values = [
-  ('ENABLE_ASSERTIONS', 'assertions'),
-  ('ENABLE_NLS', 'nls'),
-  ('WITH_WARNINGS', 'warnings'),
-  ('_GLIBCXX_CONCEPT_CHECKS', 'concept_checks'),
-]
-
-for val in values:
-  if (env.has_key(val[0]) and env[val[0]]) or \
-      ARGUMENTS.get(val[1]):
-    utils.addToConfig('#define %s 1' % val[0], TOP_SRC_DIR)
+    utils.addToConfig('/* #undef HAVE_PUTENV */', TOP_SRC_DIR)
+
+  # HAVE_DECL_ISTREAMBUF_ITERATOR
+  if conf.CheckIstreambufIterator():
+    utils.addToConfig('#define HAVE_DECL_ISTREAMBUF_ITERATOR 1', TOP_SRC_DIR)
   else:
-    utils.addToConfig('/* #undef %s */' % val[0], TOP_SRC_DIR)
-
-
-env['EXTRA_LIBS'] = []
-# HAVE_LIBAIKSAURUS
-# AIKSAURUS_H_LOCATION
-if conf.CheckLib('Aiksaurus'):
-  utils.addToConfig("#define HAVE_LIBAIKSAURUS 1", TOP_SRC_DIR)
-  if (conf.CheckCXXHeader("Aiksaurus.h")):
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus.h>", TOP_SRC_DIR)
-  elif (conf.CheckCXXHeader("Aiksaurus/Aiksaurus.h")):
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus/Aiksaurus.h>", TOP_SRC_DIR)
+    utils.addToConfig('/* #undef HAVE_DECL_ISTREAMBUF_ITERATOR */', TOP_SRC_DIR)
+
+  # MKDIR_TAKES_ONE_ARG
+  if conf.CheckMkdirOneArg():
+    utils.addToConfig('#define MKDIR_TAKES_ONE_ARG 1', TOP_SRC_DIR)
   else:
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION", TOP_SRC_DIR)
-  env['EXTRA_LIBS'].append('Aiksaurus')
-
-# USE_ASPELL
-# USE_PSPELL
-# USE_ISPELL
-
-# determine headers to use
-spell_engine = ARGUMENTS.get('spell', 'auto')
-spell_detected = False
-if spell_engine in ['auto', 'aspell'] and \
-  conf.CheckLib('aspell'):
-  utils.addToConfig('#define USE_ASPELL 1', TOP_SRC_DIR)
-  env['USE_ASPELL'] = True
-  env['EXTRA_LIBS'].append('aspell')
-  spell_detected = True
-elif spell_engine in ['auto', 'pspell'] and \
-  conf.CheckLib('pspell'):
-  utils.addToConfig('#define USE_PSPELL 1', TOP_SRC_DIR)
-  env['USE_PSPELL'] = True
-  env['EXTRA_LIBS'].append('pspell')
-  spell_detected = True
-elif spell_engine in ['auto', 'ispell'] and \
-  conf.CheckLib('ispell'):
-  utils.addToConfig('#define USE_ISPELL 1', TOP_SRC_DIR)
-  env['USE_ISPELL'] = True
-  env['EXTRA_LIBS'].append('ispell')
-  spell_detected = True
-
-if not spell_detected:
-  # FIXME: can lyx work without an spell engine
-  if spell_engine == 'auto':
-    print "Warning: Can not locate any spell checker"
+    utils.addToConfig('/* #undef MKDIR_TAKES_ONE_ARG */', TOP_SRC_DIR)
+
+  # HAVE_STD_COUNT
+  if conf.CheckStdCount():
+    utils.addToConfig('#define HAVE_STD_COUNT 1', TOP_SRC_DIR)
   else:
-    print "Warning: Can not locate specified spell checker:", spell_engine
-
-# USE_POSIX_PACKAGING
-# USE_MACOSX_PACKAGING
-# USE_WINDOWS_PACKAGING
-if packaging_method == 'windows':
-  utils.addToConfig('#define USE_WINDOWS_PACKAGING 1', TOP_SRC_DIR)
-elif packaging_method == 'posix':
-  utils.addToConfig('#define USE_POSIX_PACKAGING 1', TOP_SRC_DIR)
-elif packaging_method == 'mac':
-  utils.addToConfig('#define USE_MACOSX_PACKAGING 1', TOP_SRC_DIR)
-
-# BOOST_POSIX
-if boost_posix:
-  utils.addToConfig('#define BOOST_POSIX 1', TOP_SRC_DIR)
-else:
-  utils.addToConfig('/* #undef BOOST_POSIX */', TOP_SRC_DIR)
+    utils.addToConfig('/* #undef HAVE_STD_COUNT */', TOP_SRC_DIR)
 
-# HAVE_PUTENV
-if conf.CheckPutenv():
-  utils.addToConfig('#define HAVE_PUTENV 1', TOP_SRC_DIR)
-else:
-  utils.addToConfig('/* #undef HAVE_PUTENV */', TOP_SRC_DIR)
-  
-# HAVE_DECL_ISTREAMBUF_ITERATOR
-if conf.CheckIstreambufIterator():
-  utils.addToConfig('#define HAVE_DECL_ISTREAMBUF_ITERATOR 1', TOP_SRC_DIR)
-else:
-  utils.addToConfig('/* #undef HAVE_DECL_ISTREAMBUF_ITERATOR */', TOP_SRC_DIR)
+  # SELECT_TYPE_ARG1
+  # SELECT_TYPE_ARG234
+  # SELECT_TYPE_ARG5
+  (arg1, arg234, arg5) = conf.CheckSelectArgType()
+  utils.addToConfig('#define SELECT_TYPE_ARG1 %s' % arg1, TOP_SRC_DIR)
+  utils.addToConfig('#define SELECT_TYPE_ARG234 %s' % arg234, TOP_SRC_DIR)
+  utils.addToConfig('#define SELECT_TYPE_ARG5 %s' % arg5, TOP_SRC_DIR)
 
-# MKDIR_TAKES_ONE_ARG
-if conf.CheckMkdirOneArg():
-  utils.addToConfig('#define MKDIR_TAKES_ONE_ARG 1', TOP_SRC_DIR)
-else:
-  utils.addToConfig('/* #undef MKDIR_TAKES_ONE_ARG */', TOP_SRC_DIR)
+  # mkstemp
+  # USE_BOOST_FORMAT
+  # WANT_GETFILEATTRIBUTESEX_WRAPPER
+  utils.endConfigH(TOP_SRC_DIR)
 
-# HAVE_STD_COUNT
-if conf.CheckStdCount():
-  utils.addToConfig('#define HAVE_STD_COUNT 1', TOP_SRC_DIR)
 else:
-  utils.addToConfig('/* #undef HAVE_STD_COUNT */', TOP_SRC_DIR)
-
-# SELECT_TYPE_ARG1
-# SELECT_TYPE_ARG234
-# SELECT_TYPE_ARG5
-(arg1, arg234, arg5) = conf.CheckSelectArgType()
-utils.addToConfig('#define SELECT_TYPE_ARG1 %s' % arg1, TOP_SRC_DIR)
-utils.addToConfig('#define SELECT_TYPE_ARG234 %s' % arg234, TOP_SRC_DIR)
-utils.addToConfig('#define SELECT_TYPE_ARG5 %s' % arg5, TOP_SRC_DIR)
-
-# mkstemp
-# USE_BOOST_FORMAT
-# WANT_GETFILEATTRIBUTESEX_WRAPPER
-utils.endConfigH(TOP_SRC_DIR)
+  # only a few variables need to be rescanned
+  env['EXTRA_LIBS'] = copy.copy(env_cache['EXTRA_LIBS'])
+  env['USE_ASPELL'] = env_cache['USE_ASPELL']
+  env['USE_PSPELL'] = env_cache['USE_PSPELL']
+  env['USE_ISPELL'] = env_cache['USE_ISPELL']
 
 #
 # Finish auto-configuration
 env = conf.Finish()
 
 #----------------------------------------------------------
-# Now set up our build process accordingly 
+# Now set up our build process accordingly
 #----------------------------------------------------------
 
 #
@@ -779,38 +846,42 @@ try:
   if frontend == 'qt3':
     # note: env.Tool('qt') my set QT_LIB to qt
     env['QT_LIB'] = 'qt-mt'
-    env['EXTRA_LIBS'] += ['qt-mt']
+    env['EXTRA_LIBS'].append('qt-mt')
     if platform_name == 'cygwin' and use_X11:
-      env['EXTRA_LIBS'] += ['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
+      env['EXTRA_LIBS'].extend(['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
         'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv',
-        'pthread']
+        'pthread'])
       env.AppendUnique(LIBPATH = ['/usr/X11R6/lib'])
   elif frontend == 'qt4':
-    # local qt4 toolset from 
-    # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
     if platform_name == "win32":
       env['QT_LIB'] = ['QtCore4', 'QtGui4']
     else:
       env['QT_LIB'] = ['QtCore', 'QtGui']
-    env['EXTRA_LIBS'] += [x for x in env['QT_LIB']]
+    env['EXTRA_LIBS'] += env['QT_LIB']
 except:
   print "Can not locate qt tools"
   print "What I get is "
   print "  QTDIR: ", env['QTDIR']
 
-if platform_name in ['win32', 'cygwin']:\r
-  env['SYSTEM_LIBS'] = ['shlwapi', 'z']
+
+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++']
 else:
   env['SYSTEM_LIBS'] = ['z']
 
 #
 # Build parameters CPPPATH etc
 #
-# boost is always in
-env.AppendUnique(CPPPATH = ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src'])
+# boost is always in, src is needed for config.h
+# 
+# Note that previously added QT_DIR/include etc is removed
+# they will be added when processing for example src/qt3
+env['CPPPATH'] = ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src']
 
 # TODO: add (more) appropriate compiling options (-DNDEBUG etc)
-# for debug/release mode 
+# for debug/release mode
 if ARGUMENTS.get('mode', default_build_mode) == 'debug':
   env.AppendUnique(CCFLAGS = [])
 else:
@@ -829,20 +900,22 @@ env['BUILDERS']['fileCopy'] = Builder(action = utils.env_filecopy)
 # http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
 # http://www.cygwin.com/ml/cygwin-apps/2004-09/msg00309.html
 # for details
-# 
-if platform_name == 'cygwin' and env['frontend'] == 'qt3':
+#
+if platform_name == 'cygwin':
   ld_script_path = '/usr/lib/qt3/mkspecs/cygwin-g++'
   ld_script = utils.installCygwinLDScript(ld_script_path)
-  env.AppendUnique(LINKFLAGS = ['-Wl,--enable-runtime-pseudo-reloc', 
+  env.AppendUnique(LINKFLAGS = ['-Wl,--enable-runtime-pseudo-reloc',
     '-Wl,--script,%s' % ld_script, '-Wl,-s'])
 
 #
 # Report results
 #
 # src/support/package.C.in needs the following to replace
-env['LYX_DIR'] = LYX_DIR
-env['LOCALEDIR'] = LOCALEDIR
-env['TOP_SRCDIR'] = str(Dir('#'))
+#  LYX_ABS_INSTALLED_DATADIR (e.g. /usr/local/lyx/share/lyx)
+env['LYX_DIR'] = env['SHARE_DIR']
+#  LYX_ABS_INSTALLED_LOCALEDIR
+env['LOCALEDIR'] = env['LOCALE_DIR']
+env['TOP_SRCDIR'] = env['TOP_SRC_DIR']
 env['PROGRAM_SUFFIX'] = PROGRAM_SUFFIX
 # needed by src/version.C.in => src/version.C
 env['PACKAGE_VERSION'] = PACKAGE_VERSION
@@ -857,19 +930,19 @@ env['VERSION_INFO'] = '''Configuration
   C++ Compiler flags:             %s %s
   Linker flags:                   %s
   Linker user flags:              %s
-Build info: 
+Build info:
   Builing directory:              %s
   Local library directory:        %s
   Libraries pathes:               %s
   Boost libraries:                %s
   Extra libraries:                %s
   System libraries:               %s
-Frontend: 
+Frontend:
   Frontend:                       %s
   Packaging:                      %s
   LyX binary dir:                 FIXME
   LyX files dir:                  FIXME
-''' % (platform_name, 
+''' % (platform_name,
   env.subst('$CCFLAGS'), env.subst('$CC'),
   env.subst('$CPPFLAGS'), env.subst('$CFLAGS'),
   env.subst('$CXX'), env.subst('$CXXFLAGS'),
@@ -886,42 +959,48 @@ if env['frontend'] in ['qt3', 'qt4']:
   X11:                            %s
 ''' % (env.subst('$QT_INC_PATH'), env.subst('$QT_LIB_PATH'), use_X11)
 
-print env['VERSION_INFO']
+if not fast_start:
+  print env['VERSION_INFO']
 
 #
-# Mingw command line may be too short for our link usage, 
+# Mingw command line may be too short for our link usage,
 # Here we use a trick from scons wiki
 # http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/LongCmdLinesOnWin32
 #
 # I also would like to add logging (commands only) capacity to the
-# spawn system. 
-logfile = ARGUMENTS.get('logfile', default_log_file)
+# spawn system.
+logfile = env.get('logfile', default_log_file)
 if logfile != '' or platform_name == 'win32':
   import time
   utils.setLoggedSpawn(env, logfile, longarg = (platform_name == 'win32'),
     info = '''# This is a log of commands used by scons to build lyx
-# Time: %s 
+# Time: %s
 # Command: %s
 # Info: %s
-''' % (time.asctime(), ' '.join(sys.argv), 
+''' % (time.asctime(), ' '.join(sys.argv),
   env['VERSION_INFO'].replace('\n','\n# ')) )
 
 
 #
 # Cleanup stuff
 #
-# save options
-opts.Save('options.cache', env)
 # -h will print out help info
 Help(opts.GenerateHelpText(env))
-
+# save environment settings (for fast_start option)
+cache_file = open(env_cache_file, 'w')
+cPickle.dump(env_cache, cache_file)
+cache_file.close()
 
 #----------------------------------------------------------
 # Start building
 #----------------------------------------------------------
 Export('env')
 
-SConsignFile(os.path.abspath('%s/sconsign' % env['BUILDDIR']))
+# this has been the source of problem on some platforms...
+# needs more testing
+env.SConsignFile('%s/.sconsign' % env['BUILDDIR'][1:])
+# this usage needs further investigation.
+#env.CacheDir('%s/Cache/%s' % (env['BUILDDIR'], frontend))
 
 env['BUILD_TARGETS'] = BUILD_TARGETS
 
index 2427b173f2d4a6cdfecfcc6ce0627c315cf73cf7..6cb37c670e8c33b69bb23a254c975a5cadf0a019 100644 (file)
@@ -292,40 +292,15 @@ def checkBoostLibraries(conf, lib, pathes):
   return ('','')
 
 
-import SCons.Node
-def processLang(env, folder):
-  """ Process translations (.po files) in a po/ dir 
-    This is copied from KDE knetstats-1.5/admin/kde.py
-
-       FIXME: imcomplete
-  """
-  import glob
-  dir=SCons.Node.FS.default_fs.Dir(folder).srcnode()
-  fld=dir.srcnode()
-  tmptransfiles = glob.glob(str(fld)+'/*.po')
-  
-  transfiles=[]
-  if env.has_key('_BUILDDIR_'):
-    bdir=env['_BUILDDIR_']
-    for dir in env.make_list(tmptransfiles):
-      transfiles.append( env.join(bdir, dir) )
-  else: 
-    transfiles=tmptransfiles
-
-  env['MSGFMT'] = 'msgfmt'
-  env['BUILDERS']['Transfiles']=SCons.Builder.Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
-  languages=None
-  # FIXME: KDE has this ARGS thing...
-  #if env['ARGS'] and env['ARGS'].has_key('languages'):
-  #  languages=env.make_list(env['ARGS']['languages'])
-  mydir=SCons.Node.FS.default_fs.Dir('.')
-  for f in transfiles:
-    fname=f.replace(mydir.abspath, '')
-    file=SCons.Node.FS.default_fs.File(fname)
-    country = SCons.Util.splitext(file.name)[0]
-    if not languages or country in languages:
-      result = env.Transfiles(file)
-  # FIXME
+def checkMsgFmt(conf):
+  ''' check the existence of command msgfmt '''
+  conf.Message('Checking for gettext command msgfmt...')
+  res = conf.TryAction('msgfmt --help')
+  conf.Result(res[0])
+  if res[0]:
+    return 'msgfmt'
+  else:
+    return None
 
 
 def installCygwinLDScript(path):