Scons: imerge SConscript to SConstruct, separate config.h, code cleanup

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14133 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2006-06-17 04:43:44 +00:00
parent 4e7ca2d6f4
commit 29431ace2c
3 changed files with 1751 additions and 1792 deletions

View File

@ -1,928 +0,0 @@
# 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
sys.path.append('config')
from scons_utils import globSource
Import('env')
def libExists(libname):
''' Check whether or not lib $LOCALLIBNAME/libname already exists'''
return os.path.isfile(File(env.subst('$LOCALLIBPATH/${LIBPREFIX}%s$LIBSUFFIX'%libname)).abspath)
targets = env['BUILD_TARGETS']
# msvc need to pass full target name, so I have to look for path/lyx etc
build_lyx = targets == [] or True in ['lyx' in x for x in targets] \
or 'install' in targets or 'all' in targets
build_boost = (env['INCLUDED_BOOST'] and not libExists('boost_regex')) or 'boost' in targets
build_intl = (env['INCLUDED_GETTEXT'] and not libExists('included_intl')) or 'intl' in targets
build_support = build_lyx or True in [x in targets for x in ['support', 'client', 'tex2lyx']]
build_mathed = build_lyx or 'mathed' in targets
build_insets = build_lyx or 'insets' in targets
build_frontends = build_lyx or 'frontends' in targets
build_graphics = build_lyx or 'graphics' in targets
build_controllers = build_lyx or 'controllers' in targets
build_client = True in ['client' in x for x in targets] \
or 'install' in targets or 'all' in targets
build_tex2lyx = True in ['tex2lyx' in x for x in targets] \
or 'install' in targets or 'all' in targets
build_lyxbase = build_lyx or 'lyxbase' in targets
build_po = 'po' in targets or 'install' in targets or 'all' in targets
build_qt2 = (build_lyx and env['frontend'] == 'qt2') or 'qt2' in targets
build_qt3 = (build_lyx and env['frontend'] == 'qt3') or 'qt3' in targets
build_qt4 = (build_lyx and env['frontend'] == 'qt4') or 'qt4' in targets
build_msvs_projects = env['USE_VC'] and 'msvs_projects' in targets
# now, if rebuild_targets is specified, do not rebuild some targets
rebuild_targets = env['REBUILD_TARGETS']
if rebuild_targets:
def ifBuildLib(name, libname, old_value):
# explicitly asked to rebuild
if name in rebuild_targets:
return True
# else if not rebuild, and if the library already exists
elif libExists(libname):
return False
# do not change the original value
else:
return old_value
build_boost = ifBuildLib('boost', 'included_boost_filesystem', build_boost)
build_intl = ifBuildLib('intl', 'included_intl', build_intl)
build_support = ifBuildLib('support', 'support', build_support)
build_mathed = ifBuildLib('mathed', 'mathed', build_mathed)
build_insets = ifBuildLib('insets', 'insets', build_insets)
build_frontends = ifBuildLib('frontends', 'frontends', build_frontends)
build_graphics = ifBuildLib('graphics', 'graphics', build_graphics)
build_controllers = ifBuildLib('controllers', 'controllers', build_controllers)
build_lyxbase = ifBuildLib('lyxbase', 'lyxbase_pre', build_lyxbase)
build_qt2 = ifBuildLib('qt2', 'qt2', build_qt2)
build_qt3 = ifBuildLib('qt3', 'qt3', build_qt3)
build_qt4 = ifBuildLib('qt4', 'qt4', build_qt4)
# sync frontend and env['frontend'] (maybe build qt4 with frontend=qt3)
if build_qt2:
frontend = 'qt2'
env['frontend'] = 'qt2'
elif build_qt3:
frontend = 'qt3'
env['frontend'] = 'qt3'
elif build_qt4:
frontend = 'qt4'
env['frontend'] = 'qt4'
else:
frontend = env['frontend']
if build_boost:
#
# boost libraries
#
# special builddir
env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
boostenv = env.Copy()
boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
for lib in ['filesystem', 'regex', 'signals', 'iostreams']:
# lyx 1.4 does not have iostreams
if not os.path.isdir(os.path.join(env.subst('$TOP_SRC_DIR'), 'boost', 'libs', lib)):
continue
print 'Processing files in boost/libs/%s/src...' % lib
boostlib = boostenv.StaticLibrary(
target = '$LOCALLIBPATH/included_boost_%s' % lib,
source = globSource(dir = env.subst('$TOP_SRC_DIR/boost/libs/%s/src' % lib),
pattern = '*.cpp', build_dir = '$BUILDDIR/boost/%s/src' % lib)
)
Alias('boost', boostlib)
if build_intl:
#
# intl
#
print "Processing files in intl..."
env.BuildDir('$BUILDDIR/intl', '$TOP_SRC_DIR/intl', duplicate = 0)
intlenv = env.Copy()
# we need the original C compiler for these files
intlenv['CC'] = intlenv['C_COMPILER']
intlenv['CCFLAGS'] = intlenv['C_CCFLAGS']
intlenv['CPPPATH'] += ['intl']
intlenv.Append(CCFLAGS = [
r'-DLOCALEDIR=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
r'-DLIBDIR=\"' + env['TOP_SRC_DIR'].replace('\\', '\\\\') + r'/lib\"',
'-DIN_LIBINTL',
'-DENABLE_RELOCATABLE=1',
'-DIN_LIBRARY',
r'-DINSTALLDIR=\"' + env['PREFIX'].replace('\\', '\\\\') + r'/lib\"',
'-DNO_XMALLOC',
'-Dset_relocation_prefix=libintl_set_relocation_prefix',
'-Drelocate=libintl_relocate',
'-DDEPENDS_ON_LIBICONV=1',
'-DHAVE_CONFIG_H'
]
)
# libgnuintl.h.in => libintl.h
env.substFile('$TOP_SRC_DIR/intl/libintl.h', '$TOP_SRC_DIR/intl/libgnuintl.h.in')
env.Command('$TOP_SRC_DIR/intl/libgnuintl.h', '$TOP_SRC_DIR/intl/libintl.h',
[Copy('$TARGET', '$SOURCE')])
intl = intlenv.StaticLibrary(
target = '$LOCALLIBPATH/included_intl',
LIBS = ['c'],
source = globSource(dir = env.subst('$TOP_SRC_DIR/intl'), pattern = '*.c',
exclude = ['vasnprintf.c', 'printf-parse.c', 'printf-args.c', 'os2compat.c'],
build_dir = '$BUILDDIR/intl')
)
Alias('intl', intl)
#
# Now, src code under src/
#
env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
if build_support:
#
# src/support
#
print "Processing files in src/support..."
env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
support = env.StaticLibrary(
target = '$LOCALLIBPATH/support',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/support'), pattern = env['LYX_EXT'],
exclude = ['os_win32.C', 'os_unix.C', 'os_cygwin.C', 'os_os2.C', 'atexit.c'],
include = ['package.C'], build_dir = '$BUILDDIR/common/support')
)
Alias('support', support)
if build_mathed:
#
# src/mathed
#
print "Processing files in src/mathed..."
mathed = env.StaticLibrary(
target = '$LOCALLIBPATH/mathed',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/mathed'), pattern = env['LYX_EXT'],
exclude = ['math_xyarrowinset.C', 'math_mboxinset.C', 'formulamacro.C'],
build_dir = '$BUILDDIR/common/mathed')
)
Alias('mathed', mathed)
if build_insets:
#
# src/insets
#
print "Processing files in src/insets..."
insets = env.StaticLibrary(
target = '$LOCALLIBPATH/insets',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/insets'), pattern = env['LYX_EXT'],
exclude = ['insettheorem.C'], build_dir = '$BUILDDIR/common/insets')
)
Alias('insets', insets)
if build_frontends:
#
# src/frontends
#
print "Processing files in src/frontends..."
frontends = env.StaticLibrary(
target = '$LOCALLIBPATH/frontends',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/frontends')
)
Alias('frontends', frontends)
if build_graphics:
#
# src/graphics
#
print "Processing files in src/graphics..."
graphics = env.StaticLibrary(
target = '$LOCALLIBPATH/graphics',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/graphics'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/graphics')
)
Alias('graphics', graphics)
if build_controllers:
#
# src/frontends/controllers
#
print "Processing files in src/frontends/controllers..."
controllers = env.StaticLibrary(
target = '$LOCALLIBPATH/controllers',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/controllers'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/frontends/controllers')
)
Alias('controllers', controllers)
#
# src/frontend/qt2/3/4
#
if build_qt2 or build_qt3 or build_qt4:
env.BuildDir('$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
if build_qt2:
print "Processing files in src/frontends/qt2..."
qt2env = env.Copy()
# disable auto scan to speed up non build time
qt2env['QT_AUTOSCAN'] = 0
qt2env['QT_MOCHPREFIX'] = ''
# load qt2 tools
qt2env.Tool('qt')
qt2env.AppendUnique(CPPPATH = [
'$BUILDDIR/common',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends',
'$BUILDDIR/common/frontends/qt2',
'$BUILDDIR/common/frontends/controllers',
'$QT_INC_PATH']
)
qt2_moc_files = ["$BUILDDIR/common/frontends/qt2/%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
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
''')]
# manually moc and uic files for better performance
qt2_moced_files = [qt2env.Moc(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt2_moc_files]
qt2_uiced_files = [qt2env.Uic('$BUILDDIR/common/frontends/qt2/ui/'+x) for x in \
globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt2/ui'), pattern = '*.ui')]
qt2_uiced_cc_files = []
for x in qt2_uiced_files:
qt2_uiced_cc_files.extend(x[1:])
qt2 = qt2env.StaticLibrary(
target = '$LOCALLIBPATH/qt2',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt2/'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/frontends/qt2') + qt2_moced_files + qt2_uiced_cc_files
)
Alias('qt2', qt2)
if build_qt3:
print "Processing files in src/frontends/qt3..."
qt3env = env.Copy()
# disable auto scan to speed up non build time
qt3env['QT_AUTOSCAN'] = 0
qt3env['QT_MOCHPREFIX'] = ''
# load qt3 tools
qt3env.Tool('qt')
qt3env.AppendUnique(CPPPATH = [
'$BUILDDIR/common',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends',
'$BUILDDIR/common/frontends/qt3',
'$BUILDDIR/common/frontends/controllers',
'$QT_INC_PATH']
)
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
''')]
# manually moc and uic files for better performance
qt3_moced_files = [qt3env.Moc(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt3_moc_files]
qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in \
globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt3/ui'), pattern = '*.ui')]
qt3_uiced_cc_files = []
for x in qt3_uiced_files:
qt3_uiced_cc_files.extend(x[1:])
qt3 = qt3env.StaticLibrary(
target = '$LOCALLIBPATH/qt3',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt3/'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/frontends/qt3') + qt3_moced_files + qt3_uiced_cc_files
)
Alias('qt3', qt3)
if build_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
#
# NOTE: I have to patch qt4.py since it does not automatically
# process .C file!!! (add to cxx_suffixes )
#
qt4env.Tool('qt4', [env['SCONS_DIR']])
qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
qt4env.AppendUnique(CPPPATH = [
'$BUILDDIR/common',
'$BUILDDIR/common/images',
'$BUILDDIR/common/frontends',
'$BUILDDIR/common/frontends/qt4',
'$BUILDDIR/common/frontends/controllers'
]
)
# FIXME: replace by something from pkg_config
qt4env.Append(CCFLAGS = [
'-DHAVE_CONFIG_H',
'-DQT_CLEAN_NAMESPACE',
'-DQT_GENUINE_STR',
'-DQT_NO_STL',
'-DQT3_SUPPORT',
]
)
qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
BulletsModule.C
emptytable.C
FileDialog_private.C
floatplacement.C
iconpalette.C
lengthcombo.C
InsertTableWidget.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
#
resources = [qt4env.Uic4(x.split('.')[0]) for x in \
globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt4/ui'), pattern = '*.ui',
build_dir = '$BUILDDIR/common/frontends/qt4/ui')]
#
# moc qt4_moc_files, the moced files are included in the original files
#
qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
qt4 = qt4env.StaticLibrary(
target = '$LOCALLIBPATH/qt4',
LIBS = qt4env['QT_LIB'],
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/frontends/qt4'), pattern = env['LYX_EXT'],
exclude = ['QBrowseBox.C'], build_dir = '$BUILDDIR/common/frontends/qt4')
)
Alias('qt4', qt4)
if build_client:
#
# src/client
#
env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
print "Processing files in src/client..."
if env['HAVE_FCNTL']:
client = env.Program(
target = '$BUILDDIR/common/client/lyxclient',
LIBS = ['support'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] +
env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/client'), pattern = env['LYX_EXT'],
build_dir = '$BUILDDIR/common/client')
)
Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
client, [Copy('$TARGET', '$SOURCE')]))
else:
client = None
Alias('client', client)
if build_tex2lyx:
#
# tex2lyx
#
print "Processing files in src/tex2lyx..."
tex2lyx_env = env.Copy()
# the order is important here.
tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
[Copy('$TARGET', '$SOURCE')])
tex2lyx = tex2lyx_env.Program(
target = '$BUILDDIR/common/tex2lyx/tex2lyx',
LIBS = ['support'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
source = globSource(dir = env.subst('$TOP_SRC_DIR/src/tex2lyx'), pattern = env['LYX_EXT'],
include = ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.C',
'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C'],
build_dir = '$BUILDDIR/common/tex2lyx')
)
Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
tex2lyx, [Copy('$TARGET', '$SOURCE')]))
Alias('tex2lyx', tex2lyx)
if build_lyxbase:
#
# src/
#
print "Processing files in src..."
env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
lyx_post_source = Split('''
tabular.C
dimension.C
PrinterParams.C
box.C
Thesaurus.C
SpellBase.C
''')
if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
lyx_post_source.append('aspell.C')
elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
lyx_post_source.append('pspell.C')
elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
lyx_post_source.append('ispell.C')
# temporary fix for MSVC, will remove later.
if not env['USE_VC']:
main_source = ['main.C']
else:
main_source = []
lyxbase_pre = env.StaticLibrary(
target = '$LOCALLIBPATH/lyxbase_pre',
source = globSource(dir = env.subst('$TOP_SRC_DIR/src'), pattern = env['LYX_EXT'],
exclude = lyx_post_source + ['main.C', 'aspell.C', 'pspell.C', 'ispell.C', 'Variables.C', 'Sectioning.C'],
include = ['version.C'] + main_source, build_dir = '$BUILDDIR/common')
)
lyxbase_post = env.StaticLibrary(
target = '$LOCALLIBPATH/lyxbase_post',
source = ["$BUILDDIR/common/%s" % x for x in lyx_post_source]
)
Alias('lyxbase', lyxbase_pre)
Alias('lyxbase', lyxbase_post)
if build_lyx:
#
# Build lyx with given frontend
#
# temporary fix for MSVC, will remove later.
if env['USE_VC']:
lyx_source = ['$BUILDDIR/common/main.C']
else:
lyx_source = []
lyx = env.Program(
target = '$BUILDDIR/$frontend/lyx',
source = lyx_source,
LIBS = [
'lyxbase_pre',
'mathed',
'insets',
'frontends',
env['frontend'],
'controllers',
'graphics',
'support',
'lyxbase_post',
] +
env['BOOST_LIBRARIES'] +
env['FRONTEND_LIBS'] +
env['INTL_LIBS'] +
env['SOCKET_LIBS'] +
env['SYSTEM_LIBS']
)
# [/path/to/lyx.ext] => lyx-qt3.ext
target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
[Copy('$TARGET', '$SOURCE')]))
Alias('lyx', lyx)
if build_msvs_projects:
def build_project(target, dir, full_target = None,
src_pattern = env['LYX_EXT'], include=[], resource=None, rebuild=True):
''' build mavs project files
target: alias (correspond to directory name)
dir: source directory or directories (a list)
full_target: full path/filename of the target
src_pattern: glob pattern
include: files to include into source
resource: directory or directories with resource (.ui) files
rebuild: whether or not only rebuild this target
For non-debug-able targets like static libraries, target (alias) is
enough to build the target. For executable targets, msvs need to know
the full path to start debug them.
'''
if resource is not None:
res = globSource(dir = env.subst('$TOP_SRC_DIR/'+resource), pattern = '*.ui',
build_dir = env.subst('$TOP_SRC_DIR/'+resource))
else:
res = []
if rebuild:
cmds = 'faststart=yes rebuild='+target
else:
cmds = 'faststart=yes'
if type(dir) == type([]):
src = []
inc = []
for d in dir:
src.extend(globSource(dir = env.subst('$TOP_SRC_DIR/' + d),
pattern = src_pattern, include = include,
build_dir = env.subst('$TOP_SRC_DIR/' + d) ))
inc.extend(globSource(dir = env.subst('$TOP_SRC_DIR/' + d),
pattern = '*.h',
build_dir = env.subst('$TOP_SRC_DIR/' + d) ))
else:
src = globSource(dir = env.subst('$TOP_SRC_DIR/' + dir),
pattern = src_pattern, include = include,
build_dir = env.subst('$TOP_SRC_DIR/' + dir) )
inc = globSource(dir = env.subst('$TOP_SRC_DIR/' + dir),
pattern = '*.h',
build_dir = env.subst('$TOP_SRC_DIR/' + dir) )
if full_target is None:
build_target = target
else:
build_target = full_target
# project
proj = env.MSVSProject(
target = '$MSVSPATH/' + target + env['MSVSPROJECTSUFFIX'],
srcs = src,
incs = [env.subst('$TOP_SRC_DIR/src/config.h')],
localincs = inc,
resources = res,
buildtarget = build_target,
cmdargs = cmds,
variant = 'Debug'
)
Alias('msvs_projects', proj)
#
build_project('boost', ['boost/libs/filesystem/src',
'boost/libs/regex/src', 'boost/libs/signals/src',
'boost/libs/iostreams/src'], src_pattern = '*.cpp')
#
build_project('intl', 'intl', src_pattern = '*.c')
#
build_project('support', 'src/support', include=['package.C.in'])
#
build_project('mathed', 'src/mathed')
#
build_project('insets', 'src/insets')
#
build_project('frontends', 'src/frontends')
#
build_project('graphics', 'src/graphics')
#
build_project('controllers', 'src/frontends/controllers')
#
build_project('qt3', 'src/frontends/qt3', resource = 'src/frontends/qt3/ui')
#
build_project('qt4', 'src/frontends/qt4', resource = 'src/frontends/qt4/ui')
#
build_project('client', 'src/client', rebuild=False,
full_target = File(env.subst('$BUILDDIR/common/client/lyxclient$PROGSUFFIX')).abspath)
#
build_project('tex2lyx', 'src/tex2lyx', rebuild=False,
full_target = File(env.subst('$BUILDDIR/common/tex2lyx/tex2lyx$PROGSUFFIX')).abspath)
#
build_project('lyxbase', 'src')
#
if frontend == 'qt3':
build_project('lyx', ['src', 'src/support', 'src/mathed', 'src/insets',
'src/frontends', 'src/graphics', 'src/frontends/controllers',
'src/frontends/qt3'], resource = 'src/frontends/qt3/ui',
full_target = File(env.subst('$BUILDDIR/$frontend/lyx$PROGSUFFIX')).abspath)
else:
build_project('lyx', ['src', 'src/support', 'src/mathed', 'src/insets',
'src/frontends', 'src/graphics', 'src/frontends/controllers',
'src/frontends/qt4'], resource = 'src/frontends/qt4/ui',
full_target = File(env.subst('$BUILDDIR/$frontend/lyx$PROGSUFFIX')).abspath)
if build_po:
#
# 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['DEST_DIR']):
try:
os.makedirs(env['DEST_DIR'])
except:
pass
if not os.path.isdir(env['DEST_DIR']):
print 'Can not create directory', env['DEST_DIR']
Exit(3)
#
import glob
#
# do not install these files
exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
def install(dest, src):
''' recusive installation of src to dest '''
# separate file and directory
files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
dirs = filter(os.path.isdir, src)
# install file
env.Install(dest, files)
# install directory
ins_dir = [dest]
for dir in dirs:
ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
glob.glob(os.path.join(dir, '*'))) )
return ins_dir
#
# executables (some of them may be none)
#
if env['ADD_SUFFIX']:
version_suffix = env['PROGRAM_SUFFIX']
else:
version_suffix = ''
#
# install lyx
target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % version_suffix)
target = os.path.join(env['BIN_DEST_DIR'], target_name)
env.InstallAs(target, lyx)
Alias('install', target)
# install lyx as lyx-qt3
target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, version_suffix))
target = os.path.join(env['BIN_DEST_DIR'], target_name)
env.InstallAs(target, lyx)
Alias('install', target)
#
# install tex2lyx
target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % version_suffix)
target = os.path.join(env['BIN_DEST_DIR'], target_name)
env.InstallAs(target, tex2lyx)
Alias('install', target)
#
# install lyxclient, may not exist
if client != None:
target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % version_suffix)
target = os.path.join(env['BIN_DEST_DIR'], target_name)
env.InstallAs(target, client)
Alias('install', target)
#
# share/lyx
dirs = install(env['SHARE_DEST_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', 'bind', 'images', 'layouts', 'scripts',
'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
)
env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py',
'$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
Alias('install', dirs)
# man
env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyx' + version_suffix + '.1'),
env.subst('$TOP_SRC_DIR/lyx.man'))
env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'tex2lyx' + version_suffix + '.1'),
env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyxclient' + version_suffix + '.1'),
env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
Alias('install', [os.path.join(env['MAN_DEST_DIR'], x + version_suffix + '.1') for
x in ['lyx', 'tex2lyx', 'lyxclient']])
# locale files?
# ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
for gmo in gmo_files:
lan = os.path.split(str(gmo))[1].split('.')[0]
dest_file = os.path.join(env['LOCALE_DEST_DIR'], lan, 'LC_MESSAGES', 'lyx' + version_suffix + '.mo')
env.InstallAs(dest_file, gmo)
Alias('install', dest_file)
Default('lyx')
Alias('all', ['lyx', 'client', 'tex2lyx'])

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,20 @@
# 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
from SCons.Util import WhereIs
config_h = os.path.join('src', 'config.h')
config_content = ''
def writeToFile(filename, lines, append = False):
" utility function: write or append lines to filename "
@ -28,20 +26,6 @@ def writeToFile(filename, lines, append = False):
file.close()
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
@ -103,92 +87,6 @@ def checkPackage(conf, pkg):
return ret
def startConfigH():
''' Write the first part of config.h '''
global config_content
config_content = '''/* 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 addToConfig(lines, desc=''):
''' utility function: shortcut for appending lines to outfile
add newline at the end of lines.
'''
global config_content
if lines.strip() != '':
if desc != '':
config_content += '/* ' + desc + ' */\n'
config_content += lines + '\n\n'
def endConfigH(top_src_dir):
''' Write the last part of config.h '''
global config_content
writeToFile(os.path.join(top_src_dir, config_h), config_content +
'''/************************************************************
** 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
#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
''')
#MKDIR_TAKES_ONE_ARG
def checkMkdirOneArg(conf):
check_mkdir_one_arg_source = """
#include <sys/stat.h>
@ -208,7 +106,6 @@ int main()
return ret
# CXX_GLOBAL_CSTD
def checkCXXGlobalCstd(conf):
''' Check the use of std::tolower or tolower '''
check_global_cstd_source = '''
@ -225,9 +122,6 @@ int main()
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... ')
@ -300,7 +194,6 @@ int main()
return ret
# FIXME: not quite sure about this part.
def checkIconvConst(conf):
''' check the declaration of iconv '''
check_iconv_const = '''
@ -329,12 +222,127 @@ int main()
return ret
def createConfigFile(conf, config_file,
config_pre = '', config_post = '',
headers = [], functions = [], types = [], libs = [],
custom_tests = [], extra_items = []):
''' create a configuration file, with options
config_file: which file to create
config_pre: first part of the config file
config_post: last part of the config file
headers: header files to check, in the form of a list of
('file', 'HAVE_FILE', 'c'/'c++')
functions: functions to check, in the form of a list of
('func', 'HAVE_func', 'include lines'/None)
types: types to check, in the form of a list of
('type', 'HAVE_TYPE', 'includelines'/None)
libs: libraries to check, in the form of a list of
('lib', 'HAVE_LIB', 'LIB_NAME'). HAVE_LIB will be set if 'lib' exists,
or any of the libs exists if 'lib' is a list of libs.
Optionally, user can provide another key LIB_NAME, that will
be set to the detected lib (or None otherwise).
custom_tests: extra tests to perform, in the form of a list of
(test (True/False), 'key', 'desc', 'true config line', 'false config line')
If the last two are ignored, '#define key 1' '/*#undef key */'
will be used.
extra_items: extra configuration lines, in the form of a list of
('config', 'description')
Return:
The result of each test, as a dictioanry of
res['XXX'] = True/False
XXX are keys defined in each argument.
'''
cont = config_pre + '\n'
result = {}
# add to this string, in appropriate format
def configString(lines, desc=''):
text = ''
if lines.strip() != '':
if desc != '':
text += '/* ' + desc + ' */\n'
text += lines + '\n\n'
return text
#
# headers
for header in headers:
description = "Define to 1 if you have the <%s> header file." % header[0]
if (header[2] == 'c' and conf.CheckCHeader(header[0])) or \
(header[2] == 'cxx' and conf.CheckCXXHeader(header[0])):
result[header[1]] = True
cont += configString('#define %s 1' % header[1], desc = description)
else:
result[header[1]] = False
cont += configString('/* #undef %s */' % header[1], desc = description)
# functions
for func in functions:
description = "Define to 1 if you have the `%s' function." % func[0]
if conf.CheckFunc(func[0], header=func[2]):
result[func[1]] = True
cont += configString('#define %s 1' % func[1], desc = description)
else:
result[func[1]] = False
cont += configString('/* #undef %s */' % func[1], desc = description)
# types
for t in types:
description = "Define to 1 if you have the `%s' type." % t[0]
if conf.CheckType(t[0], includes=t[2]):
result[t[1]] = True
cont += configString('#define %s 1' % t[1], desc = description)
else:
result[t[1]] = False
cont += configString('/* #undef %s */' % t[1], desc = description)
# libraries
for lib in libs:
description = "Define to 1 if you have the `%s' library (-l%s)." % (lib[0], lib[0])
if type(lib[0]) is type(''):
lib_list = [lib[0]]
else:
lib_list = lib[0]
# check if any of the lib exists
result[lib[1]] = False
# if user want the name of the lib detected
if len(lib) == 3:
result[lib[2]] = None
for ll in lib_list:
if conf.CheckLib(ll):
result[lib[1]] = True
if len(lib) == 3:
result[lib[2]] = ll
cont += configString('#define %s 1' % lib[1], desc = description)
break
# if not found
if not result[lib[1]]:
cont += configString('/* #undef %s */' % lib[1], desc = description)
# custom tests
for test in custom_tests:
if test[0]:
result[test[1]] = True
if len(test) == 3:
cont += configString('#define %s 1' % test[1], desc = test[2])
else:
cont += configString(test[3], desc = test[2])
else:
result[test[1]] = False
if len(test) == 3:
cont += configString('/* #undef %s */' % test[1], desc = test[2])
else:
cont += configString(test[4], desc = test[2])
# extra items (no key is returned)
for item in extra_items:
cont += configString(item[0], desc = item[1])
# add the last part
cont += '\n' + config_post + '\n'
# write to file
writeToFile(config_file, cont)
return result
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
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
*/
@ -560,7 +568,7 @@ class loggedSpawn:
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']
@ -584,7 +592,7 @@ class loggedSpawn:
# 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:
else:
sAttrs = win32security.SECURITY_ATTRIBUTES()
StartupInfo = win32process.STARTUPINFO()
for var in spawnenv:
@ -615,128 +623,3 @@ def setLoggedSpawn(env, logfile = '', longarg=False, info=''):
# replace the old SPAWN by the new function
env['SPAWN'] = ls.spawn
## 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__)
##
##
##