]> git.lyx.org Git - features.git/commitdiff
Scons-build system moves to development/scons, from Bo Peng (ben.bob@gmail.com)
authorBo Peng <bpeng@lyx.org>
Wed, 10 May 2006 21:53:31 +0000 (21:53 +0000)
committerBo Peng <bpeng@lyx.org>
Wed, 10 May 2006 21:53:31 +0000 (21:53 +0000)
* remove SConstruct config/scons_utils.py config/qt4.py
* add development/scons/qt4.py SConscript SConstruct scons_utils.py

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13829 a592a061-630c-0410-9148-cb99ea01b6c8

SConstruct [deleted file]
config/qt4.py [deleted file]
config/scons_utils.py [deleted file]
development/scons/SConscript [new file with mode: 0644]
development/scons/SConstruct [new file with mode: 0644]
development/scons/qt4.py [new file with mode: 0644]
development/scons/scons_utils.py [new file with mode: 0644]

diff --git a/SConstruct b/SConstruct
deleted file mode 100644 (file)
index 89e05ab..0000000
+++ /dev/null
@@ -1,1844 +0,0 @@
-# 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)
-#  
-#    scons [frontend=qt3|gt4] [boost=included|auto] ...
-#
-# Where:
-#   * use scons -h for details about parameters
-#   * qt3 is used by default on linux, cygwin and mac
-#   * qt4 is used by default on win32
-#
-# File layouts (Important):
-#   * Unless you specify builddir=dir, building will happen
-#     in $BUILDDIR = $mode/$platform-$frontend. E.g., something like
-#       debug/linux-qt3/
-#   * All shared libs will be put in $BUILDDIR/libs, e.g.
-#       debug/linux-qt3/libs
-#   * lyx executable will be in directories like debug/linux-qt3
-#  
-# Hints:
-#   * 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)
-#
-#   * (Important) use scons logfile=logfile.log to enable command line
-#     logging. (default is no logging)
-#
-# 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
-#       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
-#
-#   * rpm support?
-#     http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/RpmHonchoTemp
-#
-#   However, I decide to wait since scons seems to be standardizing these
-#   features.
-#
-
-import os, sys
-
-# 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
-#----------------------------------------------------------
-
-# FIXME: I remember lyx requires higher version of python?
-EnsurePythonVersion(1, 5)
-# Please use at least 0.96.91 (not 0.96.1)
-EnsureSConsVersion(0, 96)
-
-#----------------------------------------------------------
-# Global definitions
-#----------------------------------------------------------
-
-# some global settings
-PACKAGE_VERSION = '1.5.0svn'
-DEVEL_VERSION = True
-default_build_mode = 'debug'
-
-PACKAGE = 'lyx'
-PACKAGE_BUGREPORT = 'lyx-devel@lists.lyx.org'
-PACKAGE_NAME = 'LyX'
-PACKAGE_TARNAME = 'lyx'
-PACKAGE_STRING = '%s %s' % (PACKAGE_NAME, PACKAGE_VERSION)
-PROGRAM_SUFFIX = ''
-default_log_file = 'scons_lyx.log'
-
-# 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.
-#
-if os.name == 'nt':
-  platform_name = 'win32'
-  default_frontend = 'qt4'
-  # boost and gettext are unlikely to be installed already
-  default_boost_opt = 'included'
-  default_gettext_opt = 'included'
-  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).
-  # If not specified, boost tries to figure out by itself, but it may fail.
-  boost_posix = False
-  packaging_method = 'windows'
-elif os.name == 'posix' and sys.platform != 'cygwin':
-  platform_name = sys.platform
-  default_frontend = 'qt3'
-  # try to use system boost/gettext libraries
-  default_boost_opt = 'auto'
-  default_gettext_opt = 'auto'
-  default_pch_opt = False
-  default_with_x = True
-  boost_posix = True
-  packaging_method = 'posix'
-elif os.name == 'posix' and sys.platform == 'cygwin':
-  platform_name = 'cygwin'
-  default_frontend = 'qt3'
-  # force the use of cygwin/boost/gettext
-  default_boost_opt = 'system'
-  default_gettext_opt = 'system'
-  default_pch_opt = False
-  default_with_x = True
-  boost_posix = True
-  packaging_method = 'posix'
-elif os.name == 'darwin':
-  platform_name = 'mac'
-  default_frontend = 'qt3'
-  # to be safe
-  default_boost_opt = 'included'
-  default_gettext_opt = 'included'
-  default_pch_opt = False
-  default_with_x = False
-  boost_posix = True
-  packaging_method = 'msc'
-else:  # unsupported system
-  platform_name = 'others'
-  default_frontend = 'qt3'
-  # to be safe
-  default_boost_opt = 'included'
-  default_gettext_opt = 'included'
-  default_pch_opt = False
-  default_with_x = True
-  boost_posix = False
-  packaging_method = 'posix'
-
-#---------------------------------------------------------
-# 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.AddOptions(
-  # 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.', 
-    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', 
-    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', '.'),
-  # 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
-  BoolOption('assertions', 'Use assertions', True),
-  # enable warning, (config.h has  WITH_WARNINGS)
-  BoolOption('warnings', 'Use warnings', True),
-  # 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),
-  # FIXME: not implemented
-  PathOption('prefix', '(NA) install architecture-independent files in PREFIX', '.'),
-  # FIXME: not implemented
-  PathOption('exec_prefix', '(NA) 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),
-  # FIXME: not implemented
-  PathOption('intl_prefix', '(NA) Path to intl library', '.'),
-  # 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', ''),
-)  
-
-# Determine the frontend to use
-frontend = ARGUMENTS.get('frontend', default_frontend)
-use_X11 = ARGUMENTS.get('X11', default_with_x)
-
-#---------------------------------------------------------
-# Setting up environment
-#---------------------------------------------------------
-
-env = Environment(
-  options = opts 
-)
-
-# set environment since I do not really like ENV = os.environ
-env['ENV']['PATH'] = os.environ.get('PATH')
-env['ENV']['HOME'] = os.environ.get('HOME')
-# speed up source file processing
-#env['CPPSUFFIXES'] = ['.C', '.cc', '.cpp']
-#env['CXXSUFFIX'] = ['.C']
-
-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  
-  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])
-
-getEnvVariable(env, 'CC')
-getEnvVariable(env, 'CPP')
-getEnvVariable(env, 'CXX')
-getEnvVariable(env, 'CXXCPP')
-getEnvVariable(env, 'CCFLAGS')
-getEnvVariable(env, 'CXXFLAGS')
-getEnvVariable(env, 'CPPFLAGS')
-getEnvVariable(env, 'CPPPATH')
-getEnvVariable(env, 'LDFLAGS')
-
-env['TOP_SRC_DIR'] = Dir('.').abspath
-
-# 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
-if platform_name in ['win32', 'cygwin']:
-  env['CC'] = 'g++'
-  env['LINK'] = 'g++'
-
-#
-# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
-# 
-env['frontend'] = frontend
-env['mode'] = ARGUMENTS.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 
-# $mode can be debug or release
-if ARGUMENTS.has_key('build_dir'):
-  build_dir = ARGUMENTS['build_dir']
-  env['BUILDDIR'] = build_dir
-else:
-  # Determine the name of the build (platform+frontend
-  build_dir = '%s-%s' % (platform_name, frontend)
-  if use_X11 and platform_name == 'cygwin':
-    build_dir += '-X11'
-  env['BUILDDIR'] = os.path.join(env['mode'], build_dir)
-# all built libraries will go to build_dir/libs
-# (This is different from the make file approach)
-env['LOCALLIBPATH'] = '#$BUILDDIR/libs'
-env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
-
-#
-# QTDIR, QT_LIB_PATH, QT_INC_PATH
-#
-if platform_name == 'win32':
-  env.Tool('mingw')
-
-if ARGUMENTS.has_key('qt_dir'):
-  env['QTDIR'] = ARGUMENTS['qt_dir']
-  # add path to the qt tools
-  env.AppendUnique(LIBPATH = [os.path.join(ARGUMENTS['qt_dir'], 'lib')])
-  env.AppendUnique(CPPPATH = [os.path.join(ARGUMENTS['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(ARGUMENTS['qt_dir'], 'bin'))
-else:
-  env['QTDIR'] = os.environ.get('QTDIR', '/usr/lib/qt-3.3')
-
-if ARGUMENTS.has_key('qt_lib_path'):
-  env['QT_LIB_PATH'] = ARGUMENTS['qt_lib_path']
-else:
-  env['QT_LIB_PATH'] = '$QTDIR/lib'
-env.AppendUnique(LIBPATH = ['$QT_LIB_PATH'])
-# qt4 seems to be using pkg_config
-env.PrependENVPath('PKG_CONFIG_PATH', env.subst('$QT_LIB_PATH'))
-
-if ARGUMENTS.has_key('qt_inc_path'):
-  env['QT_INC_PATH'] = ARGUMENTS['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'])  
-
-#
-# extra_inc_path and extra_lib_path
-#
-if ARGUMENTS.has_key('extra_inc_path'):
-  env.AppendUnique(CPPPATH = [ARGUMENTS['extra_inc_path']])
-if ARGUMENTS.has_key('extra_lib_path'):
-  env.AppendUnique(LIBPATH = [ARGUMENTS['extra_lib_path']])
-if ARGUMENTS.has_key('extra_inc_path1'):
-  env.AppendUnique(CPPPATH = [ARGUMENTS['extra_inc_path1']])
-if ARGUMENTS.has_key('extra_lib_path1'):
-  env.AppendUnique(LIBPATH = [ARGUMENTS['extra_lib_path1']])
-if ARGUMENTS.has_key('aikasurus_path'):
-  env.AppendUnique(LIBPATH = [ARGUMENTS['aikasurus_path']])
-
-#
-# this is a bit out of place (after auto-configration)
-# but it is required to do the tests.
-if platform_name == 'win32':
-  env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
-
-#----------------------------------------------------------
-# Autoconf business 
-#----------------------------------------------------------
-
-conf = Configure(env,
-  custom_tests = {
-    'CheckPkgConfig' : utils.checkPkgConfig,
-    'CheckPackage' : utils.checkPackage,
-    'CheckPutenv' : utils.checkPutenv,
-    'CheckIstreambufIterator' : utils.checkIstreambufIterator,
-    'CheckMkdirOneArg' : utils.checkMkdirOneArg,
-    'CheckStdCount' : utils.checkStdCount,
-    'CheckSelectArgType' : utils.checkSelectArgType,
-    'CheckBoostLibraries' : utils.checkBoostLibraries,
-  }
-)
-
-# pkg-config? (if not, we use hard-coded options)
-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
-
-# zlib? This is required.
-if 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':
-  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', 'Qt3Support']:
-      # 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
-env['socket_libs'] = []
-if conf.CheckLib('socket'):
-  env.AppendUnique(socket_libs = ['socket'])
-
-# FIXME: What is nsl, is it related to socket?
-if conf.CheckLib('nsl'):
-  env.AppendUnique(socket_libs = ['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
-# 
-
-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()
-
-# 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])
-  else:
-    utils.addToConfig('/* #undef %s */' % header[1])
-
-# 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
-
-# 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')
-]
-
-for func in functions:
-  if conf.CheckFunc(func[0]):
-    utils.addToConfig('#define %s 1' % func[1])
-  else:
-    utils.addToConfig('/* #undef %s */' % func[1])
-
-# PACKAGE
-# PACKAGE_VERSION
-# DEVEL_VERSION
-utils.addToConfig('#define PACKAGE "%s"' % PACKAGE)
-utils.addToConfig('#define PACKAGE_VERSION "%s"' % PACKAGE_VERSION)
-if DEVEL_VERSION:
-  utils.addToConfig('#define DEVEL_VERSION 1')
-
-# 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])
-  else:
-    utils.addToConfig('/* #undef %s */' % val[0])
-
-
-env['EXTRA_LIBS'] = []
-# HAVE_LIBAIKSAURUS
-# AIKSAURUS_H_LOCATION
-if conf.CheckLib('Aiksaurus'):
-  utils.addToConfig("#define HAVE_LIBAIKSAURUS 1")
-  if (conf.CheckCXXHeader("Aiksaurus.h")):
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus.h>")
-  elif (conf.CheckCXXHeader("Aiksaurus/Aiksaurus.h")):
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION <Aiksaurus/Aiksaurus.h>")
-  else:
-    utils.addToConfig("#define AIKSAURUS_H_LOCATION")
-  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')
-  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')
-  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')
-  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"
-  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')
-elif packaging_method == 'posix':
-  utils.addToConfig('#define USE_POSIX_PACKAGING 1')
-elif packaging_method == 'mac':
-  utils.addToConfig('#define USE_MACOSX_PACKAGING 1')
-
-# BOOST_POSIX
-if boost_posix:
-  utils.addToConfig('#define BOOST_POSIX 1')
-else:
-  utils.addToConfig('/* #undef BOOST_POSIX */')
-
-# HAVE_PUTENV
-if conf.CheckPutenv():
-  utils.addToConfig('#define HAVE_PUTENV 1')
-else:
-  utils.addToConfig('/* #undef HAVE_PUTENV */')
-  
-# HAVE_DECL_ISTREAMBUF_ITERATOR
-if conf.CheckIstreambufIterator():
-  utils.addToConfig('#define HAVE_DECL_ISTREAMBUF_ITERATOR 1')
-else:
-  utils.addToConfig('/* #undef HAVE_DECL_ISTREAMBUF_ITERATOR */')
-
-# MKDIR_TAKES_ONE_ARG
-if conf.CheckMkdirOneArg():
-  utils.addToConfig('#define MKDIR_TAKES_ONE_ARG 1')
-else:
-  utils.addToConfig('/* #undef MKDIR_TAKES_ONE_ARG */')
-
-# HAVE_STD_COUNT
-if conf.CheckStdCount():
-  utils.addToConfig('#define HAVE_STD_COUNT 1')
-else:
-  utils.addToConfig('/* #undef HAVE_STD_COUNT */')
-
-# SELECT_TYPE_ARG1
-# SELECT_TYPE_ARG234
-# SELECT_TYPE_ARG5
-(arg1, arg234, arg5) = conf.CheckSelectArgType()
-utils.addToConfig('#define SELECT_TYPE_ARG1 %s' % arg1)
-utils.addToConfig('#define SELECT_TYPE_ARG234 %s' % arg234)
-utils.addToConfig('#define SELECT_TYPE_ARG5 %s' % arg5)
-
-# mkstemp
-# USE_BOOST_FORMAT
-# WANT_GETFILEATTRIBUTESEX_WRAPPER
-utils.endConfigH()
-
-#
-# Finish auto-configuration
-env = conf.Finish()
-
-#----------------------------------------------------------
-# Now set up our build process accordingly 
-#----------------------------------------------------------
-
-#
-# QT_LIB etc (EXTRA_LIBS holds lib for each frontend)
-#
-# NOTE: Tool('qt') or Tool('qt4') will be loaded later
-# in their respective directory and specialized env.
-try:
-  if frontend == 'qt3':
-    # note: env.Tool('qt') my set QT_LIB to qt
-    env['QT_LIB'] = 'qt-mt'
-    env['EXTRA_LIBS'] += ['qt-mt']
-    if platform_name == 'cygwin' and use_X11:
-      env['EXTRA_LIBS'] += ['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
-        'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv',
-        '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', 'Qt3Support4']
-    else:
-      env['QT_LIB'] = ['QtCore', 'QtGui', 'Qt3Support']
-    env['EXTRA_LIBS'] += [x for x in env['QT_LIB']]
-except:
-  print "Can not locate qt tools"
-  print "What I get is "
-  print "  QTDIR: ", env['QTDIR']
-
-if platform_name == 'win32':
-  env['SYSTEM_LIBS'] = ['shlwapi', 'zlib1']
-elif platform_name == 'cygwin':
-  env['SYSTEM_LIBS'] = ['shlwapi', 'z']
-else:
-  env['SYSTEM_LIBS'] = ['z']
-
-#
-# Build parameters CPPPATH etc
-#
-# boost is always in
-env.AppendUnique(CPPPATH = ['#boost', '#src'])
-
-# TODO: add (more) appropriate compiling options (-DNDEBUG etc)
-# for debug/release mode 
-if ARGUMENTS.get('mode', default_build_mode) == 'debug':
-  env.AppendUnique(CCFLAGS = [])
-else:
-  env.AppendUnique(CCFLAGS = [])
-
-#
-# Customized builders
-#
-# install customized builders
-env['BUILDERS']['substFile'] = Builder(action = utils.env_subst)
-# FIXME: there must be a better way.
-env['BUILDERS']['fileCopy'] = Builder(action = utils.env_filecopy)
-
-#
-# A Link script for cygwin see
-# 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':
-  ld_script_path = '/usr/lib/qt3/mkspecs/cygwin-g++'
-  ld_script = utils.installCygwinLDScript(ld_script_path)
-  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('#'))
-env['PROGRAM_SUFFIX'] = PROGRAM_SUFFIX
-# needed by src/version.C.in => src/version.C
-env['PACKAGE_VERSION'] = PACKAGE_VERSION
-# fill in the version info
-env['VERSION_INFO'] = '''Configuration
-  Host type:                      %s
-  Special build flags:            %s
-  C   Compiler:                   %s
-  C   Compiler flags:             %s %s
-  C++ Compiler:                   %s
-  C++ Compiler LyX flags:         %s
-  C++ Compiler flags:             %s %s
-  Linker flags:                   %s
-  Linker user flags:              %s
-Build info: 
-  Builing directory:              %s
-  Local library directory:        %s
-  Libraries pathes:               %s
-  Boost libraries:                %s
-  Extra libraries:                %s
-  System libraries:               %s
-Frontend: 
-  Frontend:                       %s
-  Packaging:                      %s
-  LyX binary dir:                 FIXME
-  LyX files dir:                  FIXME
-''' % (platform_name, 
-  env.subst('$CCFLAGS'), env.subst('$CC'),
-  env.subst('$CPPFLAGS'), env.subst('$CFLAGS'),
-  env.subst('$CXX'), env.subst('$CXXFLAGS'),
-  env.subst('$CPPFLAGS'), env.subst('$CXXFLAGS'),
-  env.subst('$LINKFLAGS'), env.subst('$LINKFLAGS'),
-  env.subst('$BUILDDIR'), env.subst('$LOCALLIBPATH'),
-  str(env['LIBPATH']), str(env['BOOST_LIBRARIES']),
-  str(env['EXTRA_LIBS']), str(env['SYSTEM_LIBS']),
-  env['frontend'], packaging_method)
-
-if env['frontend'] in ['qt3', 'qt4']:
-  env['VERSION_INFO'] += '''  include dir:                    %s
-  library dir:                    %s
-  X11:                            %s
-''' % (env.subst('$QT_INC_PATH'), env.subst('$QT_LIB_PATH'), use_X11)
-
-print env['VERSION_INFO']
-
-#
-# 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)
-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 
-# Command: %s
-# Info: %s
-''' % (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))
-
-
-
-#----------------------------------------------------------
-# Start building
-#----------------------------------------------------------
-#Export('env')
-SConsignFile(os.path.abspath('%s/sconsign' % env['BUILDDIR']))
-BuildDir('#$BUILDDIR', 'src', duplicate = 0)
-env.BuildDir('#$BUILDDIR', 'src', duplicate = 0)
-print "Building all targets recursively"
-
-print "Entering src/support"
-
-env.Append(CPPPATH = ['.'])
-
-env['SUBST_KEYS'] = ['LYX_DIR', 'LOCALEDIR', 'TOP_SRCDIR', 'PROGRAM_SUFFIX']
-env.substFile('#$BUILDDIR/support/package.C', 'src/support/package.C.in')
-
-supports = env.StaticLibrary(
-  target = '$LOCALLIBPATH/supports',
-  source = map(lambda a: '#$BUILDDIR/support/%s' % a, Split('''
-    FileMonitor.C
-    abort.C
-    chdir.C
-    convert.C
-    copy.C
-    environment.C
-    filefilterlist.C
-    filename.C
-    filetools.C
-    forkedcall.C
-    forkedcallqueue.C
-    forkedcontr.C
-    fs_extras.C
-    getcwd.C
-    kill.C
-    lstrings.C
-    lyxtime.C
-    lyxsum.C
-    mkdir.C
-    os.C
-    path.C
-    package.C
-    rename.C
-    socktools.C
-    systemcall.C
-    tempname.C
-    userinfo.C
-    unlink.C
-  '''))
-)
-
-print "Entering src/mathed"
-
-mathed = env.StaticLibrary(
-  target = '$LOCALLIBPATH/mathed',
-  source = map(lambda a: "#$BUILDDIR/mathed/%s" % a, Split('''
-    textpainter.C
-    math_amsarrayinset.C
-    math_arrayinset.C
-    math_atom.C
-    math_autocorrect.C
-    math_biginset.C
-    math_binominset.C
-    math_boldsymbolinset.C
-    math_boxinset.C
-    math_boxedinset.C
-    math_braceinset.C
-    math_casesinset.C
-    math_charinset.C
-    math_colorinset.C
-    math_commentinset.C
-    math_data.C
-    math_decorationinset.C
-    math_deliminset.C
-    math_dfracinset.C
-    math_diffinset.C
-    math_diminset.C
-    math_dotsinset.C
-    math_envinset.C
-    math_extern.C
-    math_exfuncinset.C
-    math_exintinset.C
-    math_factory.C
-    math_fboxinset.C
-    math_frameboxinset.C
-    math_fontinset.C
-    math_fontoldinset.C
-    math_fracinset.C
-    math_fracbase.C
-    math_gridinset.C
-    math_hullinset.C
-    math_inset.C
-    math_kerninset.C
-    math_lefteqninset.C
-    math_liminset.C
-    math_macro.C
-    math_macroarg.C
-    math_macrotemplate.C
-    math_macrotable.C
-    math_makeboxinset.C
-    math_mathmlstream.C
-    math_matrixinset.C
-    math_nestinset.C
-    math_numberinset.C
-    math_oversetinset.C
-    math_parinset.C
-    math_parser.C
-    math_phantominset.C
-    math_rootinset.C
-    math_scriptinset.C
-    math_sizeinset.C
-    math_spaceinset.C
-    math_splitinset.C
-    math_sqrtinset.C
-    math_stackrelinset.C
-    math_streamstr.C
-    math_stringinset.C
-    math_substackinset.C
-    math_support.C
-    math_symbolinset.C
-    math_tabularinset.C
-    math_tfracinset.C
-    math_unknowninset.C
-    math_undersetinset.C
-    math_xarrowinset.C
-    math_xymatrixinset.C
-    command_inset.C
-    ref_inset.C
-  '''))
-)
-
-print "Entering src/insets"
-
-insets = env.StaticLibrary(
-  target = '$LOCALLIBPATH/insets',
-  source = map(lambda a: "#$BUILDDIR/insets/%s" % a, Split('''
-    mailinset.C
-    ExternalSupport.C
-    ExternalTemplate.C
-    ExternalTransforms.C
-    render_button.C
-    render_graphic.C
-    render_preview.C
-    inset.C
-    insetbase.C
-    insetbibitem.C
-    insetbibtex.C
-    insetbox.C
-    insetbranch.C
-    insetcaption.C
-    insetcharstyle.C
-    insetcite.C
-    insetcollapsable.C
-    insetcommand.C
-    insetcommandparams.C
-    insetenv.C
-    insetert.C
-    insetexternal.C
-    insetfloat.C
-    insetfloatlist.C
-    insetfoot.C
-    insetfootlike.C
-    insetgraphicsParams.C
-    insetgraphics.C
-    insethfill.C
-    insetinclude.C
-    insetindex.C
-    insetlabel.C
-    insetlatexaccent.C
-    insetline.C
-    insetmarginal.C
-    insetnewline.C
-    insetnote.C
-    insetoptarg.C
-    insetpagebreak.C
-    insetquotes.C
-    insetref.C
-    insetspace.C
-    insetspecialchar.C
-    insettabular.C
-    insettext.C
-    insettoc.C
-    inseturl.C
-    insetvspace.C
-    insetwrap.C
-  '''))
-)
-
-print "Entering src/frontends"
-
-frontends = env.StaticLibrary(
-  target = '$LOCALLIBPATH/frontends',
-  source = map(lambda a: "#$BUILDDIR/frontends/%s" % a, Split('''
-    Alert.C
-    Dialogs.C
-    LyXView.C
-    Painter.C
-    Timeout.C
-    Toolbars.C
-    guiapi.C
-    nullpainter.C
-    screen.C
-    screen.h
-  '''))
-)
-
-print "Entering src/frontends/qt3"
-
-qtenv = env.Copy()
-
-# load qt3 tools
-qtenv.Tool('qt')
-
-qtenv.Append(CPPPATH = [
-  '#$BUILDDIR',
-  '#$BUILDDIR/frontends',
-  '#$BUILDDIR/images',
-  '#$BUILDDIR/frontends/controllers',
-  '#$BUILDDIR/frontends/qt3',
-  '$QT_INC_DIR',
-  '.']
-)
-
-ui_files = Split('''
-  BiblioModuleBase.ui
-  BranchesModuleBase.ui
-  BulletsModuleBase.ui
-  TextLayoutModuleBase.ui
-  LanguageModuleBase.ui
-  LaTeXModuleBase.ui
-  MarginsModuleBase.ui
-  NumberingModuleBase.ui
-  MathsModuleBase.ui
-  PageLayoutModuleBase.ui
-  PreambleModuleBase.ui
-  QAboutDialogBase.ui
-  QAskForTextDialog.ui
-  QBibitemDialogBase.ui
-  QBibtexDialogBase.ui
-  QBibtexAddDialogBase.ui
-  QBoxDialogBase.ui
-  QBranchDialogBase.ui
-  QChangesDialogBase.ui
-  QCharacterDialogBase.ui
-  QCitationDialogBase.ui
-  QCitationFindDialogBase.ui
-  QDelimiterDialogBase.ui
-  QDocumentDialogBase.ui
-  QErrorListDialogBase.ui
-  QERTDialogBase.ui
-  QExternalDialogBase.ui
-  QFloatDialogBase.ui
-  QGraphicsDialogBase.ui
-  QIncludeDialogBase.ui
-  QIndexDialogBase.ui
-  QLogDialogBase.ui
-  QViewSourceDialogBase.ui
-  QMathDialogBase.ui
-  QMathMatrixDialogBase.ui
-  QNoteDialogBase.ui
-  QParagraphDialogBase.ui
-  QPrefAsciiModule.ui
-  QPrefColorsModule.ui
-  QPrefConvertersModule.ui
-  QPrefCopiersModule.ui
-  QPrefCygwinPathModule.ui
-  QPrefDateModule.ui
-  QPrefDisplayModule.ui
-  QPrefFileformatsModule.ui
-  QPrefIdentityModule.ui
-  QPrefKeyboardModule.ui
-  QPrefLanguageModule.ui
-  QPrefLatexModule.ui
-  QPrefPathsModule.ui
-  QPrefPrinterModule.ui
-  QPrefScreenFontsModule.ui
-  QPrefsDialogBase.ui
-  QPrefSpellcheckerModule.ui
-  QPrefUIModule.ui
-  QPrintDialogBase.ui
-  QRefDialogBase.ui
-  QSearchDialogBase.ui
-  QSendtoDialogBase.ui
-  QShowFileDialogBase.ui
-  QSpellcheckerDialogBase.ui
-  QTabularCreateDialogBase.ui
-  QTabularDialogBase.ui
-  QTexinfoDialogBase.ui
-  QThesaurusDialogBase.ui
-  QTocDialogBase.ui
-  QURLDialogBase.ui
-  QVSpaceDialogBase.ui
-  QWrapDialogBase.ui
-''')
-
-
-moc_files = map(lambda a: "#$BUILDDIR/frontends/qt3/%s" % a, Split('''
-  BulletsModule.C
-  emptytable.C
-  FileDialog_private.C
-  floatplacement.C
-  iconpalette.C
-  lengthcombo.C
-  panelstack.C
-  QAboutDialog.C
-  QBibitemDialog.C
-  QBibtexDialog.C
-  QBoxDialog.C
-  QBranchDialog.C
-  QBrowseBox.C
-  QChangesDialog.C
-  QCharacterDialog.C
-  QCitationDialog.C
-  QCommandBuffer.C
-  QCommandEdit.C
-  QContentPane.C
-  QDelimiterDialog.C
-  QDocumentDialog.C
-  QErrorListDialog.C
-  QERTDialog.C
-  QExternalDialog.C
-  QFloatDialog.C
-  QGraphicsDialog.C
-  QIncludeDialog.C
-  QIndexDialog.C
-  QLogDialog.C
-  QViewSourceDialog.C
-  QLPopupMenu.C
-  QLPrintDialog.C
-  QMathDialog.C
-  QMathMatrixDialog.C
-  QNoteDialog.C
-  QParagraphDialog.C
-  QPrefsDialog.C
-  QRefDialog.C
-  QSearchDialog.C
-  QSendtoDialog.C
-  qsetborder.C
-  QShowFileDialog.C
-  QSpellcheckerDialog.C
-  QDialogView.C
-  QTabularCreateDialog.C
-  QTabularDialog.C
-  QTexinfoDialog.C
-  QThesaurusDialog.C
-  QTocDialog.C
-  qttableview.C
-  QtView.C
-  QURLDialog.C
-  QVSpaceDialog.C
-  QWrapDialog.C
-  QLToolbar.C
-  socket_callback.C
-  validators.C
-'''))
-
-# 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
-moced_files = []
-if os.name == 'nt' or sys.platform == 'cygwin':
-  moced_files = [qtenv.Moc(x.replace('.C', '.h')) for x in moc_files]
-
-if frontend == "qt3":
-  qt3 = qtenv.StaticLibrary(
-    target = '$LOCALLIBPATH/qt3',
-    source = map(lambda a: "#$BUILDDIR/frontends/qt3/%s" % a, Split('''
-    QDialogView.C
-    Alert_pimpl.C
-    Dialogs.C
-    FileDialog.C
-    LyXKeySymFactory.C
-    LyXScreenFactory.C
-    QLMenubar.C
-    qtTimeout.C
-    QAbout.C
-    QBibitem.C
-    QBibtex.C
-    QBox.C
-    QBranch.C
-    QChanges.C
-    QCharacter.C
-    QCitation.C
-    QDocument.C
-    QErrorList.C
-    QERT.C
-    QExternal.C
-    QFloat.C
-    QGraphics.C
-    QInclude.C
-    QIndex.C
-    QLImage.C
-    QLog.C
-    QViewSource.C
-    QLPainter.C
-    QLyXKeySym.C
-    QMath.C
-    QNote.C
-    QParagraph.C
-    QPrefs.C
-    QPrint.C
-    QRef.C
-    QSearch.C
-    QSendto.C
-    QShowFile.C
-    QSpellchecker.C
-    QTabular.C
-    QTabularCreate.C
-    QTexinfo.C
-    QThesaurus.C
-    QToc.C
-    QURL.C
-    QVSpace.C
-    QWorkArea.C
-    QWrap.C
-    Qt2BC.C
-    WorkAreaFactory.C
-    checkedwidgets.C
-    lyx_gui.C
-    lcolorcache.C
-    panelstack.C
-    qcoloritem.C
-    qfontexample.C
-    qfont_loader.C
-    qfont_metrics.C
-    qscreen.C
-    qt_helpers.C
-  ''')) +
-  moc_files + moced_files +
-  ['#$BUILDDIR/frontends/qt3/ui/' + x for x in ui_files]
-)
-
-
-print "Entering src/frontends/qt4"
-
-qtenv = env.Copy()
-
-# local qt4 toolset from
-# http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
-#
-# NOTE: I have to patch qt4.py since it does not automatically
-# process .C file!!! (add to cxx_suffixes )
-#
-if frontend == 'qt4':
-  qtenv.Tool('qt4', ['$TOP_SRC_DIR/config'])
-  qtenv.EnableQt4Modules(env['QT_LIB'], debug = False)
-
-qtenv.Append(CPPPATH = [
-  '#$BUILDDIR',
-  '#$BUILDDIR/frontends',
-  '#$BUILDDIR/images',
-  '#$BUILDDIR/frontends/controllers',
-  '$QT_INC_PATH',
-  '$QT_INC_PATH/Qt',
-  '$QT_INC_PATH/QtCore',
-  '$QT_INC_PATH/QtGui',
-  '$QT_INC_PATH/Qt3Support',
-  '.']
-)
-
-# FIXME: replace by something from pkg_config
-qtenv.Append(CCFLAGS = [
-  '-DHAVE_CONFIG_H',
-  '-DQT_CLEAN_NAMESPACE',
-  '-DQT_GENUINE_STR',
-  '-DQT_NO_STL',
-  '-DQT3_SUPPORT',
-  '-Winvalid-pch']
-)
-ui_files = Split('''
-  BiblioUi
-  BranchesUi
-  BulletsUi
-  TextLayoutUi
-  LanguageUi
-  LaTeXUi
-  MarginsUi
-  NumberingUi
-  MathsUi
-  PageLayoutUi
-  PreambleUi
-  QAboutUi
-  QAskForTextUi
-  QBibitemUi
-  QBibtexUi
-  QBibtexAddUi
-  QBoxUi
-  QBranchUi
-  QChangesUi
-  QCharacterUi
-  QCitationUi
-  QCitationFindUi
-  QDelimiterUi
-  QDocumentUi
-  QErrorListUi
-  QERTUi
-  QExternalUi
-  QFloatUi
-  QGraphicsUi
-  QIncludeUi
-  QIndexUi
-  QLogUi
-  QViewSourceUi
-  QMathUi
-  QMathMatrixUi
-  QNoteUi
-  QParagraphUi
-  QPrefAsciiUi
-  QPrefColorsUi
-  QPrefConvertersUi
-  QPrefCopiersUi
-  QPrefCygwinPathUi
-  QPrefDateUi
-  QPrefDisplayUi
-  QPrefFileformatsUi
-  QPrefIdentityUi
-  QPrefKeyboardUi
-  QPrefLanguageUi
-  QPrefLatexUi
-  QPrefPathsUi
-  QPrefPrinterUi
-  QPrefScreenFontsUi
-  QPrefsUi
-  QPrefSpellcheckerUi
-  QPrefUi
-  QPrintUi
-  QRefUi
-  QSearchUi
-  QSendtoUi
-  QShowFileUi
-  QSpellcheckerUi
-  QTabularCreateUi
-  QTabularUi
-  QTexinfoUi
-  QThesaurusUi
-  QTocUi
-  QURLUi
-  QVSpaceUi
-  QWrapUi
-''')
-
-moc_files = Split('''
-  BulletsModule.C
-  emptytable.C
-  FileDialog_private.C
-  floatplacement.C
-  iconpalette.C
-  lengthcombo.C
-  panelstack.C
-  QAboutDialog.C
-  QBibitemDialog.C
-  QBibtexDialog.C
-  QBoxDialog.C
-  QBranchDialog.C
-  QBranches.C
-  QChangesDialog.C
-  QCharacterDialog.C
-  QCitationDialog.C
-  QCommandBuffer.C
-  QCommandEdit.C
-  QDelimiterDialog.C
-  QDocumentDialog.C
-  QErrorListDialog.C
-  QERTDialog.C
-  QExternalDialog.C
-  QFloatDialog.C
-  QGraphicsDialog.C
-  QIncludeDialog.C
-  QIndexDialog.C
-  QLAction.C
-  QLogDialog.C
-  QViewSourceDialog.C
-  QViewSource.C
-  QLMenubar.C
-  QLPopupMenu.C
-  QLPrintDialog.C
-  QMathDialog.C
-  QMathMatrixDialog.C
-  QNoteDialog.C
-  QParagraphDialog.C
-  QPrefsDialog.C
-  QRefDialog.C
-  QSearchDialog.C
-  QSendtoDialog.C
-  qsetborder.C
-  QShowFileDialog.C
-  QSpellcheckerDialog.C
-  QDialogView.C
-  QTabularCreateDialog.C
-  QTabularDialog.C
-  QTexinfoDialog.C
-  QThesaurusDialog.C
-  TocModel.C
-  QTocDialog.C
-  QtView.C
-  QURLDialog.C
-  QVSpaceDialog.C
-  QWorkArea.C
-  QWrapDialog.C
-  QLToolbar.C
-  socket_callback.C
-  validators.C
-''')
-
-#
-# Compile resources
-#
-if frontend == 'qt4':
-  resources = [qtenv.Uic4('ui/' + x) for x in ui_files]
-
-source_files = Split('''
-  QDialogView.C
-  Alert_pimpl.C
-  Dialogs.C
-  FileDialog.C
-  LyXKeySymFactory.C
-  LyXScreenFactory.C
-  QLMenubar.C
-  qtTimeout.C
-  QAbout.C
-  QBibitem.C
-  QBibtex.C
-  QBox.C
-  QBranch.C
-  QBranches.C
-  QChanges.C
-  QCharacter.C
-  QCitation.C
-  QDocument.C
-  QErrorList.C
-  QERT.C
-  QExternal.C
-  QFloat.C
-  QGraphics.C
-  QInclude.C
-  QIndex.C
-  QLAction.C
-  QLImage.C
-  QLog.C
-  QViewSource.C
-  QLPainter.C
-  QLyXKeySym.C
-  QMath.C
-  QNote.C
-  QParagraph.C
-  QPrefs.C
-  QPrint.C
-  QRef.C
-  QSearch.C
-  QSendto.C
-  QShowFile.C
-  QSpellchecker.C
-  QTabular.C
-  QTabularCreate.C
-  QTexinfo.C
-  QThesaurus.C
-  QToc.C
-  QURL.C
-  QVSpace.C
-  QWorkArea.C
-  QWrap.C
-  Qt2BC.C
-  WorkAreaFactory.C
-  checkedwidgets.C
-  lyx_gui.C
-  lcolorcache.C
-  panelstack.C
-  qfontexample.C
-  qfont_loader.C
-  qfont_metrics.C
-  qscreen.C
-  qt_helpers.C
-''')
-
-if frontend == 'qt4':
-  qt4 = qtenv.StaticLibrary(
-    target = '$LOCALLIBPATH/qt4',
-    LIBS = qtenv['QT_LIB'],
-    source = map(lambda a: "#$BUILDDIR/frontends/qt4/%s" % a, source_files + moc_files)
-   )
-
-print "Entering src/frontends/controllers"
-
-controllers = env.StaticLibrary(
-  target = '$LOCALLIBPATH/controllers',
-  source = map(lambda a: "#$BUILDDIR/frontends/controllers/%s" % a, Split('''
-    Dialog.C
-    Kernel.C
-    biblio.C
-    character.C
-    frnt_lang.C
-    tex_helpers.C
-    BCView.C
-    ButtonController.C
-    ButtonPolicies.C
-    ControlAboutlyx.C
-    ControlBibtex.C
-    ControlBox.C
-    ControlBranch.C
-    ControlCharacter.C
-    ControlChanges.C
-    ControlCitation.C
-    ControlCommand.C
-    ControlCommandBuffer.C
-    ControlDocument.C
-    ControlErrorList.C
-    ControlERT.C
-    ControlExternal.C
-    ControlFloat.C
-    ControlGraphics.C
-    ControlInclude.C
-    ControlLog.C
-    ControlViewSource.C
-    ControlMath.C
-    ControlNote.C
-    ControlParagraph.C
-    ControlPreamble.C
-    ControlPrefs.C
-    ControlPrint.C
-    ControlRef.C
-    ControlSearch.C
-    ControlSendto.C
-    ControlShowFile.C
-    ControlSpellchecker.C
-    ControlTabular.C
-    ControlTabularCreate.C
-    ControlTexinfo.C
-    ControlThesaurus.C
-    ControlToc.C
-    ControlVSpace.C
-    ControlWrap.C
-    helper_funcs.C
-    helper_funcs.h
-  '''))
-)
-
-print "Entering src/graphics"
-
-graphics = env.StaticLibrary(
-  target = '$LOCALLIBPATH/graphics',
-  source = map(lambda a: "#$BUILDDIR/graphics/%s" % a, Split('''
-    GraphicsCache.C
-    GraphicsCacheItem.C
-    GraphicsConverter.C
-    GraphicsImage.C
-    GraphicsLoader.C
-    GraphicsParams.C
-    LoaderQueue.C
-    GraphicsTypes.C
-    PreviewImage.C
-    PreviewLoader.C
-    Previews.C
-  '''))
-)
-
-
-# INCLUDED BOOST not really supported yet.
-#if env['INCLUDED_BOOST']:
-#  env.SConscript(dirs = ['#boost/libs'], duplicate=0)
-
-#
-# Start in src directory
-#
-env['SUBST_KEYS'] = ['PACKAGE_VERSION', 'VERSION_INFO']
-env.substFile('#$BUILDDIR/version.C', 'src/version.C.in')
-
-lyx_source = Split('''
-  Bidi.C
-  BufferView.C
-  BufferView_pimpl.C
-  Bullet.C
-  BranchList.C
-  Chktex.C
-  Color.C
-  CutAndPaste.C
-  DepTable.C
-  FloatList.C
-  Floating.C
-  FontIterator.C
-  FuncStatus.C
-  InsetList.C
-  LColor.C
-  LaTeX.C
-  LaTeXFeatures.C
-  LyXAction.C
-  MenuBackend.C
-  ParagraphParameters.C
-  PrinterParams.C
-  Spacing.C
-  Thesaurus.C
-  ToolbarBackend.C
-  author.C
-  boost.C
-  box.C
-  buffer.C
-  buffer_funcs.C
-  bufferlist.C
-  bufferparams.C
-  bufferview_funcs.C
-  changes.C
-  chset.C
-  converter.C
-  counters.C
-  coordcache.C
-  cursor.C
-  cursor_slice.C
-  debug.C
-  dimension.C
-  dociterator.C
-  encoding.C
-  errorlist.C
-  exporter.C
-  gettext.C
-  factory.C
-  format.C
-  funcrequest.C
-  graph.C
-  importer.C
-  intl.C
-  insetiterator.C
-  kbmap.C
-  kbsequence.C
-  language.C
-  session.C
-  lengthcommon.C
-  lyx_cb.C
-  lyx_main.C
-  lyx_sty.C
-  lyxfont.C
-  lyxfind.C
-  lyxfunc.C
-  lyxgluelength.C
-  lyxlayout.C
-  lyxlength.C
-  lyxlex.C
-  lyxlex_pimpl.C
-  lyxrc.C
-  lyxrow.C
-  lyxrow_funcs.C
-  lyxserver.C
-  lyxsocket.C
-  lyxtextclass.C
-  lyxtextclasslist.C
-  lyxvc.C
-  messages.C
-  metricsinfo.C
-  mover.C
-  output.C
-  outputparams.C
-  output_docbook.C
-  output_latex.C
-  output_linuxdoc.C
-  output_plaintext.C
-  paragraph.C
-  paragraph_funcs.C
-  paragraph_pimpl.C
-  pariterator.C
-  SpellBase.C
-  rowpainter.C
-  sgml.C
-  tabular.C
-  tex-accent.C
-  tex-strings.C
-  texrow.C
-  text.C
-  text2.C
-  text3.C
-  TocBackend.C
-  toc.C
-  trans.C
-  trans_mgr.C
-  undo.C
-  vc-backend.C
-  version.C
-  vspace.C
-  main.C
-''')
-
-if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
-  lyx_source += ['aspell.C']
-elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
-  lyx_source += ['pspell.C']
-elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
-  lyx_source += ['ispell.C']
-
-#
-# Build lyx with given frontend
-#
-lyx = env.Program(
-  target = '#$BUILDDIR/lyx',
-  source = map(lambda a: "#$BUILDDIR/%s" % a, lyx_source),
-  LIBS = [
-    'mathed',
-    'insets',
-    'frontends',
-    env['frontend'],
-    'controllers',
-    'graphics',
-    'supports'] +
-    env['BOOST_LIBRARIES'] +
-    env['EXTRA_LIBS'] +
-    env['SYSTEM_LIBS']
-)
-
-print "Entering src/client"
-
-lyxclient = env.Program(
-  target = '#$BUILDDIR/client/lyxclient',
-  LIBS = [ 'boost_regex', 'boost_filesystem',
-    'supports' ] + env['socket_libs'],
-  source = map(lambda a: "#$BUILDDIR/client/%s" % a, Split('''
-    boost.C
-    client.C
-    debug.C
-    gettext.C
-    messages.C
-  '''))
-)
-
-print "Entering src/tex2lyx"
-
-tex2lyx_env = env.Copy()
-# the order is important here.
-tex2lyx_env.Prepend(CPPPATH = ['#$BUILDDIR/tex2lyx'])
-tex2lyx_env.Append(LIBPATH = ['#$LOCALLIBPATH'])
-
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/FloatList.C', 'src/FloatList.C')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/Floating.C', 'src/Floating.C')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/counters.C', 'src/counters.C')
-# for some reason I do not know, I have to copy the header files as well.
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxlayout.h', 'src/lyxlayout.h')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxlayout.C', 'src/lyxlayout.C')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxtextclass.h', 'src/lyxtextclass.h')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxtextclass.C', 'src/lyxtextclass.C')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxlex.C', 'src/lyxlex.C')
-tex2lyx_env.fileCopy('#$BUILDDIR/tex2lyx/lyxlex_pimpl.C', 'src/lyxlex_pimpl.C')
-
-tex2lyx = tex2lyx_env.Program(
-  target = '#$BUILDDIR/tex2lyx/tex2lyx',
-  LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
-  source = map(lambda a: "#$BUILDDIR/tex2lyx/%s" % a, 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
-  '''))
-)
-
-
-#client = env.SConscript('#$BUILDDIR/client/SConscript', duplicate = 0)
-#lyx = env.SConscript('#$BUILDDIR/SConscript', duplicate=0)
-#tex2lyx = env.SConscript('#$BUILDDIR/tex2lyx/SConscript', duplicate = 0)
-
-# avoid using full path to build them
-Alias('client', lyxclient)
-Alias('tex2lyx', tex2lyx)
-Alias('lyx', lyx)
-
-#Default('lyx', 'tex2lyx')
-#Default('lyx')
-
-print "Building lyx done with targets", map(str, BUILD_TARGETS)
-
diff --git a/config/qt4.py b/config/qt4.py
deleted file mode 100644 (file)
index 8b3bc7f..0000000
+++ /dev/null
@@ -1,376 +0,0 @@
-import re
-import os.path
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-
-class ToolQtWarning(SCons.Warnings.Warning):
-       pass
-class GeneratedMocFileNotIncluded(ToolQtWarning):
-       pass
-class QtdirNotFound(ToolQtWarning):
-       pass
-SCons.Warnings.enableWarningClass(ToolQtWarning)
-
-qrcinclude_re = re.compile(r'<file>([^<]*)</file>', re.M)
-
-
-header_extensions = [".h", ".hxx", ".hpp", ".hh"]
-if SCons.Util.case_sensitive_suffixes('.h', '.H'):
-       header_extensions.append('.H')
-#cplusplus = __import__('c++', globals(), locals(), ['Scons.Tools'])
-#cxx_suffixes = cplusplus.CXXSuffixes
-cxx_suffixes = [".C", ".c", ".cxx", ".cpp", ".cc"]
-
-def _checkMocIncluded(target, source, env):
-       moc = target[0]
-       cpp = source[0]
-       # looks like cpp.includes is cleared before the build stage :-(
-       # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/
-       path = SCons.Defaults.CScan.path_function(env, moc.cwd)
-       includes = SCons.Defaults.CScan(cpp, env, path)
-       if not moc in includes:
-               SCons.Warnings.warn(
-                       GeneratedMocFileNotIncluded,
-                       "Generated moc file '%s' is not included by '%s'" %
-                       (str(moc), str(cpp)))
-
-def _find_file(filename, paths, node_factory):
-       retval = None
-       for dir in paths:
-               node = node_factory(filename, dir)
-               if node.rexists():
-                       return node
-       return None
-
-class _Automoc:
-       """
-       Callable class, which works as an emitter for Programs, SharedLibraries and
-       StaticLibraries.
-       """
-
-       def __init__(self, objBuilderName):
-               self.objBuilderName = objBuilderName
-               
-       def __call__(self, target, source, env):
-               """
-               Smart autoscan function. Gets the list of objects for the Program
-               or Lib. Adds objects and builders for the special qt files.
-               """
-               try:
-                       if int(env.subst('$QT_AUTOSCAN')) == 0:
-                               return target, source
-               except ValueError:
-                       pass
-               try:
-                       debug = int(env.subst('$QT_DEBUG'))
-               except ValueError:
-                       debug = 0
-               
-               # some shortcuts used in the scanner
-               FS = SCons.Node.FS.default_fs
-               splitext = SCons.Util.splitext
-               objBuilder = getattr(env, self.objBuilderName)
-
-               # some regular expressions:
-               # Q_OBJECT detection
-               q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]') 
-               # cxx and c comment 'eater'
-               #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)')
-               # CW: something must be wrong with the regexp. See also bug #998222
-               #     CURRENTLY THERE IS NO TEST CASE FOR THAT
-               
-               # The following is kind of hacky to get builders working properly (FIXME)
-               objBuilderEnv = objBuilder.env
-               objBuilder.env = env
-               mocBuilderEnv = env.Moc4.env
-               env.Moc4.env = env
-               
-               # make a deep copy for the result; MocH objects will be appended
-               out_sources = source[:]
-
-               for obj in source:
-                       if not obj.has_builder():
-                               # binary obj file provided
-                               if debug:
-                                       print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
-                               continue
-                       cpp = obj.sources[0]
-                       if not splitext(str(cpp))[1] in cxx_suffixes:
-                               if debug:
-                                       print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp) 
-                               # c or fortran source
-                               continue
-                       #cpp_contents = comment.sub('', cpp.get_contents())
-                       cpp_contents = cpp.get_contents()
-                       h=None
-                       for h_ext in header_extensions:
-                               # try to find the header file in the corresponding source
-                               # directory
-                               hname = splitext(cpp.name)[0] + h_ext
-                               h = _find_file(hname,
-                                                         (cpp.get_dir(),),
-                                                         FS.File)
-                               if h:
-                                       if debug:
-                                               print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
-                                       #h_contents = comment.sub('', h.get_contents())
-                                       h_contents = h.get_contents()
-                                       break
-                       if not h and debug:
-                               print "scons: qt: no header for '%s'." % (str(cpp))
-                       if h and q_object_search.search(h_contents):
-                               # h file with the Q_OBJECT macro found -> add moc_cpp
-                               moc_cpp = env.Moc4(h)
-                               moc_o = objBuilder(moc_cpp)
-                               out_sources.append(moc_o)
-                               #moc_cpp.target_scanner = SCons.Defaults.CScan
-                               if debug:
-                                       print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
-                       if cpp and q_object_search.search(cpp_contents):
-                               # cpp file with Q_OBJECT macro found -> add moc
-                               # (to be included in cpp)
-                               moc = env.Moc4(cpp)
-                               env.Ignore(moc, moc)
-                               if debug:
-                                       print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
-                               #moc.source_scanner = SCons.Defaults.CScan
-               # restore the original env attributes (FIXME)
-               objBuilder.env = objBuilderEnv
-               env.Moc4.env = mocBuilderEnv
-
-               return (target, out_sources)
-
-AutomocShared = _Automoc('SharedObject')
-AutomocStatic = _Automoc('StaticObject')
-
-def _detect(env):
-       """Not really safe, but fast method to detect the QT library"""
-
-       QTDIR = env.get('QTDIR',None)
-       if QTDIR!=None : return QTDIR
-
-       QTDIR = os.environ.get('QTDIR',None)
-       if QTDIR!=None : return QTDIR
-
-       moc = env.WhereIs('moc-qt4') or env.WhereIs('moc')
-       if moc:
-               SCons.Warnings.warn(
-                       QtdirNotFound,
-                       "QTDIR variable is not defined, using moc executable as a hint (QTDIR=%s)" % QTDIR)
-               return os.path.dirname(os.path.dirname(moc))
-
-       SCons.Warnings.warn(
-               QtdirNotFound,
-               "Could not detect qt, using empty QTDIR")
-       return None
-
-def generate(env):
-       """Add Builders and construction variables for qt to an Environment."""
-
-       print "Loading qt4 tool..."
-
-       def locateQt4Command(env, command, qtdir) :
-               fullpath1 = os.path.join(qtdir,'bin',command +'-qt4')
-               if os.access(fullpath1, os.X_OK) or \
-                       os.access(fullpath1+".exe", os.X_OK):
-                       return fullpath1
-               fullpath2 = os.path.join(qtdir,'bin',command)
-               if os.access(fullpath2, os.X_OK) or \
-                       os.access(fullpath2+".exe", os.X_OK):
-                       return fullpath2
-               fullpath = env.Detect([command+'-qt4', command])
-               if not (fullpath is None) : return fullpath
-               raise "Qt4 command '" + command + "' not found. Tried: " + fullpath1 + " and "+ fullpath2
-               
-
-       CLVar = SCons.Util.CLVar
-       Action = SCons.Action.Action
-       Builder = SCons.Builder.Builder
-       splitext = SCons.Util.splitext
-
-       # the basics
-       env['QTDIR']  = _detect(env)
-       env['QT4_MOC'] = locateQt4Command(env,'moc', env['QTDIR'])
-       env['QT4_UIC'] = locateQt4Command(env,'uic', env['QTDIR'])
-       env['QT4_RCC'] = locateQt4Command(env,'rcc', env['QTDIR'])
-       env['QT4_LUPDATE'] = locateQt4Command(env,'lupdate', env['QTDIR'])
-       env['QT4_LRELEASE'] = locateQt4Command(env,'lrelease', env['QTDIR'])
-
-       # Should the qt tool try to figure out, which sources are to be moc'ed ?
-       env['QT4_AUTOSCAN'] = 1
-
-       # Some QT specific flags. I don't expect someone wants to
-       # manipulate those ...
-       env['QT4_UICDECLFLAGS'] = CLVar('')
-       env['QT4_MOCFROMHFLAGS'] = CLVar('')
-       env['QT4_MOCFROMCXXFLAGS'] = CLVar('-i')
-       env['QT4_QRCFLAGS'] = ''
-
-       # suffixes/prefixes for the headers / sources to generate
-       env['QT4_MOCHPREFIX'] = 'moc_'
-       env['QT4_MOCHSUFFIX'] = '$CXXFILESUFFIX'
-       env['QT4_MOCCXXPREFIX'] = 'moc_'
-       env['QT4_MOCCXXSUFFIX'] = '.moc'
-       env['QT4_UISUFFIX'] = '.ui'
-       env['QT4_UICDECLPREFIX'] = 'ui_'
-       env['QT4_UICDECLSUFFIX'] = '.h'
-       env['QT4_QRCSUFFIX'] = '.qrc',
-       env['QT4_QRCCXXSUFFIX'] = '$CXXFILESUFFIX'
-       env['QT4_QRCCXXPREFIX'] = 'qrc_'
-
-       env['QT4_LIB'] = '' # KLUDGE to avoid linking qt3 library
-
-       # Translation builder
-       tsbuilder = Builder(
-               action ='$QT4_LUPDATE $SOURCES -ts $TARGETS',
-               multi=1
-               )
-       env.Append( BUILDERS = { 'Ts': tsbuilder } )
-       qmbuilder = Builder(
-               action =[
-                       '$QT4_LRELEASE $SOURCE',
-                       ],
-               src_suffix = '.ts',
-               suffix = '.qm',
-               single_source = True
-               )
-       env.Append( BUILDERS = { 'Qm': qmbuilder } )
-
-       # Resource builder
-       def scanResources(node, env, path, arg):
-               contents = node.get_contents()
-               includes = qrcinclude_re.findall(contents)
-               return includes
-       qrcscanner = env.Scanner(name = 'qrcfile',
-               function = scanResources,
-               argument = None,
-               skeys = ['.qrc'])
-       qrcbuilder = Builder(
-               action ='$QT4_RCC $QT4_QRCFLAGS $SOURCE -o $TARGET',
-               source_scanner = qrcscanner,
-               src_suffix = '$QT4_QRCSUFFIX',
-               suffix = '$QT4_QRCCXXSUFFIX',
-               prefix = '$QT4_QRCCXXPREFIX',
-               single_source = True
-               )
-       env.Append( BUILDERS = { 'Qrc': qrcbuilder } )
-
-       # Interface builder
-       #env['QT4_UIC4COM'] = [
-       #       CLVar('$QT4_UIC $QT4_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'),
-       #       ]
-       env['QT4_UIC4COM'] = '$QT4_UIC -o $TARGET $SOURCE'
-       uic4builder = Builder(
-               action='$QT4_UIC4COM',
-               src_suffix='$QT4_UISUFFIX',
-               suffix='$QT4_UICDECLSUFFIX',
-               #prefix='$QT4_UICDECLPREFIX',
-               single_source = True
-               )
-       env.Append( BUILDERS = { 'Uic4': uic4builder } )
-
-       # Metaobject builder
-       env['QT4_MOCFROMHCOM'] = (
-               '$QT4_MOC $QT4_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE')
-       env['QT4_MOCFROMCXXCOM'] = [
-               CLVar('$QT4_MOC $QT4_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'),
-               Action(_checkMocIncluded,None)]
-       mocBld = Builder(action={}, prefix={}, suffix={})
-       for h in header_extensions:
-               mocBld.add_action(h, '$QT4_MOCFROMHCOM')
-               mocBld.prefix[h] = '$QT4_MOCHPREFIX'
-               mocBld.suffix[h] = '$QT4_MOCHSUFFIX'
-       for cxx in cxx_suffixes:
-               mocBld.add_action(cxx, '$QT4_MOCFROMCXXCOM')
-               mocBld.prefix[cxx] = '$QT4_MOCCXXPREFIX'
-               mocBld.suffix[cxx] = '$QT4_MOCCXXSUFFIX'
-       env.Append( BUILDERS = { 'Moc4': mocBld } )
-
-       # er... no idea what that was for
-       static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-       static_obj.src_builder.append('Uic4')
-       shared_obj.src_builder.append('Uic4')
-
-       # We use the emitters of Program / StaticLibrary / SharedLibrary
-       # to scan for moc'able files
-       # We can't refer to the builders directly, we have to fetch them
-       # as Environment attributes because that sets them up to be called
-       # correctly later by our emitter.
-       env.AppendUnique(PROGEMITTER =[AutomocStatic],
-                                        SHLIBEMITTER=[AutomocShared],
-                                        LIBEMITTER  =[AutomocStatic],
-                                        # Of course, we need to link against the qt libraries
-                                        CPPPATH=[os.path.join('$QTDIR', 'include')],
-                                        LIBPATH=[os.path.join('$QTDIR', 'lib')],
-                                        LIBS=['$QT4_LIB'])
-       
-       import new
-       method = new.instancemethod(enable_modules, env, SCons.Environment)
-       env.EnableQt4Modules=method
-
-def enable_modules(self, modules, debug=False) :
-       import sys
-
-       validModules = [
-               'QtCore',
-               'QtGui',
-               'QtOpenGL',
-               'Qt3Support',
-               # The next modules have not been tested yet so, please
-               # maybe they require additional work on non Linux platforms
-               'QtSql',
-               'QtNetwork',
-               'QtSvg',
-               'QtTest',
-               'QtXml',
-               'QtUiTools',
-               ]
-       pclessModules = [
-               'QtUiTools',
-               'QtUiTools_debug',
-       ]
-       # under windows, they are named QtCore4 etc
-       validModules += [x+'4' for x in validModules]
-       pclessModules += [x+'4' for x in pclessModules]
-       invalidModules=[]
-       for module in modules:
-               if module not in validModules :
-                       invalidModules.append(module)
-       if invalidModules :
-               raise "Modules %s are not Qt4 modules. Valid Qt4 modules are: %s"% \
-                       (str(invalidModules),str(validModules))
-
-       # TODO: Check whether we should add QT_CORE_LIB, QT_XML_LIB, QT_NETWORK_LIB...
-       if 'QtGui' in modules:
-               self.AppendUnique(CPPFLAGS='-DQT_GUI_LIB')
-
-       if sys.platform == "linux2" :
-               if debug : modules = [module+"_debug" for module in modules]
-               for module in modules :
-                       if module in pclessModules :
-                       #       self.AppendUnique(LIBS=[module])
-                               self.AppendUnique(LIBPATH=[os.path.join(self["QTDIR"],"lib",module)])
-                               self.AppendUnique(CPPPATH=[os.path.join(self["QTDIR"],"include","qt4",module)])
-                               modules.remove(module)
-               self.ParseConfig('PKG_CONFIG_PATH=%s/lib pkg-config %s --libs --cflags'%
-               (
-                       self['QTDIR'],
-                       ' '.join(modules)))
-               return
-       if sys.platform == "win32" :
-               if debug : debugSuffix = 'd'
-               else : debugSuffix = ''
-               self.AppendUnique(LIBS=[lib+'4'+debugSuffix for lib in modules])
-               if 'QtOpenGL' in modules:
-                       self.AppendUnique(LIBS=['opengl32'])
-               self.AppendUnique(CPPPATH=[ '$QTDIR/include/'+module
-                       for module in modules])
-               self.AppendUnique(LIBPATH=['$QTDIR/lib'])
-
-
-def exists(env):
-       return _detect(env)
-
diff --git a/config/scons_utils.py b/config/scons_utils.py
deleted file mode 100644 (file)
index cf1a848..0000000
+++ /dev/null
@@ -1,779 +0,0 @@
-# vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
-#
-# file scons_utils.py
-# 
-# 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 file defines all the utility functions for the
-# scons-based build system of lyx
-# 
-
-import os, sys, re, shutil, glob
-
-config_h = os.path.join('src', 'config.h')
-
-def writeToFile(filename, lines, append = False):
-  " utility function: write or append lines to filename "
-  if append:
-    file = open(filename, 'a')
-  else:
-    file = open(filename, 'w')
-  file.write(lines)
-  file.close()
-
-
-def addToConfig(lines):
-  ''' utility function: shortcut for appending lines to outfile
-    add newline at the end of lines.
-  '''
-  if lines.strip() != '':
-    writeToFile(config_h, lines + '\n\n', append = True)
-
-
-def printEnvironment(env, keys=[]):
-  ''' used to check profile settings '''
-  dict = env.Dictionary()
-  if len(keys) == 0:
-    keys = dict.keys()
-  keys.sort()
-  for key in keys:
-    try:
-      # try to expand, but this is not always possible
-      print key, '=', env.subst('$'+key)
-    except:   
-      print '<<UNEXPANDED>>:', key, '=', dict[key]
-
-
-def env_subst(target, source, env):
-  ''' subst variables in source by those in env, and output to target
-    source and target are scons File() objects
-
-    %key% (not key itself) is an indication of substitution
-  '''
-  assert len(target) == 1
-  assert len(source) == 1
-  target_file = file(str(target[0]), "w")
-  source_file = file(str(source[0]), "r")
-  
-  contents = source_file.read()
-  for k in env.get('SUBST_KEYS', []):
-    if not env.has_key(k):
-      print "Failed to subst key ", k, " from file", str(source[0])
-      raise
-    contents = re.sub('@'+k+'@', env.subst('$'+k).replace('\n',r'\\n\\\n'), contents)
-  target_file.write(contents + "\n")
-  target_file.close()
-  #st = os.stat(str(source[0]))
-  #os.chmod(str(target[0]), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
-
-
-def env_filecopy(target, source, env):
-  shutil.copy(str(source[0]), str(target[0]))
-
-
-#
-# autoconf tests
-#
-
-def checkPkgConfig(conf, version):
-  ''' Return false if pkg_config does not exist, or is too old '''
-  conf.Message('Checking for pkg-config...')
-  ret = conf.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
-  conf.Result(ret)
-  return ret
-
-
-def checkPackage(conf, pkg):
-  ''' check if pkg is under the control of conf '''
-  conf.Message('Checking for package %s...' % pkg)
-  ret = conf.TryAction("pkg-config --print-errors --exists %s" % pkg)[0]
-  conf.Result(ret)
-  return ret
-
-
-def startConfigH():
-  ''' Write the first part of config.h '''
-  writeToFile(config_h, 
-'''/* src/config.h.  Generated by scon.  */
-
-/* -*- C++ -*- */
-/*
- * \file config.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * This is the compilation configuration file for LyX.
- * It was generated by scon.
- * You might want to change some of the defaults if something goes wrong
- * during the compilation.
- */
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-''')
-
-
-def endConfigH():
-  ''' Write the last part of config.h '''
-  writeToFile(config_h, '''
-/************************************************************
- ** You should not need to change anything beyond this point */
-
-#ifndef HAVE_STRERROR
-#if defined(__cplusplus)
-extern "C"
-#endif
-char * strerror(int n);
-#endif
-
-#ifdef HAVE_MKSTEMP
-#ifndef HAVE_DECL_MKSTEMP
-#if defined(__cplusplus)
-extern "C"
-#endif
-int mkstemp(char*);
-#endif
-#endif
-
-#ifdef __EMX__
-#  include "support/os2_defines.h"
-#endif
-
-#if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM)
-#  define USE_BOOST_FORMAT 1
-#else
-#  define USE_BOOST_FORMAT 0
-#endif
-
-#define BOOST_USER_CONFIG <config.h>
-
-#if !defined(ENABLE_ASSERTIONS)
-#  define BOOST_DISABLE_ASSERTS 1
-#endif
-#define BOOST_ENABLE_ASSERT_HANDLER 1
-
-#define BOOST_DISABLE_THREADS 1
-#define BOOST_NO_WREGEX 1
-#define BOOST_NO_WSTRING 1
-
-#ifdef __CYGWIN__
-#  define BOOST_POSIX 1
-#endif
-
-#if defined(HAVE_NEWAPIS_H)
-#  define WANT_GETFILEATTRIBUTESEX_WRAPPER 1
-#endif
-
-#endif
-''', append=True)
-
-
-#HAVE_PUTENV
-def checkPutenv(conf):
-  check_putenv_source = """
-#include <stdlib.h>
-int main()
-{
-  putenv("");
-  return(0);
-}
-"""
-  conf.Message('Checking for putenv... ')
-  ret = conf.TryLink(check_putenv_source, '.c')
-  conf.Result(ret)
-  return ret
-
-
-#HAVE_DECL_ISTREAMBUF_ITERATOR
-def checkIstreambufIterator(conf):
-  check_istreambuf_iterator_source = """
-#include <streambuf> 
-#include <istream>
-int main()
-{
-  std::istreambuf_iterator<std::istream> iter;
-  return 0;
-}
-"""
-  conf.Message('Checking for iostreambuf::iterator... ')
-  ret = conf.TryLink(check_istreambuf_iterator_source, '.cpp')
-  conf.Result(ret)
-  return ret
-
-
-#MKDIR_TAKES_ONE_ARG
-def checkMkdirOneArg(conf):
-  check_mkdir_one_arg_source = """
-#include <sys/stat.h>
-int main()
-{
-  mkdir("somedir");
-}
-"""
-  conf.Message('Checking for the number of args for mkdir... ')
-  ret = conf.TryLink(check_mkdir_one_arg_source, '.c')
-  if ret:
-    conf.Result('one')
-  else:
-    conf.Result('two')
-  return ret
-
-
-#HAVE_STD_COUNT
-def checkStdCount(conf):
-  check_std_count_source = """
-#include <algorithm>
-using std::count;
-int countChar(char * b, char * e, char const c)
-{
-  return count(b, e, c);
-}
-
-int main()
-{
-  char a[] = "hello";
-  int i = countChar(a, a + 5, 'l');
-}
-"""
-  conf.Message('Checking for std::count... ')
-  ret = conf.TryLink(check_std_count_source, '.cpp')
-  conf.Result(ret)
-  return ret
-
-
-# SELECT_TYPE_ARG1
-# SELECT_TYPE_ARG234
-# SELECT_TYPE_ARG5
-def checkSelectArgType(conf):
-  ''' Adapted from autoconf '''
-  conf.Message('Checking for arg types for select... ')
-  for arg234 in ['fd_set *', 'int *', 'void *']:
-    for arg1 in ['int', 'size_t', 'unsigned long', 'unsigned']:
-      for arg5 in ['struct timeval *', 'const struct timeval *']:
-        check_select_source = '''
-#if HAVE_SYS_SELECT_H
-# include <sys/select.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-extern int select (%s, %s, %s, %s, %s);
-int main()
-{
-  return(0);
-}
-''' % (arg1, arg234, arg234, arg234, arg5)
-        ret = conf.TryLink(check_select_source, '.c')
-        if ret:
-          conf.Result(ret)
-          return (arg1, arg234, arg5)
-  conf.Result('no (use default)')
-  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:
-    # 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
-      conf.Result('yes')
-      return (path, files[0].split(os.sep)[-1][3:-2])
-  conf.Result('n')
-  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
-  #    dir=env.join( getInstDirForResType(env, 'KDELOCALE'), country)
-  #    env.bksys_install(env.join(dir, 'LC_MESSAGES'), result, destfile=appname+'.mo')
-
-
-def installCygwinLDScript(path):
-  ''' Install i386pe.x-no-rdata '''
-  ld_script = os.path.join(path, 'i386pe.x-no-rdata')
-  script = open(ld_script, 'w')
-  script.write('''/* specific linker script avoiding .rdata sections, for normal executables 
-for a reference see 
-http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
-http://www.cygwin.com/ml/cygwin-apps/2004-09/msg00309.html
-*/
-OUTPUT_FORMAT(pei-i386)
-SEARCH_DIR("/usr/i686-pc-cygwin/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/lib/w32api");
-ENTRY(_mainCRTStartup)
-SECTIONS
-{
-  .text  __image_base__ + __section_alignment__  :
-  {
-     *(.init)
-    *(.text)
-    *(SORT(.text$*))
-    *(.glue_7t)
-    *(.glue_7)
-     ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
-                       LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*));  LONG (0);
-     ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
-                       LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*));  LONG (0);
-     *(.fini)
-    /* ??? Why is .gcc_exc here?  */
-     *(.gcc_exc)
-    PROVIDE (etext = .);
-    *(.gcc_except_table)
-  }
-  /* The Cygwin32 library uses a section to avoid copying certain data
-     on fork.  This used to be named ".data".  The linker used
-     to include this between __data_start__ and __data_end__, but that
-     breaks building the cygwin32 dll.  Instead, we name the section
-     ".data_cygwin_nocopy" and explictly include it after __data_end__. */
-  .data BLOCK(__section_alignment__) :
-  {
-    __data_start__ = . ;
-    *(.data)
-    *(.data2)
-    *(SORT(.data$*))
-    *(.rdata)
-    *(SORT(.rdata$*))
-    *(.eh_frame)
-    ___RUNTIME_PSEUDO_RELOC_LIST__ = .;
-    __RUNTIME_PSEUDO_RELOC_LIST__ = .;
-    *(.rdata_runtime_pseudo_reloc)
-    ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
-    __RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
-    __data_end__ = . ;
-    *(.data_cygwin_nocopy)
-  }
-  .rdata BLOCK(__section_alignment__) :
-  {
-  }
-  .pdata BLOCK(__section_alignment__) :
-  {
-    *(.pdata)
-  }
-  .bss BLOCK(__section_alignment__) :
-  {
-    __bss_start__ = . ;
-    *(.bss)
-    *(COMMON)
-    __bss_end__ = . ;
-  }
-  .edata BLOCK(__section_alignment__) :
-  {
-    *(.edata)
-  }
-  /DISCARD/ :
-  {
-    *(.debug$S)
-    *(.debug$T)
-    *(.debug$F)
-    *(.drectve)
-  }
-  .idata BLOCK(__section_alignment__) :
-  {
-    /* This cannot currently be handled with grouped sections.
-       See pe.em:sort_sections.  */
-    SORT(*)(.idata$2)
-    SORT(*)(.idata$3)
-    /* These zeroes mark the end of the import list.  */
-    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
-    SORT(*)(.idata$4)
-    SORT(*)(.idata$5)
-    SORT(*)(.idata$6)
-    SORT(*)(.idata$7)
-  }
-  .CRT BLOCK(__section_alignment__) :
-  {
-    ___crt_xc_start__ = . ;
-    *(SORT(.CRT$XC*))  /* C initialization */
-    ___crt_xc_end__ = . ;
-    ___crt_xi_start__ = . ;
-    *(SORT(.CRT$XI*))  /* C++ initialization */
-    ___crt_xi_end__ = . ;
-    ___crt_xl_start__ = . ;
-    *(SORT(.CRT$XL*))  /* TLS callbacks */
-    /* ___crt_xl_end__ is defined in the TLS Directory support code */
-    ___crt_xp_start__ = . ;
-    *(SORT(.CRT$XP*))  /* Pre-termination */
-    ___crt_xp_end__ = . ;
-    ___crt_xt_start__ = . ;
-    *(SORT(.CRT$XT*))  /* Termination */
-    ___crt_xt_end__ = . ;
-  }
-  .tls BLOCK(__section_alignment__) :
-  {
-    ___tls_start__ = . ;
-    *(.tls)
-    *(.tls$)
-    *(SORT(.tls$*))
-    ___tls_end__ = . ;
-  }
-  .endjunk BLOCK(__section_alignment__) :
-  {
-    /* end is deprecated, don't use it */
-    PROVIDE (end = .);
-    PROVIDE ( _end = .);
-     __end__ = .;
-  }
-  .rsrc BLOCK(__section_alignment__) :
-  {
-    *(.rsrc)
-    *(SORT(.rsrc$*))
-  }
-  .reloc BLOCK(__section_alignment__) :
-  {
-    *(.reloc)
-  }
-  .stab BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.stab)
-  }
-  .stabstr BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.stabstr)
-  }
-  /* DWARF debug sections.
-     Symbols in the DWARF debugging sections are relative to the beginning
-     of the section.  Unlike other targets that fake this by putting the
-     section VMA at 0, the PE format will not allow it.  */
-  /* DWARF 1.1 and DWARF 2.  */
-  .debug_aranges BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_aranges)
-  }
-  .debug_pubnames BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_pubnames)
-  }
-  /* DWARF 2.  */
-  .debug_info BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_info) *(.gnu.linkonce.wi.*)
-  }
-  .debug_abbrev BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_abbrev)
-  }
-  .debug_line BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_line)
-  }
-  .debug_frame BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_frame)
-  }
-  .debug_str BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_str)
-  }
-  .debug_loc BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_loc)
-  }
-  .debug_macinfo BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_macinfo)
-  }
-  /* SGI/MIPS DWARF 2 extensions.  */
-  .debug_weaknames BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_weaknames)
-  }
-  .debug_funcnames BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_funcnames)
-  }
-  .debug_typenames BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_typenames)
-  }
-  .debug_varnames BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_varnames)
-  }
-  /* DWARF 3.  */
-  .debug_ranges BLOCK(__section_alignment__) (NOLOAD) :
-  {
-    *(.debug_ranges)
-  }
-}
-''')
-  script.close()
-  return(ld_script)
-
-
-try:
-  # these will be used under win32
-  import win32file
-  import win32event
-  import win32process
-  import win32security
-except:
-  # does not matter if it fails on other systems
-  pass
-
-
-class loggedSpawn:
-  def __init__(self, env, logfile, longarg, info):
-    # save the spawn system
-    self.env = env
-    self.logfile = logfile
-    # clear the logfile (it may not exist)
-    if logfile != '':
-      # this will overwrite existing content.
-      writeToFile(logfile, info, append=False)
-    # 
-    self.longarg = longarg
-    # get hold of the old spawn? (necessary?)
-    self._spawn = env['SPAWN']
-
-  # define new SPAWN
-  def spawn(self, sh, escape, cmd, args, spawnenv):
-    # get command line
-    newargs = ' '.join(map(escape, args[1:]))
-    cmdline = cmd + " " + newargs
-    #
-    # if log is not empty, write to it
-    if self.logfile != '':
-      # this tend to be slow (?) but ensure correct output
-      # Note that cmdline may be long so I do not escape it
-      try:
-        # since this is not an essential operation, proceed if things go wrong here.
-        writeToFile(self.logfile, cmd + " " + ' '.join(args[1:]) + '\n', append=True)
-      except:
-        print "Warning: can not write to log file ", self.logfile
-    #
-    # if the command is not too long, use the old
-    if not self.longarg or len(cmdline) < 8000:
-      exit_code = self._spawn(sh, escape, cmd, args, spawnenv)
-    else:  
-      sAttrs = win32security.SECURITY_ATTRIBUTES()
-      StartupInfo = win32process.STARTUPINFO()
-      for var in spawnenv:
-        spawnenv[var] = spawnenv[var].encode('ascii', 'replace')
-      # check for any special operating system commands
-      if cmd == 'del':
-        for arg in args[1:]:
-          win32file.DeleteFile(arg)
-        exit_code = 0
-      else:
-        # otherwise execute the command.
-        hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(None, cmdline, None, None, 1, 0, spawnenv, None, StartupInfo)
-        win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
-        exit_code = win32process.GetExitCodeProcess(hProcess)
-        win32file.CloseHandle(hProcess);
-        win32file.CloseHandle(hThread);
-    return exit_code
-
-
-def setLoggedSpawn(env, logfile = '', longarg=False, info=''):
-  ''' This function modify env and allow logging of
-    commands to a logfile. If the argument is too long
-    a win32 spawn will be used instead of the system one
-  '''
-  #
-  # create a new spwn object
-  ls = loggedSpawn(env, logfile, longarg, info)
-  # replace the old SPAWN by the new function
-  env['SPAWN'] = ls.spawn
-
-
-## def CheckPython(context, minver):
-##     context.Message('Checking for Python >= %s...' % '.'.join(str(x) for x in minver))
-##     try:
-##         python = context.env['PYTHON']
-##     except KeyError:
-##         try:
-##             python = os.environ['PYTHON']
-##         except KeyError:
-##             python = WhereIs("python")
-##             if not python:
-##                 python = python = WhereIs("python%i.%i" % (minver[0], minver[1]))
-##     minverhex = 0
-##     minver = list(minver) + [0, 0, 0, 0]
-##     for i in xrange(0, 4):
-##         minverhex = (minverhex << 8) + minver[i]
-##     prog = "import sys; sys.exit(sys.hexversion >= %s)" % minverhex
-##     if python is None:
-##         python = 'python'
-##     try:
-##         result = Popen([python, "-c", prog]).wait()
-##     except OSError:
-##         context.Result(False)
-##         return False
-##     context.Result(result)
-##     if result:
-##         context.env.Replace(PYTHON=python)
-##         proc = Popen([python, "-c", "import sys; print sys.version[:3]"], stdout=PIPE)
-##         pyver = proc.communicate()[0].rstrip()
-##         context.env.Replace(PYTHON_VERSION=pyver)
-##         context.env.Replace(pythondir="$prefix/lib/python$PYTHON_VERSION/site-packages")
-##         context.env.Replace(pyexecdir="${exec_prefix}/lib/python$PYTHON_VERSION/site-packages")
-##     return result
-## 
-## def DistSources(env, node):
-##     env.DistFiles(_get_sources(env, node))
-## 
-## def DistFiles(env, files):
-##     assert isinstance(files, (list, tuple))
-##     DISTFILES = [env.File(fname) for fname in files]
-##     env.AppendUnique(DISTFILES=DISTFILES)
-## 
-## 
-## def make_distdir(target=None, source=None, env=None):
-##     distdir = env.subst('$DISTDIR')
-##     Execute(Delete(distdir))
-##     Execute(Mkdir(distdir))
-##     for fnode in env["DISTFILES"]:
-##         dirname, fname = os.path.split(str(fnode))
-##         if dirname:
-##             distdirname = os.path.join(distdir, dirname)
-##             if not os.path.exists(distdirname):
-##                 Execute(Mkdir(distdirname))
-##         Execute(Copy(os.path.join(distdir, dirname, fname), str(fnode)))
-##     
-## def make_dist(target=None, source=None, env=None):
-##     return Popen([env['TAR'], "-zcf",
-##                   env.subst("${PACKAGE}-${VERSION}.tar.gz"),
-##                   env.subst('$DISTDIR')]).wait()
-## 
-## def make_distcheck(target=None, source=None, env=None):
-##     distdir = env.subst('$DISTDIR')
-##     distcheckinstdir = tempfile.mkdtemp('', env.subst('${PACKAGE}-${VERSION}-instdir-'))
-##     distcheckdestdir = tempfile.mkdtemp('', env.subst('${PACKAGE}-${VERSION}-destdir-'))
-##     instdirs = [os.path.join(distcheckinstdir, d) for d in
-##                 'lib', 'share', 'bin', 'include']
-##     for dir_ in instdirs:
-##         Execute(Mkdir(dir_))
-## 
-##     cmd = env.subst("cd $DISTDIR && scons DESTDIR=%s prefix=%s"
-##                     " && scons check && scons install") %\
-##             (os.path.join(distcheckdestdir, ''), distcheckinstdir)
-##     status = Popen(cmd, shell=True).wait()
-##     if status:
-##         return status
-##     ## Check that inst dirs are empty (to catch cases of $DESTDIR not being honored
-##     for dir_ in instdirs:
-##         if os.listdir(dir_):
-##             raise SCons.Errors.BuildError(target, "%s not empy" % dir_)
-##     ## Check that something inside $DESTDIR was installed
-##     dir_ = os.path.join(distcheckdestdir, distcheckinstdir)
-##     if not os.path.exists(dir_):
-##         raise SCons.Errors.BuildError(target, "%s does not exist" % dir_)
-##     Execute(Delete(distcheckinstdir))
-##     Execute(Delete(distcheckdestdir))
-##     Execute(Delete(distdir))
-## 
-## def InstallWithDestDir(self, dir_, source):
-##     dir_ = '${DESTDIR}' + str(dir_)
-##     return SConsEnvironment.Install(self, dir_, source)
-## 
-## 
-## def InstallAsWithDestDir(self, target, source):
-##     target = '${DESTDIR}' + str(target)
-##     return SConsEnvironment.InstallAs(self, target, source)
-## 
-## def generate(env):
-##     env.EnsureSConsVersion(0, 96, 91)
-## 
-##     opts = Options(['options.cache'], ARGUMENTS)
-##     opts.Add(PathOption('prefix', 'Installation prefix', '/usr/local'))
-##     opts.Add(PathOption('exec_prefix', 'Installation prefix blah blah',
-##                         '$prefix'))
-##     opts.Add(PathOption('libdir',
-##         'Installation prefix for architecture dependent files', '$prefix/lib'))
-##     opts.Add(PathOption('includedir',
-##         'Installation prefix for C header files', '$prefix/include'))
-##     opts.Add(PathOption('datadir',
-##         'Installation prefix for architecture independent files', '$prefix/share'))
-##     opts.Add(PathOption('bindir', 'Installation prefix for programs', '$prefix/bin'))
-##     opts.Add(PathOption('DESTDIR', 'blah blah', None))
-##     opts.Update(env)
-##     opts.Save('options.cache', env)
-##     SConsEnvironment.Help(env, opts.GenerateHelpText(env))
-##     
-##     env.Append(CPPFLAGS=r' -DVERSION=\"$VERSION\"')
-##     env.Append(CCFLAGS=ARGUMENTS.get('CCFLAGS', '-g -O2'))
-## 
-##     env['GNOME_TESTS'] = dict(CheckPython=CheckPython,
-##                               CheckPythonHeaders=CheckPythonHeaders,
-##                               PkgCheckModules=PkgCheckModules)
-## 
-##     SConsEnvironment.DistSources = DistSources
-##     SConsEnvironment.DistFiles = DistFiles
-##     env['DISTDIR'] = "${PACKAGE}-${VERSION}"
-## 
-##     #env.Command(env.Dir("$DISTDIR"), None, make_distdir)
-##     
-##     distdir_alias = env.Alias("distdir", None, make_distdir)
-##     dist_alias = env.Alias("dist", None, make_dist)
-##     env.Depends(dist_alias, distdir_alias)
-##     distcheck_alias = env.Alias("distcheck", None, make_distcheck)
-##     env.Depends(distcheck_alias, distdir_alias)
-##     env.AlwaysBuild(env.Alias('check'))
-## 
-##     #env['TARFLAGS'] ='-c -z'
-##     #env['TARSUFFIX'] = '.tar.gz'
-##     #tar = env.Tar('${PACKAGE}-${VERSION}.tar.gz', "${DISTDIR}")
-##     #env.Depends(tar, distdir_alias)
-##     #print env['DEFAULT_TARGETS']
-## 
-##     #env.Depends(distdir_alias, "${DISTFILES}")
-##     #env.Alias('dist', tar)
-##     env.AlwaysBuild('dist')
-##     env.AlwaysBuild('distdir')
-##     env.AlwaysBuild('distcheck')
-##     env.DistFiles(['SConstruct', 'scons/gnome.py'])
-## 
-##     env['BUILDERS']['EnvSubstFile'] = SCons.Builder.Builder(action=env_subst)
-## 
-##     SConsEnvironment.PythonByteCompile = env.Action(byte_compile_python)
-##     
-##     env.Install = new.instancemethod(InstallWithDestDir, env, env.__class__)
-##     env.InstallAs = new.instancemethod(InstallAsWithDestDir, env, env.__class__)
-## 
-## 
-##  
-
diff --git a/development/scons/SConscript b/development/scons/SConscript
new file mode 100644 (file)
index 0000000..4e5293e
--- /dev/null
@@ -0,0 +1,1087 @@
+# vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
+
+# file SConscript
+#
+# 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.
+
+import os, sys
+
+Import('env')
+
+#
+# boost libraries
+#
+if env['INCLUDED_BOOST']:
+  env.BuildDir('#$BUILDDIR/common', '$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'])
+  
+  print 'Processing files in boost/libs/filesystem/src...'
+  
+  filesystem = boostenv.StaticLibrary(
+    target = '$LOCALLIBPATH/boost_filesystem',
+    source = ["#$BUILDDIR/common/filesystem/src/%s" % x for x in Split('''
+      convenience.cpp
+      exception.cpp
+      operations_posix_windows.cpp
+      path_posix_windows.cpp
+    ''')]
+  )
+  
+  print 'Processing files in boost/libs/regex/src...'
+  
+  regex = boostenv.StaticLibrary(
+    target = '$LOCALLIBPATH/boost_regex',
+    source = ["#$BUILDDIR/common/regex/src/%s" % x for x in Split('''
+      cpp_regex_traits.cpp
+      c_regex_traits.cpp
+      cregex.cpp
+      fileiter.cpp
+      instances.cpp
+      regex.cpp
+      regex_raw_buffer.cpp
+      regex_traits_defaults.cpp
+      w32_regex_traits.cpp
+    ''')]
+  )
+  
+  # Return the library
+  Return('regex')
+  
+  Import('boostenv')
+  
+  print 'Processing files in boost/libs/signals/src...'
+  
+  signals = boostenv.StaticLibrary(
+    target = '$LOCALLIBPATH/boost_signals',
+    source = ["#$BUILDDIR/common/signals/src/%s" % x for x in Split('''
+      connection.cpp
+      named_slot_map.cpp
+      signal_base.cpp
+      slot.cpp
+      trackable.cpp
+    ''')]
+  )
+  
+  print 'Processing files in boost/libs/iostreams/src...'
+  
+  iostreams = boostenv.StaticLibrary(
+    target = '$LOCALLIBPATH/boost_iostreams',
+    source = ["#$BUILDDIR/common/iostreams/src/%s" % x for x in Split('''
+      file_descriptor.cpp
+      mapped_file.cpp
+      zlib.cpp
+    ''') ]
+  )
+  
+  
+#
+# Now, src code under src/
+#
+
+env.BuildDir('#$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
+
+#
+# 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('''
+    FileMonitor.C
+    abort.C
+    chdir.C
+    convert.C
+    copy.C
+    environment.C
+    filefilterlist.C
+    filename.C
+    filetools.C
+    forkedcall.C
+    forkedcallqueue.C
+    forkedcontr.C
+    fs_extras.C
+    getcwd.C
+    kill.C
+    lstrings.C
+    lyxtime.C
+    lyxsum.C
+    mkdir.C
+    os.C
+    path.C
+    package.C
+    rename.C
+    socktools.C
+    systemcall.C
+    tempname.C
+    userinfo.C
+    unlink.C
+  ''')]
+)
+
+#
+# src/mathed
+#
+
+print "Processing files in src/mathed"
+
+mathed = env.StaticLibrary(
+  target = '$LOCALLIBPATH/mathed',
+  source = ["#$BUILDDIR/common/mathed/%s" % x for x in Split('''
+    textpainter.C
+    math_amsarrayinset.C
+    math_arrayinset.C
+    math_atom.C
+    math_autocorrect.C
+    math_biginset.C
+    math_binominset.C
+    math_boldsymbolinset.C
+    math_boxinset.C
+    math_boxedinset.C
+    math_braceinset.C
+    math_casesinset.C
+    math_charinset.C
+    math_colorinset.C
+    math_commentinset.C
+    math_data.C
+    math_decorationinset.C
+    math_deliminset.C
+    math_dfracinset.C
+    math_diffinset.C
+    math_diminset.C
+    math_dotsinset.C
+    math_envinset.C
+    math_extern.C
+    math_exfuncinset.C
+    math_exintinset.C
+    math_factory.C
+    math_fboxinset.C
+    math_frameboxinset.C
+    math_fontinset.C
+    math_fontoldinset.C
+    math_fracinset.C
+    math_fracbase.C
+    math_gridinset.C
+    math_hullinset.C
+    math_inset.C
+    math_kerninset.C
+    math_lefteqninset.C
+    math_liminset.C
+    math_macro.C
+    math_macroarg.C
+    math_macrotemplate.C
+    math_macrotable.C
+    math_makeboxinset.C
+    math_mathmlstream.C
+    math_matrixinset.C
+    math_nestinset.C
+    math_numberinset.C
+    math_oversetinset.C
+    math_parinset.C
+    math_parser.C
+    math_phantominset.C
+    math_rootinset.C
+    math_scriptinset.C
+    math_sizeinset.C
+    math_spaceinset.C
+    math_splitinset.C
+    math_sqrtinset.C
+    math_stackrelinset.C
+    math_streamstr.C
+    math_stringinset.C
+    math_substackinset.C
+    math_support.C
+    math_symbolinset.C
+    math_tabularinset.C
+    math_tfracinset.C
+    math_unknowninset.C
+    math_undersetinset.C
+    math_xarrowinset.C
+    math_xymatrixinset.C
+    command_inset.C
+    ref_inset.C
+  ''')]
+)
+
+#
+# src/insets
+#
+
+print "Processing files in src/insets"
+
+insets = env.StaticLibrary(
+  target = '$LOCALLIBPATH/insets',
+  source = ["#$BUILDDIR/common/insets/%s" % x for x in Split('''
+    mailinset.C
+    ExternalSupport.C
+    ExternalTemplate.C
+    ExternalTransforms.C
+    render_button.C
+    render_graphic.C
+    render_preview.C
+    inset.C
+    insetbase.C
+    insetbibitem.C
+    insetbibtex.C
+    insetbox.C
+    insetbranch.C
+    insetcaption.C
+    insetcharstyle.C
+    insetcite.C
+    insetcollapsable.C
+    insetcommand.C
+    insetcommandparams.C
+    insetenv.C
+    insetert.C
+    insetexternal.C
+    insetfloat.C
+    insetfloatlist.C
+    insetfoot.C
+    insetfootlike.C
+    insetgraphicsParams.C
+    insetgraphics.C
+    insethfill.C
+    insetinclude.C
+    insetindex.C
+    insetlabel.C
+    insetlatexaccent.C
+    insetline.C
+    insetmarginal.C
+    insetnewline.C
+    insetnote.C
+    insetoptarg.C
+    insetpagebreak.C
+    insetquotes.C
+    insetref.C
+    insetspace.C
+    insetspecialchar.C
+    insettabular.C
+    insettext.C
+    insettoc.C
+    inseturl.C
+    insetvspace.C
+    insetwrap.C
+  ''')]
+)
+
+
+#
+# src/frontends
+#
+
+print "Processing files in src/frontends"
+
+frontends = env.StaticLibrary(
+  target = '$LOCALLIBPATH/frontends',
+  source = ["#$BUILDDIR/common/frontends/%s" % x for x in Split('''
+    Alert.C
+    Dialogs.C
+    LyXView.C
+    Painter.C
+    Timeout.C
+    Toolbars.C
+    guiapi.C
+    nullpainter.C
+    screen.C
+  ''')]
+)
+
+
+#
+# src/graphics
+#
+
+print "Processing files in src/graphics"
+
+graphics = env.StaticLibrary(
+  target = '$LOCALLIBPATH/graphics',
+  source = ["#$BUILDDIR/common/graphics/%s" % x for x in Split('''
+    GraphicsCache.C
+    GraphicsCacheItem.C
+    GraphicsConverter.C
+    GraphicsImage.C
+    GraphicsLoader.C
+    GraphicsParams.C
+    LoaderQueue.C
+    GraphicsTypes.C
+    PreviewImage.C
+    PreviewLoader.C
+    Previews.C
+  ''')]
+)
+
+#
+# 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('''
+    Dialog.C
+    Kernel.C
+    biblio.C
+    character.C
+    frnt_lang.C
+    tex_helpers.C
+    BCView.C
+    ButtonController.C
+    ButtonPolicies.C
+    ControlAboutlyx.C
+    ControlBibtex.C
+    ControlBox.C
+    ControlBranch.C
+    ControlCharacter.C
+    ControlChanges.C
+    ControlCitation.C
+    ControlCommand.C
+    ControlCommandBuffer.C
+    ControlDocument.C
+    ControlErrorList.C
+    ControlERT.C
+    ControlExternal.C
+    ControlFloat.C
+    ControlGraphics.C
+    ControlInclude.C
+    ControlLog.C
+    ControlViewSource.C
+    ControlMath.C
+    ControlNote.C
+    ControlParagraph.C
+    ControlPreamble.C
+    ControlPrefs.C
+    ControlPrint.C
+    ControlRef.C
+    ControlSearch.C
+    ControlSendto.C
+    ControlShowFile.C
+    ControlSpellchecker.C
+    ControlTabular.C
+    ControlTabularCreate.C
+    ControlTexinfo.C
+    ControlThesaurus.C
+    ControlToc.C
+    ControlVSpace.C
+    ControlWrap.C
+    helper_funcs.C
+    helper_funcs.h
+  ''')]
+  )
+
+
+#
+# src/frontend/qt3/4
+#
+
+frontend = env['frontend']
+env.BuildDir('#$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
+
+if frontend == 'qt3':
+  print "Processing files in src/frontends/qt3"
+
+  qt3env = env.Copy()
+
+  # load qt3 tools
+  qt3env.Tool('qt')
+
+  qt3env.Append(CPPPATH = [
+    '#$BUILDDIR/common',
+    '#$BUILDDIR/common/frontends',
+    '#$BUILDDIR/common/images',
+    '#$BUILDDIR/common/frontends/controllers',
+    '#$BUILDDIR/common/frontends/qt3',
+    '$QT_INC_DIR',
+    '.']
+  )
+  
+  qt3_ui_files = Split('''
+    BiblioModuleBase.ui
+    BranchesModuleBase.ui
+    BulletsModuleBase.ui
+    TextLayoutModuleBase.ui
+    LanguageModuleBase.ui
+    LaTeXModuleBase.ui
+    MarginsModuleBase.ui
+    NumberingModuleBase.ui
+    MathsModuleBase.ui
+    PageLayoutModuleBase.ui
+    PreambleModuleBase.ui
+    QAboutDialogBase.ui
+    QAskForTextDialog.ui
+    QBibitemDialogBase.ui
+    QBibtexDialogBase.ui
+    QBibtexAddDialogBase.ui
+    QBoxDialogBase.ui
+    QBranchDialogBase.ui
+    QChangesDialogBase.ui
+    QCharacterDialogBase.ui
+    QCitationDialogBase.ui
+    QCitationFindDialogBase.ui
+    QDelimiterDialogBase.ui
+    QDocumentDialogBase.ui
+    QErrorListDialogBase.ui
+    QERTDialogBase.ui
+    QExternalDialogBase.ui
+    QFloatDialogBase.ui
+    QGraphicsDialogBase.ui
+    QIncludeDialogBase.ui
+    QIndexDialogBase.ui
+    QLogDialogBase.ui
+    QViewSourceDialogBase.ui
+    QMathDialogBase.ui
+    QMathMatrixDialogBase.ui
+    QNoteDialogBase.ui
+    QParagraphDialogBase.ui
+    QPrefAsciiModule.ui
+    QPrefColorsModule.ui
+    QPrefConvertersModule.ui
+    QPrefCopiersModule.ui
+    QPrefCygwinPathModule.ui
+    QPrefDateModule.ui
+    QPrefDisplayModule.ui
+    QPrefFileformatsModule.ui
+    QPrefIdentityModule.ui
+    QPrefKeyboardModule.ui
+    QPrefLanguageModule.ui
+    QPrefLatexModule.ui
+    QPrefPathsModule.ui
+    QPrefPrinterModule.ui
+    QPrefScreenFontsModule.ui
+    QPrefsDialogBase.ui
+    QPrefSpellcheckerModule.ui
+    QPrefUIModule.ui
+    QPrintDialogBase.ui
+    QRefDialogBase.ui
+    QSearchDialogBase.ui
+    QSendtoDialogBase.ui
+    QShowFileDialogBase.ui
+    QSpellcheckerDialogBase.ui
+    QTabularCreateDialogBase.ui
+    QTabularDialogBase.ui
+    QTexinfoDialogBase.ui
+    QThesaurusDialogBase.ui
+    QTocDialogBase.ui
+    QURLDialogBase.ui
+    QVSpaceDialogBase.ui
+    QWrapDialogBase.ui
+  ''')
+  
+  
+  qt3_moc_files = ["#$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
+    BulletsModule.C
+    emptytable.C
+    FileDialog_private.C
+    floatplacement.C
+    iconpalette.C
+    lengthcombo.C
+    panelstack.C
+    QAboutDialog.C
+    QBibitemDialog.C
+    QBibtexDialog.C
+    QBoxDialog.C
+    QBranchDialog.C
+    QBrowseBox.C
+    QChangesDialog.C
+    QCharacterDialog.C
+    QCitationDialog.C
+    QCommandBuffer.C
+    QCommandEdit.C
+    QContentPane.C
+    QDelimiterDialog.C
+    QDocumentDialog.C
+    QErrorListDialog.C
+    QERTDialog.C
+    QExternalDialog.C
+    QFloatDialog.C
+    QGraphicsDialog.C
+    QIncludeDialog.C
+    QIndexDialog.C
+    QLogDialog.C
+    QViewSourceDialog.C
+    QLPopupMenu.C
+    QLPrintDialog.C
+    QMathDialog.C
+    QMathMatrixDialog.C
+    QNoteDialog.C
+    QParagraphDialog.C
+    QPrefsDialog.C
+    QRefDialog.C
+    QSearchDialog.C
+    QSendtoDialog.C
+    qsetborder.C
+    QShowFileDialog.C
+    QSpellcheckerDialog.C
+    QDialogView.C
+    QTabularCreateDialog.C
+    QTabularDialog.C
+    QTexinfoDialog.C
+    QThesaurusDialog.C
+    QTocDialog.C
+    qttableview.C
+    QtView.C
+    QURLDialog.C
+    QVSpaceDialog.C
+    QWrapDialog.C
+    QLToolbar.C
+    socket_callback.C
+    validators.C
+  ''')]
+  
+  # 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('$BUILDDIR/common/frontends/qt3/'+x.replace('.C', '.h')) for x in moc_files]
+  
+  qt3 = qt3env.StaticLibrary(
+    target = '$LOCALLIBPATH/qt3',
+    source = ["#$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
+      QDialogView.C
+      Alert_pimpl.C
+      Dialogs.C
+      FileDialog.C
+      LyXKeySymFactory.C
+      LyXScreenFactory.C
+      QLMenubar.C
+      qtTimeout.C
+      QAbout.C
+      QBibitem.C
+      QBibtex.C
+      QBox.C
+      QBranch.C
+      QChanges.C
+      QCharacter.C
+      QCitation.C
+      QDocument.C
+      QErrorList.C
+      QERT.C
+      QExternal.C
+      QFloat.C
+      QGraphics.C
+      QInclude.C
+      QIndex.C
+      QLImage.C
+      QLog.C
+      QViewSource.C
+      QLPainter.C
+      QLyXKeySym.C
+      QMath.C
+      QNote.C
+      QParagraph.C
+      QPrefs.C
+      QPrint.C
+      QRef.C
+      QSearch.C
+      QSendto.C
+      QShowFile.C
+      QSpellchecker.C
+      QTabular.C
+      QTabularCreate.C
+      QTexinfo.C
+      QThesaurus.C
+      QToc.C
+      QURL.C
+      QVSpace.C
+      QWorkArea.C
+      QWrap.C
+      Qt2BC.C
+      WorkAreaFactory.C
+      checkedwidgets.C
+      lyx_gui.C
+      lcolorcache.C
+      panelstack.C
+      qcoloritem.C
+      qfontexample.C
+      qfont_loader.C
+      qfont_metrics.C
+      qscreen.C
+      qt_helpers.C
+    ''')] +
+    qt3_moc_files + qt3_moced_files +
+    ['#$BUILDDIR/common/frontends/qt3/ui/' + x for x in qt3_ui_files]
+  )
+elif frontend == 'qt4':
+  print "Processing files in src/frontends/qt4"
+
+  qt4env = env.Copy()
+  
+  # local qt4 toolset from
+  # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
+  #
+  # NOTE: I have to patch qt4.py since it does not automatically
+  # process .C file!!! (add to cxx_suffixes )
+  #
+  if frontend == 'qt4':
+    qt4env.Tool('qt4', '.')
+    qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
+  
+  qt4env.Append(CPPPATH = [
+    '#$BUILDDIR/common',
+    '#$BUILDDIR/common/images',
+    '#$BUILDDIR/common/frontends',
+    '#$BUILDDIR/common/frontends/qt4',
+    '#$BUILDDIR/common/frontends/controllers',
+    '$QT_INC_PATH',
+    '$QT_INC_PATH/Qt',
+    '$QT_INC_PATH/QtCore',
+    '$QT_INC_PATH/QtGui']
+  )
+  
+  # FIXME: replace by something from pkg_config
+  qt4env.Append(CCFLAGS = [
+    '-DHAVE_CONFIG_H',
+    '-DQT_CLEAN_NAMESPACE',
+    '-DQT_GENUINE_STR',
+    '-DQT_NO_STL',
+    '-DQT3_SUPPORT',
+    '-Winvalid-pch']
+  )
+  
+  qt4_ui_files = Split('''
+    BiblioUi
+    BranchesUi
+    BulletsUi
+    TextLayoutUi
+    LanguageUi
+    LaTeXUi
+    MarginsUi
+    NumberingUi
+    MathsUi
+    PageLayoutUi
+    PreambleUi
+    QAboutUi
+    QAskForTextUi
+    QBibitemUi
+    QBibtexUi
+    QBibtexAddUi
+    QBoxUi
+    QBranchUi
+    QChangesUi
+    QCharacterUi
+    QCitationUi
+    QCitationFindUi
+    QDelimiterUi
+    QDocumentUi
+    QErrorListUi
+    QERTUi
+    QExternalUi
+    QFloatUi
+    QGraphicsUi
+    QIncludeUi
+    QIndexUi
+    QLogUi
+    QViewSourceUi
+    QMathUi
+    QMathMatrixUi
+    QNoteUi
+    QParagraphUi
+    QPrefAsciiUi
+    QPrefColorsUi
+    QPrefConvertersUi
+    QPrefCopiersUi
+    QPrefCygwinPathUi
+    QPrefDateUi
+    QPrefDisplayUi
+    QPrefFileformatsUi
+    QPrefIdentityUi
+    QPrefKeyboardUi
+    QPrefLanguageUi
+    QPrefLatexUi
+    QPrefPathsUi
+    QPrefPrinterUi
+    QPrefScreenFontsUi
+    QPrefsUi
+    QPrefSpellcheckerUi
+    QPrefUi
+    QPrintUi
+    QRefUi
+    QSearchUi
+    QSendtoUi
+    QShowFileUi
+    QSpellcheckerUi
+    QTabularCreateUi
+    QTabularUi
+    QTexinfoUi
+    QThesaurusUi
+    QTocUi
+    QURLUi
+    QVSpaceUi
+    QWrapUi
+  ''')
+  
+  qt4_moc_files = Split('''
+    BulletsModule.C
+    emptytable.C
+    FileDialog_private.C
+    floatplacement.C
+    iconpalette.C
+    lengthcombo.C
+    panelstack.C
+    QAboutDialog.C
+    QBibitemDialog.C
+    QBibtexDialog.C
+    QBoxDialog.C
+    QBranchDialog.C
+    QBranches.C
+    QChangesDialog.C
+    QCharacterDialog.C
+    QCitationDialog.C
+    QCommandBuffer.C
+    QCommandEdit.C
+    QDelimiterDialog.C
+    QDocumentDialog.C
+    QErrorListDialog.C
+    QERTDialog.C
+    QExternalDialog.C
+    QFloatDialog.C
+    QGraphicsDialog.C
+    QIncludeDialog.C
+    QIndexDialog.C
+    QLAction.C
+    QLogDialog.C
+    QViewSourceDialog.C
+    QViewSource.C
+    QLMenubar.C
+    QLPopupMenu.C
+    QLPrintDialog.C
+    QMathDialog.C
+    QMathMatrixDialog.C
+    QNoteDialog.C
+    QParagraphDialog.C
+    QPrefsDialog.C
+    QRefDialog.C
+    QSearchDialog.C
+    QSendtoDialog.C
+    qsetborder.C
+    QShowFileDialog.C
+    QSpellcheckerDialog.C
+    QDialogView.C
+    QTabularCreateDialog.C
+    QTabularDialog.C
+    QTexinfoDialog.C
+    QThesaurusDialog.C
+    TocModel.C
+    QTocDialog.C
+    QtView.C
+    QURLDialog.C
+    QVSpaceDialog.C
+    QWorkArea.C
+    QWrapDialog.C
+    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('''
+    QDialogView.C
+    Alert_pimpl.C
+    Dialogs.C
+    FileDialog.C
+    LyXKeySymFactory.C
+    LyXScreenFactory.C
+    QLMenubar.C
+    qtTimeout.C
+    QAbout.C
+    QBibitem.C
+    QBibtex.C
+    QBox.C
+    QBranch.C
+    QBranches.C
+    QChanges.C
+    QCharacter.C
+    QCitation.C
+    QDocument.C
+    QErrorList.C
+    QERT.C
+    QExternal.C
+    QFloat.C
+    QGraphics.C
+    QInclude.C
+    QIndex.C
+    QLAction.C
+    QLImage.C
+    QLog.C
+    QViewSource.C
+    QLPainter.C
+    QLyXKeySym.C
+    QMath.C
+    QNote.C
+    QParagraph.C
+    QPrefs.C
+    QPrint.C
+    QRef.C
+    QSearch.C
+    QSendto.C
+    QShowFile.C
+    QSpellchecker.C
+    QTabular.C
+    QTabularCreate.C
+    QTexinfo.C
+    QThesaurus.C
+    QToc.C
+    QURL.C
+    QVSpace.C
+    QWorkArea.C
+    QWrap.C
+    Qt2BC.C
+    WorkAreaFactory.C
+    checkedwidgets.C
+    lyx_gui.C
+    lcolorcache.C
+    panelstack.C
+    qfontexample.C
+    qfont_loader.C
+    qfont_metrics.C
+    qscreen.C
+    qt_helpers.C
+  ''')
+  
+  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]
+   )
+
+
+#
+# src/client
+#
+
+if 'client' in env['BUILD_TARGETS']:
+  env.BuildDir('#$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
+  
+  print "Processing files in src/client"
+  
+  lyxclient = env.Program(
+    target = '#$BUILDDIR/common/client/lyxclient',
+    LIBS = env['BOOST_LIBRARIES'] + env['socket_libs'],
+    source = ["#$BUILDDIR/common/client/%s" % x for x in Split('''
+      boost.C
+      client.C
+      debug.C
+      gettext.C
+      messages.C
+    ''')]
+  )
+  
+  env.copyFile('#$BUILDDIR/lyxclient', '#$BUILDDIR/common/client/lyxclient')
+#
+# tex2lyx
+#
+if 'tex2lyx' in env['BUILD_TARGETS']:
+  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.fileCopy('#$BUILDDIR/common/tex2lyx/FloatList.C', 'src/FloatList.C')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/Floating.C', 'src/Floating.C')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/counters.C', 'src/counters.C')
+  # for some reason I do not know, I have to copy the header files as well.
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxlayout.h', 'src/lyxlayout.h')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxlayout.C', 'src/lyxlayout.C')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxtextclass.h', 'src/lyxtextclass.h')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxtextclass.C', 'src/lyxtextclass.C')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxlex.C', 'src/lyxlex.C')
+  tex2lyx_env.fileCopy('#$BUILDDIR/common/tex2lyx/lyxlex_pimpl.C', '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
+    ''')]
+  )
+
+#
+# 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 = Split('''
+  Bidi.C
+  BufferView.C
+  BufferView_pimpl.C
+  Bullet.C
+  BranchList.C
+  Chktex.C
+  Color.C
+  CutAndPaste.C
+  DepTable.C
+  FloatList.C
+  Floating.C
+  FontIterator.C
+  FuncStatus.C
+  InsetList.C
+  LColor.C
+  LaTeX.C
+  LaTeXFeatures.C
+  LyXAction.C
+  MenuBackend.C
+  ParagraphParameters.C
+  PrinterParams.C
+  Spacing.C
+  Thesaurus.C
+  ToolbarBackend.C
+  author.C
+  boost.C
+  box.C
+  buffer.C
+  buffer_funcs.C
+  bufferlist.C
+  bufferparams.C
+  bufferview_funcs.C
+  changes.C
+  chset.C
+  converter.C
+  counters.C
+  coordcache.C
+  cursor.C
+  cursor_slice.C
+  debug.C
+  dimension.C
+  dociterator.C
+  encoding.C
+  errorlist.C
+  exporter.C
+  gettext.C
+  factory.C
+  format.C
+  funcrequest.C
+  graph.C
+  importer.C
+  intl.C
+  insetiterator.C
+  kbmap.C
+  kbsequence.C
+  language.C
+  session.C
+  lengthcommon.C
+  lyx_cb.C
+  lyx_main.C
+  lyx_sty.C
+  lyxfont.C
+  lyxfind.C
+  lyxfunc.C
+  lyxgluelength.C
+  lyxlayout.C
+  lyxlength.C
+  lyxlex.C
+  lyxlex_pimpl.C
+  lyxrc.C
+  lyxrow.C
+  lyxrow_funcs.C
+  lyxserver.C
+  lyxsocket.C
+  lyxtextclass.C
+  lyxtextclasslist.C
+  lyxvc.C
+  messages.C
+  metricsinfo.C
+  mover.C
+  output.C
+  outputparams.C
+  output_docbook.C
+  output_latex.C
+  output_linuxdoc.C
+  output_plaintext.C
+  paragraph.C
+  paragraph_funcs.C
+  paragraph_pimpl.C
+  pariterator.C
+  SpellBase.C
+  rowpainter.C
+  sgml.C
+  tabular.C
+  tex-accent.C
+  tex-strings.C
+  texrow.C
+  text.C
+  text2.C
+  text3.C
+  TocBackend.C
+  toc.C
+  trans.C
+  trans_mgr.C
+  undo.C
+  vc-backend.C
+  version.C
+  vspace.C
+  main.C
+''')
+
+if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
+  lyx_source.append('aspell.C')
+elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
+  lyx_source.append('pspell.C')
+elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
+  lyx_source.append('ispell.C')
+
+env.BuildDir('#$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
+#
+# Build lyx with given frontend
+#
+lyx = env.Program(
+  target = '#$BUILDDIR/$frontend/lyx',
+  source = ["#$BUILDDIR/common/%s" % x for x in lyx_source],
+  LIBS = [
+    'mathed',
+    'insets',
+    'frontends',
+    env['frontend'],
+    'controllers',
+    'graphics',
+    'supports'] +
+    env['BOOST_LIBRARIES'] +
+    env['EXTRA_LIBS'] +
+    env['SYSTEM_LIBS']
+)
+
diff --git a/development/scons/SConstruct b/development/scons/SConstruct
new file mode 100644 (file)
index 0000000..b0ebacf
--- /dev/null
@@ -0,0 +1,884 @@
+# 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)
+#  
+#    scons [frontend=qt3|gt4] [boost=included|auto] ...
+#
+# Where:
+#   * use scons -h for details about parameters
+#   * qt3 is used by default on linux, cygwin and mac
+#   * qt4 is used by default on win32
+#
+# File layouts (Important):
+#   * Unless you specify builddir=dir, building will happen
+#     in $BUILDDIR = $mode/$platform-$frontend. E.g., something like
+#       debug/linux-qt3/
+#   * All shared libs will be put in $BUILDDIR/libs, e.g.
+#       debug/linux-qt3/libs
+#   * lyx executable will be in directories like debug/linux-qt3
+#  
+# Hints:
+#   * 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)
+#
+#   * (Important) use scons logfile=logfile.log to enable command line
+#     logging. (default is no logging)
+#
+# 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
+#       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
+#
+#   * rpm support?
+#     http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/RpmHonchoTemp
+#
+#   However, I decide to wait since scons seems to be standardizing these
+#   features.
+#
+
+import os, sys
+
+# 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
+#----------------------------------------------------------
+
+# FIXME: I remember lyx requires higher version of python?
+EnsurePythonVersion(1, 5)
+# Please use at least 0.96.91 (not 0.96.1)
+EnsureSConsVersion(0, 96)
+
+# I am in TOP_SRC_DIR/developement/scons
+TOP_SRC_DIR = '../..'
+
+#----------------------------------------------------------
+# Global definitions
+#----------------------------------------------------------
+
+# some global settings
+PACKAGE_VERSION = '1.5.0svn'
+DEVEL_VERSION = True
+default_build_mode = 'debug'
+
+PACKAGE = 'lyx'
+PACKAGE_BUGREPORT = 'lyx-devel@lists.lyx.org'
+PACKAGE_NAME = 'LyX'
+PACKAGE_TARNAME = 'lyx'
+PACKAGE_STRING = '%s %s' % (PACKAGE_NAME, PACKAGE_VERSION)
+PROGRAM_SUFFIX = ''
+default_log_file = 'scons_lyx.log'
+
+# 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.
+#
+if os.name == 'nt':
+  platform_name = 'win32'
+  default_frontend = 'qt4'
+  # boost and gettext are unlikely to be installed already
+  default_boost_opt = 'included'
+  default_gettext_opt = 'included'
+  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).
+  # If not specified, boost tries to figure out by itself, but it may fail.
+  boost_posix = False
+  packaging_method = 'windows'
+elif os.name == 'posix' and sys.platform != 'cygwin':
+  platform_name = sys.platform
+  default_frontend = 'qt3'
+  # try to use system boost/gettext libraries
+  default_boost_opt = 'auto'
+  default_gettext_opt = 'auto'
+  default_pch_opt = False
+  default_with_x = True
+  boost_posix = True
+  packaging_method = 'posix'
+elif os.name == 'posix' and sys.platform == 'cygwin':
+  platform_name = 'cygwin'
+  default_frontend = 'qt3'
+  # force the use of cygwin/boost/gettext
+  default_boost_opt = 'system'
+  default_gettext_opt = 'system'
+  default_pch_opt = False
+  default_with_x = True
+  boost_posix = True
+  packaging_method = 'posix'
+elif os.name == 'darwin':
+  platform_name = 'mac'
+  default_frontend = 'qt3'
+  # to be safe
+  default_boost_opt = 'included'
+  default_gettext_opt = 'included'
+  default_pch_opt = False
+  default_with_x = False
+  boost_posix = True
+  packaging_method = 'msc'
+else:  # unsupported system
+  platform_name = 'others'
+  default_frontend = 'qt3'
+  # to be safe
+  default_boost_opt = 'included'
+  default_gettext_opt = 'included'
+  default_pch_opt = False
+  default_with_x = True
+  boost_posix = False
+  packaging_method = 'posix'
+
+#---------------------------------------------------------
+# 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.AddOptions(
+  # 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.', 
+    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', 
+    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', '.'),
+  # 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
+  BoolOption('assertions', 'Use assertions', True),
+  # enable warning, (config.h has  WITH_WARNINGS)
+  BoolOption('warnings', 'Use warnings', True),
+  # 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),
+  # FIXME: not implemented
+  PathOption('prefix', '(NA) install architecture-independent files in PREFIX', '.'),
+  # FIXME: not implemented
+  PathOption('exec_prefix', '(NA) 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),
+  # FIXME: not implemented
+  PathOption('intl_prefix', '(NA) Path to intl library', '.'),
+  # 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', ''),
+)  
+
+# Determine the frontend to use
+frontend = ARGUMENTS.get('frontend', default_frontend)
+use_X11 = ARGUMENTS.get('X11', default_with_x)
+
+#---------------------------------------------------------
+# Setting up environment
+#---------------------------------------------------------
+
+env = Environment(
+  options = opts 
+)
+
+# set environment 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
+
+# speed up source file processing
+#env['CPPSUFFIXES'] = ['.C', '.cc', '.cpp']
+#env['CXXSUFFIX'] = ['.C']
+
+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  
+  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])
+
+getEnvVariable(env, 'CC')
+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
+if platform_name in ['win32', 'cygwin']:
+  env['CC'] = 'g++'
+  env['LINK'] = 'g++'
+
+#
+# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
+# 
+env['frontend'] = frontend
+env['mode'] = ARGUMENTS.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 
+# $mode can be debug or release
+if ARGUMENTS.has_key('build_dir'):
+  build_dir = ARGUMENTS['build_dir']
+  env['BUILDDIR'] = build_dir
+else:
+  # Determine the name of the build (platform+frontend
+  env['BUILDDIR'] = env['mode']
+# all built libraries will go to build_dir/libs
+# (This is different from the make file approach)
+env['LOCALLIBPATH'] = '#$BUILDDIR/libs'
+env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
+
+#
+# QTDIR, QT_LIB_PATH, QT_INC_PATH
+#
+if platform_name == 'win32':
+  env.Tool('mingw')
+
+if ARGUMENTS.has_key('qt_dir'):
+  env['QTDIR'] = ARGUMENTS['qt_dir']
+  # add path to the qt tools
+  env.AppendUnique(LIBPATH = [os.path.join(ARGUMENTS['qt_dir'], 'lib')])
+  env.AppendUnique(CPPPATH = [os.path.join(ARGUMENTS['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(ARGUMENTS['qt_dir'], 'bin'))
+else:
+  env['QTDIR'] = os.environ.get('QTDIR', '/usr/lib/qt-3.3')
+
+if ARGUMENTS.has_key('qt_lib_path'):
+  env['QT_LIB_PATH'] = ARGUMENTS['qt_lib_path']
+else:
+  env['QT_LIB_PATH'] = '$QTDIR/lib'
+env.AppendUnique(LIBPATH = ['$QT_LIB_PATH'])
+# qt4 seems to be using pkg_config
+env.PrependENVPath('PKG_CONFIG_PATH', env.subst('$QT_LIB_PATH'))
+
+if ARGUMENTS.has_key('qt_inc_path'):
+  env['QT_INC_PATH'] = ARGUMENTS['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'])  
+
+#
+# extra_inc_path and extra_lib_path
+#
+if ARGUMENTS.has_key('extra_inc_path'):
+  env.AppendUnique(CPPPATH = [ARGUMENTS['extra_inc_path']])
+if ARGUMENTS.has_key('extra_lib_path'):
+  env.AppendUnique(LIBPATH = [ARGUMENTS['extra_lib_path']])
+if ARGUMENTS.has_key('extra_inc_path1'):
+  env.AppendUnique(CPPPATH = [ARGUMENTS['extra_inc_path1']])
+if ARGUMENTS.has_key('extra_lib_path1'):
+  env.AppendUnique(LIBPATH = [ARGUMENTS['extra_lib_path1']])
+if ARGUMENTS.has_key('aikasurus_path'):
+  env.AppendUnique(LIBPATH = [ARGUMENTS['aikasurus_path']])
+
+#
+# this is a bit out of place (after auto-configration)
+# but it is required to do the tests.
+if platform_name == 'win32':
+  env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
+
+#----------------------------------------------------------
+# Autoconf business 
+#----------------------------------------------------------
+
+conf = Configure(env,
+  custom_tests = {
+    'CheckPkgConfig' : utils.checkPkgConfig,
+    'CheckPackage' : utils.checkPackage,
+    'CheckPutenv' : utils.checkPutenv,
+    'CheckIstreambufIterator' : utils.checkIstreambufIterator,
+    'CheckMkdirOneArg' : utils.checkMkdirOneArg,
+    'CheckStdCount' : utils.checkStdCount,
+    'CheckSelectArgType' : utils.checkSelectArgType,
+    'CheckBoostLibraries' : utils.checkBoostLibraries,
+  }
+)
+
+# pkg-config? (if not, we use hard-coded options)
+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
+
+# zlib? This is required.
+if 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':
+  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', 'Qt3Support']:
+      # 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
+env['socket_libs'] = []
+if conf.CheckLib('socket'):
+  env.AppendUnique(socket_libs = ['socket'])
+
+# FIXME: What is nsl, is it related to socket?
+if conf.CheckLib('nsl'):
+  env.AppendUnique(socket_libs = ['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
+# 
+
+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
+
+# 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')
+]
+
+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['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"
+  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)
+
+# 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)
+
+# 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)
+
+# 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)
+
+#
+# Finish auto-configuration
+env = conf.Finish()
+
+#----------------------------------------------------------
+# Now set up our build process accordingly 
+#----------------------------------------------------------
+
+#
+# QT_LIB etc (EXTRA_LIBS holds lib for each frontend)
+#
+# NOTE: Tool('qt') or Tool('qt4') will be loaded later
+# in their respective directory and specialized env.
+try:
+  if frontend == 'qt3':
+    # note: env.Tool('qt') my set QT_LIB to qt
+    env['QT_LIB'] = 'qt-mt'
+    env['EXTRA_LIBS'] += ['qt-mt']
+    if platform_name == 'cygwin' and use_X11:
+      env['EXTRA_LIBS'] += ['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
+        'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv',
+        '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', 'Qt3Support4']
+    else:
+      env['QT_LIB'] = ['QtCore', 'QtGui', 'Qt3Support']
+    env['EXTRA_LIBS'] += [x for x in env['QT_LIB']]
+except:
+  print "Can not locate qt tools"
+  print "What I get is "
+  print "  QTDIR: ", env['QTDIR']
+
+if platform_name == 'win32':
+  env['SYSTEM_LIBS'] = ['shlwapi', 'zlib1']
+elif platform_name == 'cygwin':
+  env['SYSTEM_LIBS'] = ['shlwapi', 'z']
+else:
+  env['SYSTEM_LIBS'] = ['z']
+
+#
+# Build parameters CPPPATH etc
+#
+# boost is always in
+env.AppendUnique(CPPPATH = ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src'])
+
+# TODO: add (more) appropriate compiling options (-DNDEBUG etc)
+# for debug/release mode 
+if ARGUMENTS.get('mode', default_build_mode) == 'debug':
+  env.AppendUnique(CCFLAGS = [])
+else:
+  env.AppendUnique(CCFLAGS = [])
+
+#
+# Customized builders
+#
+# install customized builders
+env['BUILDERS']['substFile'] = Builder(action = utils.env_subst)
+# FIXME: there must be a better way.
+env['BUILDERS']['fileCopy'] = Builder(action = utils.env_filecopy)
+
+#
+# A Link script for cygwin see
+# 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':
+  ld_script_path = '/usr/lib/qt3/mkspecs/cygwin-g++'
+  ld_script = utils.installCygwinLDScript(ld_script_path)
+  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('#'))
+env['PROGRAM_SUFFIX'] = PROGRAM_SUFFIX
+# needed by src/version.C.in => src/version.C
+env['PACKAGE_VERSION'] = PACKAGE_VERSION
+# fill in the version info
+env['VERSION_INFO'] = '''Configuration
+  Host type:                      %s
+  Special build flags:            %s
+  C   Compiler:                   %s
+  C   Compiler flags:             %s %s
+  C++ Compiler:                   %s
+  C++ Compiler LyX flags:         %s
+  C++ Compiler flags:             %s %s
+  Linker flags:                   %s
+  Linker user flags:              %s
+Build info: 
+  Builing directory:              %s
+  Local library directory:        %s
+  Libraries pathes:               %s
+  Boost libraries:                %s
+  Extra libraries:                %s
+  System libraries:               %s
+Frontend: 
+  Frontend:                       %s
+  Packaging:                      %s
+  LyX binary dir:                 FIXME
+  LyX files dir:                  FIXME
+''' % (platform_name, 
+  env.subst('$CCFLAGS'), env.subst('$CC'),
+  env.subst('$CPPFLAGS'), env.subst('$CFLAGS'),
+  env.subst('$CXX'), env.subst('$CXXFLAGS'),
+  env.subst('$CPPFLAGS'), env.subst('$CXXFLAGS'),
+  env.subst('$LINKFLAGS'), env.subst('$LINKFLAGS'),
+  env.subst('$BUILDDIR'), env.subst('$LOCALLIBPATH'),
+  str(env['LIBPATH']), str(env['BOOST_LIBRARIES']),
+  str(env['EXTRA_LIBS']), str(env['SYSTEM_LIBS']),
+  env['frontend'], packaging_method)
+
+if env['frontend'] in ['qt3', 'qt4']:
+  env['VERSION_INFO'] += '''  include dir:                    %s
+  library dir:                    %s
+  X11:                            %s
+''' % (env.subst('$QT_INC_PATH'), env.subst('$QT_LIB_PATH'), use_X11)
+
+print env['VERSION_INFO']
+
+#
+# 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)
+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 
+# Command: %s
+# Info: %s
+''' % (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))
+
+
+
+#----------------------------------------------------------
+# Start building
+#----------------------------------------------------------
+Export('env')
+
+SConsignFile(os.path.abspath('%s/sconsign' % env['BUILDDIR']))
+
+print "Building all targets recursively"
+
+# Now, specification of targets is difficult
+# we can do this though:
+#
+env['BUILD_TARGETS'] = BUILD_TARGETS
+
+env.SConscript('SConscript', duplicate = 0)
+
+
diff --git a/development/scons/qt4.py b/development/scons/qt4.py
new file mode 100644 (file)
index 0000000..8b3bc7f
--- /dev/null
@@ -0,0 +1,376 @@
+import re
+import os.path
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+
+class ToolQtWarning(SCons.Warnings.Warning):
+       pass
+class GeneratedMocFileNotIncluded(ToolQtWarning):
+       pass
+class QtdirNotFound(ToolQtWarning):
+       pass
+SCons.Warnings.enableWarningClass(ToolQtWarning)
+
+qrcinclude_re = re.compile(r'<file>([^<]*)</file>', re.M)
+
+
+header_extensions = [".h", ".hxx", ".hpp", ".hh"]
+if SCons.Util.case_sensitive_suffixes('.h', '.H'):
+       header_extensions.append('.H')
+#cplusplus = __import__('c++', globals(), locals(), ['Scons.Tools'])
+#cxx_suffixes = cplusplus.CXXSuffixes
+cxx_suffixes = [".C", ".c", ".cxx", ".cpp", ".cc"]
+
+def _checkMocIncluded(target, source, env):
+       moc = target[0]
+       cpp = source[0]
+       # looks like cpp.includes is cleared before the build stage :-(
+       # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/
+       path = SCons.Defaults.CScan.path_function(env, moc.cwd)
+       includes = SCons.Defaults.CScan(cpp, env, path)
+       if not moc in includes:
+               SCons.Warnings.warn(
+                       GeneratedMocFileNotIncluded,
+                       "Generated moc file '%s' is not included by '%s'" %
+                       (str(moc), str(cpp)))
+
+def _find_file(filename, paths, node_factory):
+       retval = None
+       for dir in paths:
+               node = node_factory(filename, dir)
+               if node.rexists():
+                       return node
+       return None
+
+class _Automoc:
+       """
+       Callable class, which works as an emitter for Programs, SharedLibraries and
+       StaticLibraries.
+       """
+
+       def __init__(self, objBuilderName):
+               self.objBuilderName = objBuilderName
+               
+       def __call__(self, target, source, env):
+               """
+               Smart autoscan function. Gets the list of objects for the Program
+               or Lib. Adds objects and builders for the special qt files.
+               """
+               try:
+                       if int(env.subst('$QT_AUTOSCAN')) == 0:
+                               return target, source
+               except ValueError:
+                       pass
+               try:
+                       debug = int(env.subst('$QT_DEBUG'))
+               except ValueError:
+                       debug = 0
+               
+               # some shortcuts used in the scanner
+               FS = SCons.Node.FS.default_fs
+               splitext = SCons.Util.splitext
+               objBuilder = getattr(env, self.objBuilderName)
+
+               # some regular expressions:
+               # Q_OBJECT detection
+               q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]') 
+               # cxx and c comment 'eater'
+               #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)')
+               # CW: something must be wrong with the regexp. See also bug #998222
+               #     CURRENTLY THERE IS NO TEST CASE FOR THAT
+               
+               # The following is kind of hacky to get builders working properly (FIXME)
+               objBuilderEnv = objBuilder.env
+               objBuilder.env = env
+               mocBuilderEnv = env.Moc4.env
+               env.Moc4.env = env
+               
+               # make a deep copy for the result; MocH objects will be appended
+               out_sources = source[:]
+
+               for obj in source:
+                       if not obj.has_builder():
+                               # binary obj file provided
+                               if debug:
+                                       print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
+                               continue
+                       cpp = obj.sources[0]
+                       if not splitext(str(cpp))[1] in cxx_suffixes:
+                               if debug:
+                                       print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp) 
+                               # c or fortran source
+                               continue
+                       #cpp_contents = comment.sub('', cpp.get_contents())
+                       cpp_contents = cpp.get_contents()
+                       h=None
+                       for h_ext in header_extensions:
+                               # try to find the header file in the corresponding source
+                               # directory
+                               hname = splitext(cpp.name)[0] + h_ext
+                               h = _find_file(hname,
+                                                         (cpp.get_dir(),),
+                                                         FS.File)
+                               if h:
+                                       if debug:
+                                               print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
+                                       #h_contents = comment.sub('', h.get_contents())
+                                       h_contents = h.get_contents()
+                                       break
+                       if not h and debug:
+                               print "scons: qt: no header for '%s'." % (str(cpp))
+                       if h and q_object_search.search(h_contents):
+                               # h file with the Q_OBJECT macro found -> add moc_cpp
+                               moc_cpp = env.Moc4(h)
+                               moc_o = objBuilder(moc_cpp)
+                               out_sources.append(moc_o)
+                               #moc_cpp.target_scanner = SCons.Defaults.CScan
+                               if debug:
+                                       print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
+                       if cpp and q_object_search.search(cpp_contents):
+                               # cpp file with Q_OBJECT macro found -> add moc
+                               # (to be included in cpp)
+                               moc = env.Moc4(cpp)
+                               env.Ignore(moc, moc)
+                               if debug:
+                                       print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
+                               #moc.source_scanner = SCons.Defaults.CScan
+               # restore the original env attributes (FIXME)
+               objBuilder.env = objBuilderEnv
+               env.Moc4.env = mocBuilderEnv
+
+               return (target, out_sources)
+
+AutomocShared = _Automoc('SharedObject')
+AutomocStatic = _Automoc('StaticObject')
+
+def _detect(env):
+       """Not really safe, but fast method to detect the QT library"""
+
+       QTDIR = env.get('QTDIR',None)
+       if QTDIR!=None : return QTDIR
+
+       QTDIR = os.environ.get('QTDIR',None)
+       if QTDIR!=None : return QTDIR
+
+       moc = env.WhereIs('moc-qt4') or env.WhereIs('moc')
+       if moc:
+               SCons.Warnings.warn(
+                       QtdirNotFound,
+                       "QTDIR variable is not defined, using moc executable as a hint (QTDIR=%s)" % QTDIR)
+               return os.path.dirname(os.path.dirname(moc))
+
+       SCons.Warnings.warn(
+               QtdirNotFound,
+               "Could not detect qt, using empty QTDIR")
+       return None
+
+def generate(env):
+       """Add Builders and construction variables for qt to an Environment."""
+
+       print "Loading qt4 tool..."
+
+       def locateQt4Command(env, command, qtdir) :
+               fullpath1 = os.path.join(qtdir,'bin',command +'-qt4')
+               if os.access(fullpath1, os.X_OK) or \
+                       os.access(fullpath1+".exe", os.X_OK):
+                       return fullpath1
+               fullpath2 = os.path.join(qtdir,'bin',command)
+               if os.access(fullpath2, os.X_OK) or \
+                       os.access(fullpath2+".exe", os.X_OK):
+                       return fullpath2
+               fullpath = env.Detect([command+'-qt4', command])
+               if not (fullpath is None) : return fullpath
+               raise "Qt4 command '" + command + "' not found. Tried: " + fullpath1 + " and "+ fullpath2
+               
+
+       CLVar = SCons.Util.CLVar
+       Action = SCons.Action.Action
+       Builder = SCons.Builder.Builder
+       splitext = SCons.Util.splitext
+
+       # the basics
+       env['QTDIR']  = _detect(env)
+       env['QT4_MOC'] = locateQt4Command(env,'moc', env['QTDIR'])
+       env['QT4_UIC'] = locateQt4Command(env,'uic', env['QTDIR'])
+       env['QT4_RCC'] = locateQt4Command(env,'rcc', env['QTDIR'])
+       env['QT4_LUPDATE'] = locateQt4Command(env,'lupdate', env['QTDIR'])
+       env['QT4_LRELEASE'] = locateQt4Command(env,'lrelease', env['QTDIR'])
+
+       # Should the qt tool try to figure out, which sources are to be moc'ed ?
+       env['QT4_AUTOSCAN'] = 1
+
+       # Some QT specific flags. I don't expect someone wants to
+       # manipulate those ...
+       env['QT4_UICDECLFLAGS'] = CLVar('')
+       env['QT4_MOCFROMHFLAGS'] = CLVar('')
+       env['QT4_MOCFROMCXXFLAGS'] = CLVar('-i')
+       env['QT4_QRCFLAGS'] = ''
+
+       # suffixes/prefixes for the headers / sources to generate
+       env['QT4_MOCHPREFIX'] = 'moc_'
+       env['QT4_MOCHSUFFIX'] = '$CXXFILESUFFIX'
+       env['QT4_MOCCXXPREFIX'] = 'moc_'
+       env['QT4_MOCCXXSUFFIX'] = '.moc'
+       env['QT4_UISUFFIX'] = '.ui'
+       env['QT4_UICDECLPREFIX'] = 'ui_'
+       env['QT4_UICDECLSUFFIX'] = '.h'
+       env['QT4_QRCSUFFIX'] = '.qrc',
+       env['QT4_QRCCXXSUFFIX'] = '$CXXFILESUFFIX'
+       env['QT4_QRCCXXPREFIX'] = 'qrc_'
+
+       env['QT4_LIB'] = '' # KLUDGE to avoid linking qt3 library
+
+       # Translation builder
+       tsbuilder = Builder(
+               action ='$QT4_LUPDATE $SOURCES -ts $TARGETS',
+               multi=1
+               )
+       env.Append( BUILDERS = { 'Ts': tsbuilder } )
+       qmbuilder = Builder(
+               action =[
+                       '$QT4_LRELEASE $SOURCE',
+                       ],
+               src_suffix = '.ts',
+               suffix = '.qm',
+               single_source = True
+               )
+       env.Append( BUILDERS = { 'Qm': qmbuilder } )
+
+       # Resource builder
+       def scanResources(node, env, path, arg):
+               contents = node.get_contents()
+               includes = qrcinclude_re.findall(contents)
+               return includes
+       qrcscanner = env.Scanner(name = 'qrcfile',
+               function = scanResources,
+               argument = None,
+               skeys = ['.qrc'])
+       qrcbuilder = Builder(
+               action ='$QT4_RCC $QT4_QRCFLAGS $SOURCE -o $TARGET',
+               source_scanner = qrcscanner,
+               src_suffix = '$QT4_QRCSUFFIX',
+               suffix = '$QT4_QRCCXXSUFFIX',
+               prefix = '$QT4_QRCCXXPREFIX',
+               single_source = True
+               )
+       env.Append( BUILDERS = { 'Qrc': qrcbuilder } )
+
+       # Interface builder
+       #env['QT4_UIC4COM'] = [
+       #       CLVar('$QT4_UIC $QT4_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'),
+       #       ]
+       env['QT4_UIC4COM'] = '$QT4_UIC -o $TARGET $SOURCE'
+       uic4builder = Builder(
+               action='$QT4_UIC4COM',
+               src_suffix='$QT4_UISUFFIX',
+               suffix='$QT4_UICDECLSUFFIX',
+               #prefix='$QT4_UICDECLPREFIX',
+               single_source = True
+               )
+       env.Append( BUILDERS = { 'Uic4': uic4builder } )
+
+       # Metaobject builder
+       env['QT4_MOCFROMHCOM'] = (
+               '$QT4_MOC $QT4_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE')
+       env['QT4_MOCFROMCXXCOM'] = [
+               CLVar('$QT4_MOC $QT4_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'),
+               Action(_checkMocIncluded,None)]
+       mocBld = Builder(action={}, prefix={}, suffix={})
+       for h in header_extensions:
+               mocBld.add_action(h, '$QT4_MOCFROMHCOM')
+               mocBld.prefix[h] = '$QT4_MOCHPREFIX'
+               mocBld.suffix[h] = '$QT4_MOCHSUFFIX'
+       for cxx in cxx_suffixes:
+               mocBld.add_action(cxx, '$QT4_MOCFROMCXXCOM')
+               mocBld.prefix[cxx] = '$QT4_MOCCXXPREFIX'
+               mocBld.suffix[cxx] = '$QT4_MOCCXXSUFFIX'
+       env.Append( BUILDERS = { 'Moc4': mocBld } )
+
+       # er... no idea what that was for
+       static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+       static_obj.src_builder.append('Uic4')
+       shared_obj.src_builder.append('Uic4')
+
+       # We use the emitters of Program / StaticLibrary / SharedLibrary
+       # to scan for moc'able files
+       # We can't refer to the builders directly, we have to fetch them
+       # as Environment attributes because that sets them up to be called
+       # correctly later by our emitter.
+       env.AppendUnique(PROGEMITTER =[AutomocStatic],
+                                        SHLIBEMITTER=[AutomocShared],
+                                        LIBEMITTER  =[AutomocStatic],
+                                        # Of course, we need to link against the qt libraries
+                                        CPPPATH=[os.path.join('$QTDIR', 'include')],
+                                        LIBPATH=[os.path.join('$QTDIR', 'lib')],
+                                        LIBS=['$QT4_LIB'])
+       
+       import new
+       method = new.instancemethod(enable_modules, env, SCons.Environment)
+       env.EnableQt4Modules=method
+
+def enable_modules(self, modules, debug=False) :
+       import sys
+
+       validModules = [
+               'QtCore',
+               'QtGui',
+               'QtOpenGL',
+               'Qt3Support',
+               # The next modules have not been tested yet so, please
+               # maybe they require additional work on non Linux platforms
+               'QtSql',
+               'QtNetwork',
+               'QtSvg',
+               'QtTest',
+               'QtXml',
+               'QtUiTools',
+               ]
+       pclessModules = [
+               'QtUiTools',
+               'QtUiTools_debug',
+       ]
+       # under windows, they are named QtCore4 etc
+       validModules += [x+'4' for x in validModules]
+       pclessModules += [x+'4' for x in pclessModules]
+       invalidModules=[]
+       for module in modules:
+               if module not in validModules :
+                       invalidModules.append(module)
+       if invalidModules :
+               raise "Modules %s are not Qt4 modules. Valid Qt4 modules are: %s"% \
+                       (str(invalidModules),str(validModules))
+
+       # TODO: Check whether we should add QT_CORE_LIB, QT_XML_LIB, QT_NETWORK_LIB...
+       if 'QtGui' in modules:
+               self.AppendUnique(CPPFLAGS='-DQT_GUI_LIB')
+
+       if sys.platform == "linux2" :
+               if debug : modules = [module+"_debug" for module in modules]
+               for module in modules :
+                       if module in pclessModules :
+                       #       self.AppendUnique(LIBS=[module])
+                               self.AppendUnique(LIBPATH=[os.path.join(self["QTDIR"],"lib",module)])
+                               self.AppendUnique(CPPPATH=[os.path.join(self["QTDIR"],"include","qt4",module)])
+                               modules.remove(module)
+               self.ParseConfig('PKG_CONFIG_PATH=%s/lib pkg-config %s --libs --cflags'%
+               (
+                       self['QTDIR'],
+                       ' '.join(modules)))
+               return
+       if sys.platform == "win32" :
+               if debug : debugSuffix = 'd'
+               else : debugSuffix = ''
+               self.AppendUnique(LIBS=[lib+'4'+debugSuffix for lib in modules])
+               if 'QtOpenGL' in modules:
+                       self.AppendUnique(LIBS=['opengl32'])
+               self.AppendUnique(CPPPATH=[ '$QTDIR/include/'+module
+                       for module in modules])
+               self.AppendUnique(LIBPATH=['$QTDIR/lib'])
+
+
+def exists(env):
+       return _detect(env)
+
diff --git a/development/scons/scons_utils.py b/development/scons/scons_utils.py
new file mode 100644 (file)
index 0000000..5bb0eb6
--- /dev/null
@@ -0,0 +1,779 @@
+# vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
+#
+# file scons_utils.py
+# 
+# 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 file defines all the utility functions for the
+# scons-based build system of lyx
+# 
+
+import os, sys, re, shutil, glob
+
+config_h = os.path.join('src', 'config.h')
+
+def writeToFile(filename, lines, append = False):
+  " utility function: write or append lines to filename "
+  if append:
+    file = open(filename, 'a')
+  else:
+    file = open(filename, 'w')
+  file.write(lines)
+  file.close()
+
+
+def addToConfig(lines, top_src_dir):
+  ''' utility function: shortcut for appending lines to outfile
+    add newline at the end of lines.
+  '''
+  if lines.strip() != '':
+    writeToFile(os.path.join(top_src_dir, config_h), lines + '\n\n', append = True)
+
+
+def printEnvironment(env, keys=[]):
+  ''' used to check profile settings '''
+  dict = env.Dictionary()
+  if len(keys) == 0:
+    keys = dict.keys()
+  keys.sort()
+  for key in keys:
+    try:
+      # try to expand, but this is not always possible
+      print key, '=', env.subst('$'+key)
+    except:   
+      print '<<UNEXPANDED>>:', key, '=', dict[key]
+
+
+def env_subst(target, source, env):
+  ''' subst variables in source by those in env, and output to target
+    source and target are scons File() objects
+
+    %key% (not key itself) is an indication of substitution
+  '''
+  assert len(target) == 1
+  assert len(source) == 1
+  target_file = file(str(target[0]), "w")
+  source_file = file(str(source[0]), "r")
+  
+  contents = source_file.read()
+  for k in env.get('SUBST_KEYS', []):
+    if not env.has_key(k):
+      print "Failed to subst key ", k, " from file", str(source[0])
+      raise
+    contents = re.sub('@'+k+'@', env.subst('$'+k).replace('\n',r'\\n\\\n'), contents)
+  target_file.write(contents + "\n")
+  target_file.close()
+  #st = os.stat(str(source[0]))
+  #os.chmod(str(target[0]), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+
+def env_filecopy(target, source, env):
+  shutil.copy(str(source[0]), str(target[0]))
+
+
+#
+# autoconf tests
+#
+
+def checkPkgConfig(conf, version):
+  ''' Return false if pkg_config does not exist, or is too old '''
+  conf.Message('Checking for pkg-config...')
+  ret = conf.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
+  conf.Result(ret)
+  return ret
+
+
+def checkPackage(conf, pkg):
+  ''' check if pkg is under the control of conf '''
+  conf.Message('Checking for package %s...' % pkg)
+  ret = conf.TryAction("pkg-config --print-errors --exists %s" % pkg)[0]
+  conf.Result(ret)
+  return ret
+
+
+def startConfigH(top_src_dir):
+  ''' Write the first part of config.h '''
+  writeToFile(os.path.join(top_src_dir, config_h), 
+'''/* src/config.h.  Generated by scon.  */
+
+/* -*- C++ -*- */
+/*
+ * \file config.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * This is the compilation configuration file for LyX.
+ * It was generated by scon.
+ * You might want to change some of the defaults if something goes wrong
+ * during the compilation.
+ */
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+''')
+
+
+def endConfigH(top_src_dir):
+  ''' Write the last part of config.h '''
+  writeToFile(os.path.join(top_src_dir, config_h), '''
+/************************************************************
+ ** You should not need to change anything beyond this point */
+
+#ifndef HAVE_STRERROR
+#if defined(__cplusplus)
+extern "C"
+#endif
+char * strerror(int n);
+#endif
+
+#ifdef HAVE_MKSTEMP
+#ifndef HAVE_DECL_MKSTEMP
+#if defined(__cplusplus)
+extern "C"
+#endif
+int mkstemp(char*);
+#endif
+#endif
+
+#ifdef __EMX__
+#  include "support/os2_defines.h"
+#endif
+
+#if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM)
+#  define USE_BOOST_FORMAT 1
+#else
+#  define USE_BOOST_FORMAT 0
+#endif
+
+#define BOOST_USER_CONFIG <config.h>
+
+#if !defined(ENABLE_ASSERTIONS)
+#  define BOOST_DISABLE_ASSERTS 1
+#endif
+#define BOOST_ENABLE_ASSERT_HANDLER 1
+
+#define BOOST_DISABLE_THREADS 1
+#define BOOST_NO_WREGEX 1
+#define BOOST_NO_WSTRING 1
+
+#ifdef __CYGWIN__
+#  define BOOST_POSIX 1
+#endif
+
+#if defined(HAVE_NEWAPIS_H)
+#  define WANT_GETFILEATTRIBUTESEX_WRAPPER 1
+#endif
+
+#endif
+''', append=True)
+
+
+#HAVE_PUTENV
+def checkPutenv(conf):
+  check_putenv_source = """
+#include <stdlib.h>
+int main()
+{
+  putenv("");
+  return(0);
+}
+"""
+  conf.Message('Checking for putenv... ')
+  ret = conf.TryLink(check_putenv_source, '.c')
+  conf.Result(ret)
+  return ret
+
+
+#HAVE_DECL_ISTREAMBUF_ITERATOR
+def checkIstreambufIterator(conf):
+  check_istreambuf_iterator_source = """
+#include <streambuf> 
+#include <istream>
+int main()
+{
+  std::istreambuf_iterator<std::istream> iter;
+  return 0;
+}
+"""
+  conf.Message('Checking for iostreambuf::iterator... ')
+  ret = conf.TryLink(check_istreambuf_iterator_source, '.cpp')
+  conf.Result(ret)
+  return ret
+
+
+#MKDIR_TAKES_ONE_ARG
+def checkMkdirOneArg(conf):
+  check_mkdir_one_arg_source = """
+#include <sys/stat.h>
+int main()
+{
+  mkdir("somedir");
+}
+"""
+  conf.Message('Checking for the number of args for mkdir... ')
+  ret = conf.TryLink(check_mkdir_one_arg_source, '.c')
+  if ret:
+    conf.Result('one')
+  else:
+    conf.Result('two')
+  return ret
+
+
+#HAVE_STD_COUNT
+def checkStdCount(conf):
+  check_std_count_source = """
+#include <algorithm>
+using std::count;
+int countChar(char * b, char * e, char const c)
+{
+  return count(b, e, c);
+}
+
+int main()
+{
+  char a[] = "hello";
+  int i = countChar(a, a + 5, 'l');
+}
+"""
+  conf.Message('Checking for std::count... ')
+  ret = conf.TryLink(check_std_count_source, '.cpp')
+  conf.Result(ret)
+  return ret
+
+
+# SELECT_TYPE_ARG1
+# SELECT_TYPE_ARG234
+# SELECT_TYPE_ARG5
+def checkSelectArgType(conf):
+  ''' Adapted from autoconf '''
+  conf.Message('Checking for arg types for select... ')
+  for arg234 in ['fd_set *', 'int *', 'void *']:
+    for arg1 in ['int', 'size_t', 'unsigned long', 'unsigned']:
+      for arg5 in ['struct timeval *', 'const struct timeval *']:
+        check_select_source = '''
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+extern int select (%s, %s, %s, %s, %s);
+int main()
+{
+  return(0);
+}
+''' % (arg1, arg234, arg234, arg234, arg5)
+        ret = conf.TryLink(check_select_source, '.c')
+        if ret:
+          conf.Result(ret)
+          return (arg1, arg234, arg5)
+  conf.Result('no (use default)')
+  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:
+    # 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
+      conf.Result('yes')
+      return (path, files[0].split(os.sep)[-1][3:-2])
+  conf.Result('n')
+  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
+  #    dir=env.join( getInstDirForResType(env, 'KDELOCALE'), country)
+  #    env.bksys_install(env.join(dir, 'LC_MESSAGES'), result, destfile=appname+'.mo')
+
+
+def installCygwinLDScript(path):
+  ''' Install i386pe.x-no-rdata '''
+  ld_script = os.path.join(path, 'i386pe.x-no-rdata')
+  script = open(ld_script, 'w')
+  script.write('''/* specific linker script avoiding .rdata sections, for normal executables 
+for a reference see 
+http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
+http://www.cygwin.com/ml/cygwin-apps/2004-09/msg00309.html
+*/
+OUTPUT_FORMAT(pei-i386)
+SEARCH_DIR("/usr/i686-pc-cygwin/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/lib/w32api");
+ENTRY(_mainCRTStartup)
+SECTIONS
+{
+  .text  __image_base__ + __section_alignment__  :
+  {
+     *(.init)
+    *(.text)
+    *(SORT(.text$*))
+    *(.glue_7t)
+    *(.glue_7)
+     ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
+                       LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*));  LONG (0);
+     ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
+                       LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*));  LONG (0);
+     *(.fini)
+    /* ??? Why is .gcc_exc here?  */
+     *(.gcc_exc)
+    PROVIDE (etext = .);
+    *(.gcc_except_table)
+  }
+  /* The Cygwin32 library uses a section to avoid copying certain data
+     on fork.  This used to be named ".data".  The linker used
+     to include this between __data_start__ and __data_end__, but that
+     breaks building the cygwin32 dll.  Instead, we name the section
+     ".data_cygwin_nocopy" and explictly include it after __data_end__. */
+  .data BLOCK(__section_alignment__) :
+  {
+    __data_start__ = . ;
+    *(.data)
+    *(.data2)
+    *(SORT(.data$*))
+    *(.rdata)
+    *(SORT(.rdata$*))
+    *(.eh_frame)
+    ___RUNTIME_PSEUDO_RELOC_LIST__ = .;
+    __RUNTIME_PSEUDO_RELOC_LIST__ = .;
+    *(.rdata_runtime_pseudo_reloc)
+    ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
+    __RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
+    __data_end__ = . ;
+    *(.data_cygwin_nocopy)
+  }
+  .rdata BLOCK(__section_alignment__) :
+  {
+  }
+  .pdata BLOCK(__section_alignment__) :
+  {
+    *(.pdata)
+  }
+  .bss BLOCK(__section_alignment__) :
+  {
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = . ;
+  }
+  .edata BLOCK(__section_alignment__) :
+  {
+    *(.edata)
+  }
+  /DISCARD/ :
+  {
+    *(.debug$S)
+    *(.debug$T)
+    *(.debug$F)
+    *(.drectve)
+  }
+  .idata BLOCK(__section_alignment__) :
+  {
+    /* This cannot currently be handled with grouped sections.
+       See pe.em:sort_sections.  */
+    SORT(*)(.idata$2)
+    SORT(*)(.idata$3)
+    /* These zeroes mark the end of the import list.  */
+    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
+    SORT(*)(.idata$4)
+    SORT(*)(.idata$5)
+    SORT(*)(.idata$6)
+    SORT(*)(.idata$7)
+  }
+  .CRT BLOCK(__section_alignment__) :
+  {
+    ___crt_xc_start__ = . ;
+    *(SORT(.CRT$XC*))  /* C initialization */
+    ___crt_xc_end__ = . ;
+    ___crt_xi_start__ = . ;
+    *(SORT(.CRT$XI*))  /* C++ initialization */
+    ___crt_xi_end__ = . ;
+    ___crt_xl_start__ = . ;
+    *(SORT(.CRT$XL*))  /* TLS callbacks */
+    /* ___crt_xl_end__ is defined in the TLS Directory support code */
+    ___crt_xp_start__ = . ;
+    *(SORT(.CRT$XP*))  /* Pre-termination */
+    ___crt_xp_end__ = . ;
+    ___crt_xt_start__ = . ;
+    *(SORT(.CRT$XT*))  /* Termination */
+    ___crt_xt_end__ = . ;
+  }
+  .tls BLOCK(__section_alignment__) :
+  {
+    ___tls_start__ = . ;
+    *(.tls)
+    *(.tls$)
+    *(SORT(.tls$*))
+    ___tls_end__ = . ;
+  }
+  .endjunk BLOCK(__section_alignment__) :
+  {
+    /* end is deprecated, don't use it */
+    PROVIDE (end = .);
+    PROVIDE ( _end = .);
+     __end__ = .;
+  }
+  .rsrc BLOCK(__section_alignment__) :
+  {
+    *(.rsrc)
+    *(SORT(.rsrc$*))
+  }
+  .reloc BLOCK(__section_alignment__) :
+  {
+    *(.reloc)
+  }
+  .stab BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.stab)
+  }
+  .stabstr BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.stabstr)
+  }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section.  Unlike other targets that fake this by putting the
+     section VMA at 0, the PE format will not allow it.  */
+  /* DWARF 1.1 and DWARF 2.  */
+  .debug_aranges BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_aranges)
+  }
+  .debug_pubnames BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_pubnames)
+  }
+  /* DWARF 2.  */
+  .debug_info BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_info) *(.gnu.linkonce.wi.*)
+  }
+  .debug_abbrev BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_abbrev)
+  }
+  .debug_line BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_line)
+  }
+  .debug_frame BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_frame)
+  }
+  .debug_str BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_str)
+  }
+  .debug_loc BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_loc)
+  }
+  .debug_macinfo BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_macinfo)
+  }
+  /* SGI/MIPS DWARF 2 extensions.  */
+  .debug_weaknames BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_weaknames)
+  }
+  .debug_funcnames BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_funcnames)
+  }
+  .debug_typenames BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_typenames)
+  }
+  .debug_varnames BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_varnames)
+  }
+  /* DWARF 3.  */
+  .debug_ranges BLOCK(__section_alignment__) (NOLOAD) :
+  {
+    *(.debug_ranges)
+  }
+}
+''')
+  script.close()
+  return(ld_script)
+
+
+try:
+  # these will be used under win32
+  import win32file
+  import win32event
+  import win32process
+  import win32security
+except:
+  # does not matter if it fails on other systems
+  pass
+
+
+class loggedSpawn:
+  def __init__(self, env, logfile, longarg, info):
+    # save the spawn system
+    self.env = env
+    self.logfile = logfile
+    # clear the logfile (it may not exist)
+    if logfile != '':
+      # this will overwrite existing content.
+      writeToFile(logfile, info, append=False)
+    # 
+    self.longarg = longarg
+    # get hold of the old spawn? (necessary?)
+    self._spawn = env['SPAWN']
+
+  # define new SPAWN
+  def spawn(self, sh, escape, cmd, args, spawnenv):
+    # get command line
+    newargs = ' '.join(map(escape, args[1:]))
+    cmdline = cmd + " " + newargs
+    #
+    # if log is not empty, write to it
+    if self.logfile != '':
+      # this tend to be slow (?) but ensure correct output
+      # Note that cmdline may be long so I do not escape it
+      try:
+        # since this is not an essential operation, proceed if things go wrong here.
+        writeToFile(self.logfile, cmd + " " + ' '.join(args[1:]) + '\n', append=True)
+      except:
+        print "Warning: can not write to log file ", self.logfile
+    #
+    # if the command is not too long, use the old
+    if not self.longarg or len(cmdline) < 8000:
+      exit_code = self._spawn(sh, escape, cmd, args, spawnenv)
+    else:  
+      sAttrs = win32security.SECURITY_ATTRIBUTES()
+      StartupInfo = win32process.STARTUPINFO()
+      for var in spawnenv:
+        spawnenv[var] = spawnenv[var].encode('ascii', 'replace')
+      # check for any special operating system commands
+      if cmd == 'del':
+        for arg in args[1:]:
+          win32file.DeleteFile(arg)
+        exit_code = 0
+      else:
+        # otherwise execute the command.
+        hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(None, cmdline, None, None, 1, 0, spawnenv, None, StartupInfo)
+        win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
+        exit_code = win32process.GetExitCodeProcess(hProcess)
+        win32file.CloseHandle(hProcess);
+        win32file.CloseHandle(hThread);
+    return exit_code
+
+
+def setLoggedSpawn(env, logfile = '', longarg=False, info=''):
+  ''' This function modify env and allow logging of
+    commands to a logfile. If the argument is too long
+    a win32 spawn will be used instead of the system one
+  '''
+  #
+  # create a new spwn object
+  ls = loggedSpawn(env, logfile, longarg, info)
+  # replace the old SPAWN by the new function
+  env['SPAWN'] = ls.spawn
+
+
+## def CheckPython(context, minver):
+##     context.Message('Checking for Python >= %s...' % '.'.join(str(x) for x in minver))
+##     try:
+##         python = context.env['PYTHON']
+##     except KeyError:
+##         try:
+##             python = os.environ['PYTHON']
+##         except KeyError:
+##             python = WhereIs("python")
+##             if not python:
+##                 python = python = WhereIs("python%i.%i" % (minver[0], minver[1]))
+##     minverhex = 0
+##     minver = list(minver) + [0, 0, 0, 0]
+##     for i in xrange(0, 4):
+##         minverhex = (minverhex << 8) + minver[i]
+##     prog = "import sys; sys.exit(sys.hexversion >= %s)" % minverhex
+##     if python is None:
+##         python = 'python'
+##     try:
+##         result = Popen([python, "-c", prog]).wait()
+##     except OSError:
+##         context.Result(False)
+##         return False
+##     context.Result(result)
+##     if result:
+##         context.env.Replace(PYTHON=python)
+##         proc = Popen([python, "-c", "import sys; print sys.version[:3]"], stdout=PIPE)
+##         pyver = proc.communicate()[0].rstrip()
+##         context.env.Replace(PYTHON_VERSION=pyver)
+##         context.env.Replace(pythondir="$prefix/lib/python$PYTHON_VERSION/site-packages")
+##         context.env.Replace(pyexecdir="${exec_prefix}/lib/python$PYTHON_VERSION/site-packages")
+##     return result
+## 
+## def DistSources(env, node):
+##     env.DistFiles(_get_sources(env, node))
+## 
+## def DistFiles(env, files):
+##     assert isinstance(files, (list, tuple))
+##     DISTFILES = [env.File(fname) for fname in files]
+##     env.AppendUnique(DISTFILES=DISTFILES)
+## 
+## 
+## def make_distdir(target=None, source=None, env=None):
+##     distdir = env.subst('$DISTDIR')
+##     Execute(Delete(distdir))
+##     Execute(Mkdir(distdir))
+##     for fnode in env["DISTFILES"]:
+##         dirname, fname = os.path.split(str(fnode))
+##         if dirname:
+##             distdirname = os.path.join(distdir, dirname)
+##             if not os.path.exists(distdirname):
+##                 Execute(Mkdir(distdirname))
+##         Execute(Copy(os.path.join(distdir, dirname, fname), str(fnode)))
+##     
+## def make_dist(target=None, source=None, env=None):
+##     return Popen([env['TAR'], "-zcf",
+##                   env.subst("${PACKAGE}-${VERSION}.tar.gz"),
+##                   env.subst('$DISTDIR')]).wait()
+## 
+## def make_distcheck(target=None, source=None, env=None):
+##     distdir = env.subst('$DISTDIR')
+##     distcheckinstdir = tempfile.mkdtemp('', env.subst('${PACKAGE}-${VERSION}-instdir-'))
+##     distcheckdestdir = tempfile.mkdtemp('', env.subst('${PACKAGE}-${VERSION}-destdir-'))
+##     instdirs = [os.path.join(distcheckinstdir, d) for d in
+##                 'lib', 'share', 'bin', 'include']
+##     for dir_ in instdirs:
+##         Execute(Mkdir(dir_))
+## 
+##     cmd = env.subst("cd $DISTDIR && scons DESTDIR=%s prefix=%s"
+##                     " && scons check && scons install") %\
+##             (os.path.join(distcheckdestdir, ''), distcheckinstdir)
+##     status = Popen(cmd, shell=True).wait()
+##     if status:
+##         return status
+##     ## Check that inst dirs are empty (to catch cases of $DESTDIR not being honored
+##     for dir_ in instdirs:
+##         if os.listdir(dir_):
+##             raise SCons.Errors.BuildError(target, "%s not empy" % dir_)
+##     ## Check that something inside $DESTDIR was installed
+##     dir_ = os.path.join(distcheckdestdir, distcheckinstdir)
+##     if not os.path.exists(dir_):
+##         raise SCons.Errors.BuildError(target, "%s does not exist" % dir_)
+##     Execute(Delete(distcheckinstdir))
+##     Execute(Delete(distcheckdestdir))
+##     Execute(Delete(distdir))
+## 
+## def InstallWithDestDir(self, dir_, source):
+##     dir_ = '${DESTDIR}' + str(dir_)
+##     return SConsEnvironment.Install(self, dir_, source)
+## 
+## 
+## def InstallAsWithDestDir(self, target, source):
+##     target = '${DESTDIR}' + str(target)
+##     return SConsEnvironment.InstallAs(self, target, source)
+## 
+## def generate(env):
+##     env.EnsureSConsVersion(0, 96, 91)
+## 
+##     opts = Options(['options.cache'], ARGUMENTS)
+##     opts.Add(PathOption('prefix', 'Installation prefix', '/usr/local'))
+##     opts.Add(PathOption('exec_prefix', 'Installation prefix blah blah',
+##                         '$prefix'))
+##     opts.Add(PathOption('libdir',
+##         'Installation prefix for architecture dependent files', '$prefix/lib'))
+##     opts.Add(PathOption('includedir',
+##         'Installation prefix for C header files', '$prefix/include'))
+##     opts.Add(PathOption('datadir',
+##         'Installation prefix for architecture independent files', '$prefix/share'))
+##     opts.Add(PathOption('bindir', 'Installation prefix for programs', '$prefix/bin'))
+##     opts.Add(PathOption('DESTDIR', 'blah blah', None))
+##     opts.Update(env)
+##     opts.Save('options.cache', env)
+##     SConsEnvironment.Help(env, opts.GenerateHelpText(env))
+##     
+##     env.Append(CPPFLAGS=r' -DVERSION=\"$VERSION\"')
+##     env.Append(CCFLAGS=ARGUMENTS.get('CCFLAGS', '-g -O2'))
+## 
+##     env['GNOME_TESTS'] = dict(CheckPython=CheckPython,
+##                               CheckPythonHeaders=CheckPythonHeaders,
+##                               PkgCheckModules=PkgCheckModules)
+## 
+##     SConsEnvironment.DistSources = DistSources
+##     SConsEnvironment.DistFiles = DistFiles
+##     env['DISTDIR'] = "${PACKAGE}-${VERSION}"
+## 
+##     #env.Command(env.Dir("$DISTDIR"), None, make_distdir)
+##     
+##     distdir_alias = env.Alias("distdir", None, make_distdir)
+##     dist_alias = env.Alias("dist", None, make_dist)
+##     env.Depends(dist_alias, distdir_alias)
+##     distcheck_alias = env.Alias("distcheck", None, make_distcheck)
+##     env.Depends(distcheck_alias, distdir_alias)
+##     env.AlwaysBuild(env.Alias('check'))
+## 
+##     #env['TARFLAGS'] ='-c -z'
+##     #env['TARSUFFIX'] = '.tar.gz'
+##     #tar = env.Tar('${PACKAGE}-${VERSION}.tar.gz', "${DISTDIR}")
+##     #env.Depends(tar, distdir_alias)
+##     #print env['DEFAULT_TARGETS']
+## 
+##     #env.Depends(distdir_alias, "${DISTFILES}")
+##     #env.Alias('dist', tar)
+##     env.AlwaysBuild('dist')
+##     env.AlwaysBuild('distdir')
+##     env.AlwaysBuild('distcheck')
+##     env.DistFiles(['SConstruct', 'scons/gnome.py'])
+## 
+##     env['BUILDERS']['EnvSubstFile'] = SCons.Builder.Builder(action=env_subst)
+## 
+##     SConsEnvironment.PythonByteCompile = env.Action(byte_compile_python)
+##     
+##     env.Install = new.instancemethod(InstallWithDestDir, env, env.__class__)
+##     env.InstallAs = new.instancemethod(InstallAsWithDestDir, env, env.__class__)
+## 
+## 
+##  
+