gettext support, fast_start option, scons all, mingw bug fix and some cleanup for the scons build system

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13849 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2006-05-15 20:35:01 +00:00
parent 479abc6efd
commit e94889a041
3 changed files with 783 additions and 670 deletions

View File

@ -13,18 +13,18 @@ import os, sys
Import('env')
targets = env['BUILD_TARGETS']
build_lyx = (targets == [] or 'lyx' in targets or 'install' in targets)
build_lyx = (targets == [] or 'lyx' in targets or 'install' in targets or 'all' in targets)
if env['INCLUDED_BOOST'] or 'boost' in targets:
#
# boost libraries
#
if env['INCLUDED_BOOST'] or 'boost' in targets:
# special builddir
env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
boostenv = env.Copy()
boostenv.Append(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
# for config.h
boostenv.Append(CPPPATH = ['$TOP_SRC_DIR/src'])
boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
print 'Processing files in boost/libs/filesystem/src...'
@ -83,21 +83,19 @@ if env['INCLUDED_BOOST'] or 'boost' in targets:
Alias('boost', signals)
Alias('boost', iostreams)
#
# Now, src code under src/
#
env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']]:
#
# src/support
#
if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']]:
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')
@ -136,11 +134,11 @@ if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']
)
Alias('supports', supports)
if build_lyx or 'mathed' in targets:
#
# src/mathed
#
if build_lyx or 'mathed' in targets:
print "Processing files in src/mathed"
mathed = env.StaticLibrary(
@ -290,7 +288,6 @@ if build_lyx or 'frontends' in targets:
#
# src/frontends
#
print "Processing files in src/frontends"
frontends = env.StaticLibrary(
@ -314,7 +311,6 @@ if build_lyx or 'graphics' in targets:
#
# src/graphics
#
print "Processing files in src/graphics"
graphics = env.StaticLibrary(
@ -340,7 +336,6 @@ if build_lyx or 'controllers' in targets:
#
# src/frontends/controllers
#
print "Processing files in src/frontends/controllers"
controllers = env.StaticLibrary(
@ -397,6 +392,7 @@ if build_lyx or 'controllers' in targets:
)
Alias('controllers', controllers)
#
# src/frontend/qt3/4
#
@ -417,18 +413,19 @@ if frontend == 'qt3':
print "Processing files in src/frontends/qt3"
qt3env = env.Copy()
# disable auto scan to speed up non build time
qt3env['QT_AUTOSCAN'] = 0
# load qt3 tools
qt3env.Tool('qt')
qt3env.Append(CPPPATH = [
qt3env.AppendUnique(CPPPATH = [
'$BUILDDIR/common',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends',
'$BUILDDIR/common/frontends/qt3',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends/controllers',
'$BUILDDIR/common/frontends/qt3',
'$QT_INC_DIR']
'$QT_INC_PATH']
)
qt3_ui_files = Split('''
@ -503,7 +500,6 @@ if frontend == 'qt3':
QWrapDialogBase.ui
''')
qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
BulletsModule.C
emptytable.C
@ -564,14 +560,15 @@ if frontend == 'qt3':
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':
# manually moc and uic files for better performance
# (stop autoscan, 13:20s->12:50s :-)
qt3_moced_files = [qt3env.Moc(x.replace('.C', '.h')) for x in qt3_moc_files]
qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in qt3_ui_files]
qt3_uiced_cc_files = []
for x in qt3_uiced_files:
qt3_uiced_cc_files.extend(x[1:])
qt3 = qt3env.StaticLibrary(
target = '$LOCALLIBPATH/qt3',
source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
@ -636,8 +633,7 @@ if frontend == 'qt3':
qscreen.C
qt_helpers.C
''')] +
qt3_moc_files + qt3_moced_files +
['$BUILDDIR/common/frontends/qt3/ui/' + x for x in qt3_ui_files]
qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
)
Alias('qt3', qt3)
@ -646,6 +642,7 @@ elif frontend == 'qt4':
print "Processing files in src/frontends/qt4"
qt4env = env.Copy()
qt4env['QT_AUTOSCAN'] = 0
# local qt4 toolset from
# http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
@ -656,7 +653,7 @@ elif frontend == 'qt4':
qt4env.Tool('qt4', [env['SCONS_DIR']])
qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
qt4env.Append(CPPPATH = [
qt4env.AppendUnique(CPPPATH = [
'$BUILDDIR/common',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends',
@ -678,7 +675,7 @@ elif frontend == 'qt4':
'-Winvalid-pch']
)
qt4_ui_files = Split('''
qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
BiblioUi
BranchesUi
BulletsUi
@ -748,9 +745,9 @@ elif frontend == 'qt4':
QURLUi
QVSpaceUi
QWrapUi
''')
''')]
qt4_moc_files = Split('''
qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
BulletsModule.C
emptytable.C
FileDialog_private.C
@ -811,15 +808,9 @@ elif frontend == 'qt4':
QLToolbar.C
socket_callback.C
validators.C
''')
''') ]
#
# Compile resources
#
for x in qt4_ui_files:
qt4env.Uic4('$BUILDDIR/common/frontends/qt4/ui/' + x)
qt4_source_files = Split('''
qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
QDialogView.C
Alert_pimpl.C
Dialogs.C
@ -881,18 +872,29 @@ elif frontend == 'qt4':
qfont_metrics.C
qscreen.C
qt_helpers.C
''')
''')]
#
# Compile resources
#
resources = [qt4env.Uic4(x) for x in qt4_ui_files]
#
# moc qt4_moc_files
#
qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
# if the moced files are included in the .C file
# the Flatten(...) part will not be needed
qt4 = qt4env.StaticLibrary(
target = '$LOCALLIBPATH/qt4',
LIBS = qt4env['QT_LIB'],
source = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in qt4_source_files] + \
["$BUILDDIR/common/frontends/qt4/%s" % x for x in qt4_moc_files]
source = qt4_source_files + qt4_moc_files + Flatten(qt4_moced_files)
)
Alias('qt4', qt4)
if 'client' in targets or 'install' in targets:
if 'client' in targets or 'install' in targets or 'all' in targets:
#
# src/client
#
@ -900,6 +902,7 @@ if 'client' in targets or 'install' in targets:
print "Processing files in src/client"
try:
client = env.Program(
target = '$BUILDDIR/common/client/lyxclient',
LIBS = env['BOOST_LIBRARIES'] + env['SOCKET_LIBS'] + ['supports'],
@ -913,10 +916,13 @@ if 'client' in targets or 'install' in targets:
)
Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
client, [Copy('$TARGET', '$SOURCE')]))
except:
print "Building of program lyxclient failed"
client = None
Alias('client', client)
if 'tex2lyx' in targets or 'install' in targets:
if 'tex2lyx' in targets or 'install' in targets or 'all' in targets:
#
# tex2lyx
#
@ -925,7 +931,7 @@ if 'tex2lyx' in targets or 'install' in targets:
tex2lyx_env = env.Copy()
# the order is important here.
tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
tex2lyx_env.Append(LIBPATH = ['#$LOCALLIBPATH'])
tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/FloatList.C', '$TOP_SRC_DIR/src/FloatList.C')
tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/Floating.C', '$TOP_SRC_DIR/src/Floating.C')
@ -938,6 +944,7 @@ if 'tex2lyx' in targets or 'install' in targets:
tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/lyxlex.C', '$TOP_SRC_DIR/src/lyxlex.C')
tex2lyx_env.fileCopy('$BUILDDIR/common/tex2lyx/lyxlex_pimpl.C', '$TOP_SRC_DIR/src/lyxlex_pimpl.C')
try:
tex2lyx = tex2lyx_env.Program(
target = '$BUILDDIR/common/tex2lyx/tex2lyx',
LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
@ -964,6 +971,9 @@ if 'tex2lyx' in targets or 'install' in targets:
)
Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
tex2lyx, [Copy('$TARGET', '$SOURCE')]))
except:
print "Building of program tex2lyx failed"
tex2lyx = None
Alias('tex2lyx', tex2lyx)
@ -1114,6 +1124,7 @@ if build_lyx or 'lyx' in targets:
#
# Build lyx with given frontend
#
try:
lyx = env.Program(
target = '$BUILDDIR/$frontend/lyx',
source = [],
@ -1137,17 +1148,59 @@ if build_lyx or 'lyx' in targets:
target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
[Copy('$TARGET', '$SOURCE')]))
except:
print "Building of program lyx failed"
lyx = None
raise
Alias('lyx', lyx)
if 'install' in targets:
if 'po' in targets or 'install' in targets or 'all' in targets:
#
# This does not look clever right now. I am using the basic
# install builder of scons instead of fancier wiki solutions
# with the hope that scons can finish standarding this soon.
# po/
#
print 'Processing files in po...'
import glob
# handle po files
#
# files to translate
transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
# possibly *only* handle these languages
languages = None
if env.has_key('languages'):
languages = env.make_list(env['lanauges'])
# use defulat msgfmt
if not env['MSGFMT']:
print 'msgfmt does not exist. Can not process po files'
else:
# create a builder
env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
#
gmo_files = []
for f in transfiles:
# get filename
fname = os.path.split(f)[1]
# country code
country = fname.split('.')[0]
#
if not languages or country in languages:
gmo_files.extend(env.Transfiles(f))
if 'install' in targets:
# create the directory if needed
if not os.path.isdir(env['PREFIX']):
try:
os.makedirs(env['PREFIX'])
except:
pass
if not os.path.isdir(env['PREFIX']):
print 'Can not create directory', env['PREFIX']
Exit(3)
#
import glob
#
# windows: $PREFIX/Resources
# others: $PREDIX/share/lyx
share_dir = env['SHARE_DIR']
@ -1159,7 +1212,7 @@ if 'install' in targets:
locale_dir = env['LOCALE_DIR']
def install(dest, src):
''' recusive installation of src '''
''' recusive installation of src to dest '''
# separate file and directory
files = filter(os.path.isfile, [x for x in src])
dirs = filter(os.path.isdir, [x for x in src])
@ -1172,17 +1225,16 @@ if 'install' in targets:
glob.glob(os.path.join(dir, '*'))) )
return ins_dir
#
# executables
env.Install(env['BIN_DIR'], [lyx, tex2lyx, client])
# executables (some of them may be none)
env.Install(env['BIN_DIR'], filter(lambda x: x != None, [lyx, tex2lyx, client]))
Alias('install', env['BIN_DIR'])
#
# share/lyx
dirs = install(env['SHARE_DIR'],
[env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
'lyxrc.example', 'syntax.default', \
'images', 'layouts', 'scripts', 'templates', \
'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
)
Alias('install', dirs)
# man
@ -1194,7 +1246,14 @@ if 'install' in targets:
env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
Alias('install', [os.path.join(env['MAN_DIR'], x) for
x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
# locale files?
# ru.gmo ==> ru/LC_MESSAGES/lyx.mo
for gmo in gmo_files:
lan = os.path.split(str(gmo))[1].split('.')[0]
dest_file = os.path.join(env['LOCALE_DIR'], lan, 'LC_MESSAGES', 'lyx.mo')
env.InstallAs(dest_file, gmo)
Alias('install', dest_file)
Default('lyx')
Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])

View File

@ -10,22 +10,22 @@
#
#
# This is a scons based building system for lyx, you can use it as follows:
# (after of course installation of scons from www.scons.org)
#
# $ cd development/scons
# $ scons [options] [targets]
# or:
# $ scons -f development/scons/SConstruct [options] [targets]
#
# After compiling, you can install lyx by
# and:
# $ scons [prefix=.] install
#
# Where:
# * targets can be one or more of lyx, tex2lyx, client, default to lyx
# * options: use scons -h for details about parameters, the most important
# * targets can be one or more of lyx, tex2lyx, client, po, install.
# default to lyx, you can use 'scons all' to build all targets except
# for install
# * options: use scons -h for details about options, the most important
# one is frontend=qt3|qt4.
# * qt3 is used by default on linux, cygwin and mac
# * qt4 is used by default on win32/mingw
# - qt3 is used by default on linux, cygwin and mac
# - qt4 is used by default on win32/mingw
#
# File layouts (Important):
# * Unless you specify builddir=dir, building will happen
@ -33,29 +33,29 @@
# * $BUILDDIR has subdirectories
# libs: all intermediate libraries
# boost: boost libraries, if boost=included is used
# qt3: build result
# * lyx executable will be in directories like debug/linux-qt3
# qt3/4: frontend-specific objects
# * executables will be copied to $BUILDDIR/
#
# Hints:
# * scons fast_start=yes
# If env.cache exists, bypass all tests and use existing src/config.h
#
# * scons --config=force
# force re-configuration (use scons -H for details)
#
# * check config.log to see why config has failed
#
# * use extra_inc_path, extra_lib_path, qt_dir, qt_inc_path
# qt_lib_path to help locate qt and other libraries
# (there are extra_inc_path1, extra_lib_path1 for now)
# qt_lib_path to help locate qt and other libraries.
# There are also extra_inc_path1, extra_lib_path1 if you need to spacify
# more than one extra paths.
#
# * (Important) use scons logfile=logfile.log to enable command line
# logging. (default is no logging)
# * executed commands will be logged in scons_lyx.log. You can use logfile=
# option to save log to another file.
#
# Notes:
# * Currently, all scons does is building lyx in
# $LYXROOT/$mode/$build_dir/
# where $mode is debug or release, $build_dir is the build_dir name
# listed above
#
# * scons install etc may be added later. Interested contributors can follow
# * scons dist etc may be added later. Interested contributors can follow
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/AccumulateBuilder
# or
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/DistTarBuilder
@ -71,14 +71,12 @@
# features.
#
import os, sys
import os, sys, copy, cPickle
# config/scons_utils.py defines a few utility function
sys.path.append('config')
import scons_utils as utils
SetOption('implicit_cache', 1)
#----------------------------------------------------------
# Required runtime environment
#----------------------------------------------------------
@ -114,18 +112,15 @@ PACKAGE_NAME = 'LyX'
PACKAGE_TARNAME = 'lyx'
PACKAGE_STRING = '%s %s' % (PACKAGE_NAME, PACKAGE_VERSION)
PROGRAM_SUFFIX = ''
# various cache/log files
default_log_file = 'scons_lyx.log'
env_cache_file = 'env.cache'
# FIXME: what is this? (They are used in src/support/package.C.in
LOCALEDIR = "../locale/"
LYX_DIR = "/usr/local/share/lyx"
# platform dependent default build_dir and other settings
#
# I know, somebody would say:
# This is TOTALLY wrong! Everything should be automatically
# determined.
#
#----------------------------------------------------------
# platform dependent settings
#----------------------------------------------------------
if os.name == 'nt':
platform_name = 'win32'
default_frontend = 'qt4'
@ -135,13 +130,13 @@ if os.name == 'nt':
default_pch_opt = False
default_with_x = False
spell_checker = 'auto'
# FIXME: I need to know what exactly is boost_posix
# EF: It indicates to boost which API to use (posix or windows).
# boost_posix indicates to boost which API to use (posix or windows).
# If not specified, boost tries to figure out by itself, but it may fail.
boost_posix = False
packaging_method = 'windows'
default_prefix = 'c:/program files/lyx'
share_dir = 'Resources'
man_dir = 'Resouces/man/man1'
man_dir = 'Resources/man/man1'
locale_dir = 'Resources/locale'
elif os.name == 'posix' and sys.platform != 'cygwin':
platform_name = sys.platform
@ -153,6 +148,7 @@ elif os.name == 'posix' and sys.platform != 'cygwin':
default_with_x = True
boost_posix = True
packaging_method = 'posix'
default_prefix = '/usr/local/'
share_dir = 'share/lyx'
man_dir = 'man/man1'
locale_dir = 'share/locale'
@ -166,6 +162,7 @@ elif os.name == 'posix' and sys.platform == 'cygwin':
default_with_x = True
boost_posix = True
packaging_method = 'posix'
default_prefix = '/usr/local/'
share_dir = 'share/lyx'
man_dir = 'man/man1'
locale_dir = 'share/locale'
@ -178,9 +175,11 @@ elif os.name == 'darwin':
default_pch_opt = False
default_with_x = False
boost_posix = True
packaging_method = 'msc'
packaging_method = 'mac'
# FIXME: where to install?
default_prefix = '/usr/local/'
share_dir = 'Resources'
man_dir = 'Resouces/man/man1'
man_dir = 'Resources/man/man1'
locale_dir = 'Resources/locale'
else: # unsupported system
platform_name = 'others'
@ -192,68 +191,55 @@ else: # unsupported system
default_with_x = True
boost_posix = False
packaging_method = 'posix'
default_prefix = '/usr/local/'
share_dir = 'share/lyx'
man_dir = 'man/man1'
locale_dir = 'share/locale'
#---------------------------------------------------------
# Handling options
#----------------------------------------------------------
# Note that if you set the options via the command line,
# they will be remembered in the file 'options.cache'
#
# NOTE: the scons people are trying to fix scons so that
# options like --prefix will be accepted. Right now,
# we have to use the KEY=VALUE style of scons
#
if os.path.isfile('options.cache'):
print "Getting options from auto-saved options.cache..."
print open('options.cache').read()
if os.path.isfile('config.py'):
print "Getting options from config.py..."
print open('config.py').read()
opts = Options(['options.cache', 'config.py'])
opts = Options(['config.py'])
opts.AddOptions(
# frontend,
EnumOption('frontend', 'Main GUI',
default_frontend,
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.',
'Use included, system boost library, or try sytem boost first.',
default_boost_opt,
allowed_values = (
'auto', # detect boost, if not found, use included
'included', # always use included boost
'system', # always use system boost, fail if can not find
) ),
# FIXME: not implemented yet.
EnumOption('gettext',
'Use included, system gettext library, or try sytem first',
'Use included, system gettext library, or try sytem gettext first',
default_gettext_opt,
allowed_values = (
'auto', # detect gettext, if not found, use included
'included', # always use included gettext
'system', # always use system gettext, fail if can not find
) ),
# FIXME: I am not allowed to use '' as default, '.' is not good either.
PathOption('qt_dir', 'Path to qt directory', '.'),
PathOption('qt_include_path', 'Path to qt include directory', '.'),
PathOption('qt_lib_path', 'Path to qt library directory', '.'),
#
EnumOption('spell', 'Choose spell checker to use.', 'auto',
allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
#
BoolOption('fast_start', 'Whether or not use cached tests and keep current config.h', True),
# FIXME: I do not know how pch is working. Ignore this option now.
BoolOption('pch', '(NA) Whether or not use pch', default_pch_opt),
# FIXME: Not implemented yet.
BoolOption('version_suffix', '(NA) Whether or not add version suffix', False),
# build directory, will replace build_dir if set
PathOption('build_dir', 'Build directory', '.'),
# extra include and libpath
PathOption('extra_inc_path', 'Extra include path', '.'),
PathOption('extra_lib_path', 'Extra library path', '.'),
PathOption('extra_inc_path1', 'Extra include path', '.'),
PathOption('extra_lib_path1', 'Extra library path', '.'),
# enable assertion, (config.h has ENABLE_ASSERTIOS
BoolOption('assertions', 'Use assertions', True),
# enable warning, (config.h has WITH_WARNINGS)
@ -264,34 +250,47 @@ opts.AddOptions(
BoolOption('nls', '(NA) Whether or not use native language support', False),
# FIXME: not implemented
BoolOption('profile', '(NA) Whether or not enable profiling', False),
#
PathOption('prefix', 'install architecture-independent files in PREFIX', '.'),
#
PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', '.'),
# FIXME: not implemented
BoolOption('std_debug', '(NA) Whether or not turn on stdlib debug', False),
# using x11?
BoolOption('X11', 'Use x11 windows system', default_with_x),
# FIXME: not implemented
BoolOption('libintl', '(NA) Use libintl library', False),
#
PathOption('qt_dir', 'Path to qt directory', None),
#
PathOption('qt_include_path', 'Path to qt include directory', None),
#
PathOption('qt_lib_path', 'Path to qt library directory', None),
# build directory, will use $mode if not set
PathOption('build_dir', 'Build directory', None),
# extra include and libpath
PathOption('extra_inc_path', 'Extra include path', None),
#
PathOption('extra_lib_path', 'Extra library path', None),
#
PathOption('extra_inc_path1', 'Extra include path', None),
#
PathOption('extra_lib_path1', 'Extra library path', None),
# can be set to a non-existing directory
('prefix', 'install architecture-independent files in PREFIX', None),
#
PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', None),
# FIXME: not implemented
PathOption('intl_prefix', '(NA) Path to intl library', '.'),
PathOption('intl_prefix', '(NA) Path to intl library', None),
# log file
('logfile', 'save commands (not outputs) to logfile', default_log_file),
# Path to aikasurus
PathOption('aikasurus_path', 'Path to aikasurus library', '.'),
#
EnumOption('spell', 'Choose spell checker to use.', 'auto',
allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
# environment variable can be set as options
('CC', '$CC', 'gcc'),
('CPP', '$CPP', 'gcc -E'),
('CXX', '$CXX', 'g++'),
('CXXCPP', '$CXXCPP', 'g++ -E'),
('CCFLAGS', '$CCFLAGS', ''),
('CPPFLAGS', '$CPPFLAGS', ''),
('CPPPATH', '$CPPPATH', ''),
('LDFLAGS', '$LDFLAGS', ''),
PathOption('aikasurus_path', 'Path to aikasurus library', None),
# environment variable can be set as options. (DO NOT set defaults)
('CC', '$CC', None),
('LINK', '$LINK', None),
('CPP', '$CPP', None),
('CXX', '$CXX', None),
('CXXCPP', '$CXXCPP', None),
('CCFLAGS', '$CCFLAGS', None),
('CPPFLAGS', '$CPPFLAGS', None),
('LDFLAGS', '$LDFLAGS', None),
)
@ -304,16 +303,35 @@ env = Environment(options = opts)
# Determine the frontend to use, which may be loaded
# from option cache
frontend = env.get('frontend', default_frontend)
# make sure the key exists
env['frontend'] = frontend
#
use_X11 = env.get('X11', default_with_x)
# set environment since I do not really like ENV = os.environ
# whether or not use current config.h, and cached tests
if env['fast_start'] and os.path.isfile(env_cache_file):
fast_start = True
SetOption('implicit_cache', 1)
cache_file = open(env_cache_file)
env_cache = cPickle.load(cache_file)
cache_file.close()
print '------------ fast_start mode --------------------'
print ' Use cached test results and current config.h'
print ' use fast_start=no to override'
print '-------------------------------------------------'
else:
fast_start = False
SetOption('implicit_cache', 0)
env_cache = {}
# set individual variables since I do not really like ENV = os.environ
env['ENV']['PATH'] = os.environ.get('PATH')
env['ENV']['HOME'] = os.environ.get('HOME')
env['TOP_SRC_DIR'] = TOP_SRC_DIR
env['SCONS_DIR'] = SCONS_DIR
# install to current directory by default
env['PREFIX'] = env.get('prefix', '.')
if env.has_key('exec_prefix') and env['exec_prefix'] != '.':
# install to default_prefix by default
env['PREFIX'] = env.get('prefix', default_prefix)
if env.has_key('exec_prefix'):
env['BIN_DIR'] = env['exec_prefix']
else:
env['BIN_DIR'] = os.path.join(env['PREFIX'], 'bin')
@ -329,50 +347,36 @@ def getEnvVariable(env, name):
# first try command line argument (override environment settings)
if ARGUMENTS.has_key(name) and ARGUMENTS[name].strip() != '':
env[name] = ARGUMENTS[name]
# then try environment variable
# then use environment default
elif os.environ.has_key(name) and os.environ[name].strip() != '':
env[name] = os.environ[name]
print "Acquiring varaible %s from system environment: %s" % (name, env[name])
# finally, env['CC'] etc is set to the default values of Options.
# and env['CPP'] etc does not exist
getEnvVariable(env, 'CC')
getEnvVariable(env, 'LINK')
getEnvVariable(env, 'CPP')
getEnvVariable(env, 'CXX')
getEnvVariable(env, 'CXXCPP')
getEnvVariable(env, 'CCFLAGS')
getEnvVariable(env, 'CXXFLAGS')
getEnvVariable(env, 'CPPFLAGS')
getEnvVariable(env, 'CPPPATH')
getEnvVariable(env, 'LDFLAGS')
# under windows, scons is confused by .C/.c and uses gcc instead of
# g++. I am forcing the use of g++ here. This is expected to change
# after lyx renames all .C files to .cpp
#
# Solaris seems to use gcc for the last step as well, so, to
# make sure everyone uses a C++ compiler, linker, I do this for
# all platform
#
# just to be safe
if env.has_key('CXX') and env['CXX'] != '':
env['CC'] = env['CXX']
env['LINK'] = env['CXX']
else:
env['CC'] = 'g++'
env['LINK'] = 'g++'
#
# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
#
env['frontend'] = frontend
env['mode'] = env.get('mode', default_build_mode)
# lyx will be built to $build/build_dir so it is possible
# to build multiple build_dirs using the same source
# $mode can be debug or release
if ARGUMENTS.has_key('build_dir'):
build_dir = ARGUMENTS['build_dir']
if env.has_key('build_dir') and env['build_dir']:
build_dir = env['build_dir']
env['BUILDDIR'] = build_dir
else:
# Determine the name of the build (platform+frontend
# Determine the name of the build $mode
env['BUILDDIR'] = '#' + env['mode']
# all built libraries will go to build_dir/libs
# (This is different from the make file approach)
@ -382,20 +386,16 @@ env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
#
# QTDIR, QT_LIB_PATH, QT_INC_PATH
#
if platform_name == 'win32':
env.Tool('mingw')
if env.has_key('qt_dir') and env['qt_dir'] != '.':
if env.has_key('qt_dir') and env['qt_dir']:
env['QTDIR'] = env['qt_dir']
# add path to the qt tools
env.AppendUnique(LIBPATH = [os.path.join(env['qt_dir'], 'lib')])
env.AppendUnique(CPPPATH = [os.path.join(env['qt_dir'], 'include')])
# set environment so that moc etc can be found even if its path is not set properly
env.PrependENVPath('PATH', os.path.join(env['qt_dir'], 'bin'))
else:
env['QTDIR'] = os.environ.get('QTDIR', '/usr/lib/qt-3.3')
if env.has_key('qt_lib_path') and env['qt_lib_path'] != '.':
if env.has_key('qt_lib_path') and env['qt_lib_path']:
env['QT_LIB_PATH'] = env['qt_lib_path']
else:
env['QT_LIB_PATH'] = '$QTDIR/lib'
@ -403,26 +403,28 @@ env.AppendUnique(LIBPATH = ['$QT_LIB_PATH'])
# qt4 seems to be using pkg_config
env.PrependENVPath('PKG_CONFIG_PATH', env.subst('$QT_LIB_PATH'))
if env.has_key('qt_inc_path') and env['qt_inc_path'] != '.':
if env.has_key('qt_inc_path') and env['qt_inc_path']:
env['QT_INC_PATH'] = env['qt_inc_path']
elif os.path.isdir(os.path.join(env.subst('$QTDIR'), 'include')):
env['QT_INC_PATH'] = '$QTDIR/include'
else: # have to guess
env['QT_INC_PATH'] = '/usr/include/$frontend/'
# Note that this CPPPATH is for testing only
# it will be removed before calling SConscript
env.AppendUnique(CPPPATH = env['QT_INC_PATH'])
#
# extra_inc_path and extra_lib_path
#
if env.has_key('extra_inc_path'):
if env.has_key('extra_inc_path') and env['extra_inc_path']:
env.AppendUnique(CPPPATH = [env['extra_inc_path']])
if env.has_key('extra_lib_path'):
if env.has_key('extra_lib_path') and env['extra_lib_path']:
env.AppendUnique(LIBPATH = [env['extra_lib_path']])
if env.has_key('extra_inc_path1'):
if env.has_key('extra_inc_path1') and env['extra_inc_path1']:
env.AppendUnique(CPPPATH = [env['extra_inc_path1']])
if env.has_key('extra_lib_path1'):
if env.has_key('extra_lib_path1') and env['extra_lib_path1']:
env.AppendUnique(LIBPATH = [env['extra_lib_path1']])
if env.has_key('aikasurus_path'):
if env.has_key('aikasurus_path') and env['aikasurus_path']:
env.AppendUnique(LIBPATH = [env['aikasurus_path']])
#
@ -430,6 +432,22 @@ if env.has_key('aikasurus_path'):
# but it is required to do the tests.
if platform_name == 'win32':
env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
env.Tool('mingw')
# under windows, scons is confused by .C/.c and uses gcc instead of
# g++. I am forcing the use of g++ here. This is expected to change
# after lyx renames all .C files to .cpp
#
# Note that this step has to be after env.Tool('mingw') step
# since env.Tool('mingw') will set env['CC'] etc.
#
if env.has_key('CXX') and env['CXX']:
env['CC'] = env['CXX']
env['LINK'] = env['CXX']
else:
env['CC'] = 'g++'
env['LINK'] = 'g++'
#----------------------------------------------------------
# Autoconf business
@ -445,29 +463,35 @@ conf = Configure(env,
'CheckStdCount' : utils.checkStdCount,
'CheckSelectArgType' : utils.checkSelectArgType,
'CheckBoostLibraries' : utils.checkBoostLibraries,
'CheckMsgFmt' : utils.checkMsgFmt,
}
)
# pkg-config? (if not, we use hard-coded options)
if not fast_start:
if conf.CheckPkgConfig('0.15.0'):
env['HAS_PKG_CONFIG'] = True
else:
print 'pkg-config >= 0.1.50 is not found'
env['HAS_PKG_CONFIG'] = False
env_cache['HAS_PKG_CONFIG'] = env['HAS_PKG_CONFIG']
else:
env['HAS_PKG_CONFIG'] = env_cache['HAS_PKG_CONFIG']
# zlib? This is required.
if not conf.CheckLibWithHeader('z', 'zlib.h', 'C'):
# zlib? This is required. (fast_start assumes the existance of zlib)
if not fast_start and not conf.CheckLibWithHeader('z', 'zlib.h', 'C'):
print 'Did not find libz or zlib.h, exiting!'
Exit(1)
# qt libraries?
if not fast_start:
#
# qt3 does not use pkg_config
if env['frontend'] == 'qt3':
if 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':
elif frontend == 'qt4':
succ = False
# first: try pkg_config
if env['HAS_PKG_CONFIG']:
@ -495,16 +519,23 @@ elif env['frontend'] == 'qt4':
print 'Did not find qt libraries, exiting!'
Exit(1)
# check socket libs
if not fast_start:
env['SOCKET_LIBS'] = []
if conf.CheckLib('socket'):
env['SOCKET_LIBS'].append('socket')
# EF: This is the network services library and provides a
# nsl is the network services library and provides a
# transport-level interface to networking services.
if conf.CheckLib('nsl'):
env['SOCKET_LIBS'].append('nsl')
env_cache['SOCKET_LIBS'] = env['SOCKET_LIBS']
else:
env['SOCKET_LIBS'] = env_cache['SOCKET_LIBS']
if not fast_start:
# check boost libraries
boost_opt = ARGUMENTS.get('boost', default_boost_opt)
# check for system boost
@ -515,31 +546,44 @@ if boost_opt in ['auto', 'system']:
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 any of them is not found
if ('' in [sig[0], reg[0], fil[0], ios[0]]):
if boost_opt == 'system':
print "Can not find system boost libraries"
print "Please supply a path through extra_lib_path"
print "and try again."
print "Please supply a path through extra_lib_path and try again."
print "Or use boost=included to use included boost libraries."
Exit(2)
else:
env['BOOST_LIBRARIES'] = [sig[1], reg[1], fil[1], ios[1]]
# assume all boost libraries are in the same path...
print sig[0]
env.AppendUnique(LIBPATH = [sig[0]])
env['INCLUDED_BOOST'] = False
succ = True
# now, auto and succ = false, or included
# now, auto and succ = false, or boost=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
env_cache['BOOST_LIBRARIES'] = env['BOOST_LIBRARIES']
env_cache['INCLUDED_BOOST'] = env['INCLUDED_BOOST']
else:
env['BOOST_LIBRARIES'] = env_cache['BOOST_LIBRARIES']
env['INCLUDED_BOOST'] = env_cache['INCLUDED_BOOST']
#
# Building config.h
#
# check for msgfmt command
if not fast_start:
env['MSGFMT'] = conf.CheckMsgFmt()
env_cache['MSGFMT'] = env['MSGFMT']
else:
env['MSGFMT'] = env_cache['MSGFMT']
#----------------------------------------------------------
# Generating config.h
#----------------------------------------------------------
if not fast_start:
print "Generating ", utils.config_h, "..."
# I do not handle all macros in src/config.h.in, rather I am following a list
@ -687,28 +731,44 @@ if spell_engine in ['auto', 'aspell'] and \
conf.CheckLib('aspell'):
utils.addToConfig('#define USE_ASPELL 1', TOP_SRC_DIR)
env['USE_ASPELL'] = True
env['USE_PSPELL'] = False
env['USE_ISPELL'] = False
env['EXTRA_LIBS'].append('aspell')
spell_detected = True
elif spell_engine in ['auto', 'pspell'] and \
conf.CheckLib('pspell'):
utils.addToConfig('#define USE_PSPELL 1', TOP_SRC_DIR)
env['USE_ASPELL'] = False
env['USE_PSPELL'] = True
env['USE_ISPELL'] = False
env['EXTRA_LIBS'].append('pspell')
spell_detected = True
elif spell_engine in ['auto', 'ispell'] and \
conf.CheckLib('ispell'):
utils.addToConfig('#define USE_ISPELL 1', TOP_SRC_DIR)
env['USE_ASPELL'] = False
env['USE_PSPELL'] = False
env['USE_ISPELL'] = True
env['EXTRA_LIBS'].append('ispell')
spell_detected = True
if not spell_detected:
env['USE_ASPELL'] = False
env['USE_PSPELL'] = False
env['USE_ISPELL'] = False
# FIXME: can lyx work without an spell engine
if spell_engine == 'auto':
print "Warning: Can not locate any spell checker"
else:
print "Warning: Can not locate specified spell checker:", spell_engine
# env['EXTRA_LIBS'] will be modified later, so a unique copy is needed
# NOTE that we do *not* save qt_libs in environment.
env_cache['EXTRA_LIBS'] = copy.copy(env['EXTRA_LIBS'])
env_cache['USE_ASPELL'] = env['USE_ASPELL']
env_cache['USE_PSPELL'] = env['USE_PSPELL']
env_cache['USE_ISPELL'] = env['USE_ISPELL']
# USE_POSIX_PACKAGING
# USE_MACOSX_PACKAGING
# USE_WINDOWS_PACKAGING
@ -762,6 +822,13 @@ utils.addToConfig('#define SELECT_TYPE_ARG5 %s' % arg5, TOP_SRC_DIR)
# WANT_GETFILEATTRIBUTESEX_WRAPPER
utils.endConfigH(TOP_SRC_DIR)
else:
# only a few variables need to be rescanned
env['EXTRA_LIBS'] = copy.copy(env_cache['EXTRA_LIBS'])
env['USE_ASPELL'] = env_cache['USE_ASPELL']
env['USE_PSPELL'] = env_cache['USE_PSPELL']
env['USE_ISPELL'] = env_cache['USE_ISPELL']
#
# Finish auto-configuration
env = conf.Finish()
@ -779,35 +846,39 @@ try:
if frontend == 'qt3':
# note: env.Tool('qt') my set QT_LIB to qt
env['QT_LIB'] = 'qt-mt'
env['EXTRA_LIBS'] += ['qt-mt']
env['EXTRA_LIBS'].append('qt-mt')
if platform_name == 'cygwin' and use_X11:
env['EXTRA_LIBS'] += ['GL', 'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
env['EXTRA_LIBS'].extend(['GL', 'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv',
'pthread']
'pthread'])
env.AppendUnique(LIBPATH = ['/usr/X11R6/lib'])
elif frontend == 'qt4':
# local qt4 toolset from
# http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
if platform_name == "win32":
env['QT_LIB'] = ['QtCore4', 'QtGui4']
else:
env['QT_LIB'] = ['QtCore', 'QtGui']
env['EXTRA_LIBS'] += [x for x in env['QT_LIB']]
env['EXTRA_LIBS'] += env['QT_LIB']
except:
print "Can not locate qt tools"
print "What I get is "
print " QTDIR: ", env['QTDIR']
if platform_name in ['win32', 'cygwin']:
env['SYSTEM_LIBS'] = ['shlwapi', 'z']
# the final link step needs stdc++ to succeed under mingw
# FIXME: shouldn't g++ automatically link to stdc++?
env['SYSTEM_LIBS'] = ['shlwapi', 'z', 'stdc++']
else:
env['SYSTEM_LIBS'] = ['z']
#
# Build parameters CPPPATH etc
#
# boost is always in
env.AppendUnique(CPPPATH = ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src'])
# boost is always in, src is needed for config.h
#
# Note that previously added QT_DIR/include etc is removed
# they will be added when processing for example src/qt3
env['CPPPATH'] = ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src']
# TODO: add (more) appropriate compiling options (-DNDEBUG etc)
# for debug/release mode
@ -830,7 +901,7 @@ env['BUILDERS']['fileCopy'] = Builder(action = utils.env_filecopy)
# http://www.cygwin.com/ml/cygwin-apps/2004-09/msg00309.html
# for details
#
if platform_name == 'cygwin' and env['frontend'] == 'qt3':
if platform_name == 'cygwin':
ld_script_path = '/usr/lib/qt3/mkspecs/cygwin-g++'
ld_script = utils.installCygwinLDScript(ld_script_path)
env.AppendUnique(LINKFLAGS = ['-Wl,--enable-runtime-pseudo-reloc',
@ -840,9 +911,11 @@ if platform_name == 'cygwin' and env['frontend'] == 'qt3':
# Report results
#
# src/support/package.C.in needs the following to replace
env['LYX_DIR'] = LYX_DIR
env['LOCALEDIR'] = LOCALEDIR
env['TOP_SRCDIR'] = str(Dir('#'))
# LYX_ABS_INSTALLED_DATADIR (e.g. /usr/local/lyx/share/lyx)
env['LYX_DIR'] = env['SHARE_DIR']
# LYX_ABS_INSTALLED_LOCALEDIR
env['LOCALEDIR'] = env['LOCALE_DIR']
env['TOP_SRCDIR'] = env['TOP_SRC_DIR']
env['PROGRAM_SUFFIX'] = PROGRAM_SUFFIX
# needed by src/version.C.in => src/version.C
env['PACKAGE_VERSION'] = PACKAGE_VERSION
@ -886,6 +959,7 @@ if env['frontend'] in ['qt3', 'qt4']:
X11: %s
''' % (env.subst('$QT_INC_PATH'), env.subst('$QT_LIB_PATH'), use_X11)
if not fast_start:
print env['VERSION_INFO']
#
@ -895,7 +969,7 @@ print env['VERSION_INFO']
#
# I also would like to add logging (commands only) capacity to the
# spawn system.
logfile = ARGUMENTS.get('logfile', default_log_file)
logfile = env.get('logfile', default_log_file)
if logfile != '' or platform_name == 'win32':
import time
utils.setLoggedSpawn(env, logfile, longarg = (platform_name == 'win32'),
@ -910,18 +984,23 @@ if logfile != '' or platform_name == 'win32':
#
# Cleanup stuff
#
# save options
opts.Save('options.cache', env)
# -h will print out help info
Help(opts.GenerateHelpText(env))
# save environment settings (for fast_start option)
cache_file = open(env_cache_file, 'w')
cPickle.dump(env_cache, cache_file)
cache_file.close()
#----------------------------------------------------------
# Start building
#----------------------------------------------------------
Export('env')
SConsignFile(os.path.abspath('%s/sconsign' % env['BUILDDIR']))
# this has been the source of problem on some platforms...
# needs more testing
env.SConsignFile('%s/.sconsign' % env['BUILDDIR'][1:])
# this usage needs further investigation.
#env.CacheDir('%s/Cache/%s' % (env['BUILDDIR'], frontend))
env['BUILD_TARGETS'] = BUILD_TARGETS

View File

@ -292,40 +292,15 @@ def checkBoostLibraries(conf, lib, pathes):
return ('','')
import SCons.Node
def processLang(env, folder):
""" Process translations (.po files) in a po/ dir
This is copied from KDE knetstats-1.5/admin/kde.py
FIXME: imcomplete
"""
import glob
dir=SCons.Node.FS.default_fs.Dir(folder).srcnode()
fld=dir.srcnode()
tmptransfiles = glob.glob(str(fld)+'/*.po')
transfiles=[]
if env.has_key('_BUILDDIR_'):
bdir=env['_BUILDDIR_']
for dir in env.make_list(tmptransfiles):
transfiles.append( env.join(bdir, dir) )
def checkMsgFmt(conf):
''' check the existence of command msgfmt '''
conf.Message('Checking for gettext command msgfmt...')
res = conf.TryAction('msgfmt --help')
conf.Result(res[0])
if res[0]:
return 'msgfmt'
else:
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
return None
def installCygwinLDScript(path):