From 29431ace2ced4646936a0b94a5ac6ac406248f20 Mon Sep 17 00:00:00 2001 From: Bo Peng Date: Sat, 17 Jun 2006 04:43:44 +0000 Subject: [PATCH] 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 --- development/scons/SConscript | 928 ------------ development/scons/SConstruct | 2260 +++++++++++++++++++++--------- development/scons/scons_utils.py | 361 ++--- 3 files changed, 1754 insertions(+), 1795 deletions(-) delete mode 100644 development/scons/SConscript diff --git a/development/scons/SConscript b/development/scons/SConscript deleted file mode 100644 index 4c65ceef52..0000000000 --- a/development/scons/SConscript +++ /dev/null @@ -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=""') - - 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']) diff --git a/development/scons/SConstruct b/development/scons/SConstruct index f87f337e98..fc365f5d45 100644 --- a/development/scons/SConstruct +++ b/development/scons/SConstruct @@ -8,7 +8,6 @@ # \author Bo Peng # Full author contact details are available in file CREDITS. # -# # This is a scons based building system for lyx, please refer # to INSTALL.scons for detailed instructions. # @@ -23,8 +22,8 @@ import scons_utils as utils # Required runtime environment #---------------------------------------------------------- -# scons asks for 1.5.2, lyx requires 2.2 -EnsurePythonVersion(2, 2) +# scons asks for 1.5.2, lyx requires 2.3 +EnsurePythonVersion(2, 3) # Please use at least 0.96.91 (not 0.96.1) EnsureSConsVersion(0, 96) @@ -32,12 +31,12 @@ EnsureSConsVersion(0, 96) # # called as 'scons -f development/scons/SConstruct' if os.path.isfile('SConstruct'): - TOP_SRC_DIR = '../..' - SCONS_DIR = '.' + top_src_dir = '../..' + scons_dir = '.' # called as 'cd development/scons; scons' else: - TOP_SRC_DIR = '.' - SCONS_DIR = 'development/scons' + top_src_dir = '.' + scons_dir = 'development/scons' #---------------------------------------------------------- @@ -48,20 +47,20 @@ else: # # detect version of lyx # only 1.4.x has frontends/qt2 -if os.path.isdir(os.path.join(TOP_SRC_DIR, 'src', 'frontends', 'qt2')): - PACKAGE_VERSION = '1.4.2svn' +if os.path.isdir(os.path.join(top_src_dir, 'src', 'frontends', 'qt2')): + package_version = '1.4.2svn' else: - PACKAGE_VERSION = '1.5.0svn' + package_version = '1.5.0svn' -DEVEL_VERSION = True +devel_version = True default_build_mode = 'debug' lyx_ext = '*.C' -PACKAGE = 'lyx' -PACKAGE_BUGREPORT = 'lyx-devel@lists.lyx.org' -PACKAGE_NAME = 'LyX' -PACKAGE_TARNAME = 'lyx' -PACKAGE_STRING = '%s %s' % (PACKAGE_NAME, PACKAGE_VERSION) +package = 'lyx' +package_bugreport = 'lyx-devel@lists.lyx.org' +package_name = 'LyX' +package_tarname = 'lyx' +package_string = '%s %s' % (package_name, package_version) # various cache/log files default_log_file = 'scons_lyx.log' @@ -71,31 +70,38 @@ env_cache_file = 'env.cache' #---------------------------------------------------------- # platform dependent settings #---------------------------------------------------------- + if os.name == 'nt': platform_name = 'win32' default_frontend = 'qt4' + default_prefix = 'c:/program files/lyx' default_with_x = False - packaging_method = 'windows' + default_packaging_method = 'windows' elif os.name == 'posix' and sys.platform != 'cygwin': platform_name = sys.platform default_frontend = 'qt3' + default_prefix = '/usr/local' default_with_x = True - packaging_method = 'posix' + default_packaging_method = 'posix' elif os.name == 'posix' and sys.platform == 'cygwin': platform_name = 'cygwin' default_frontend = 'qt3' + default_prefix = '/usr/local' default_with_x = True - packaging_method = 'posix' + default_packaging_method = 'posix' elif os.name == 'darwin': - platform_name = 'mac' + platform_name = 'macosx' default_frontend = 'qt3' + # FIXME: macOSX default prefix? + default_prefix = '.' default_with_x = False - packaging_method = 'mac' + default_packaging_method = 'macosx' else: # unsupported system, assume posix behavior platform_name = 'others' default_frontend = 'qt3' + default_prefix = '.' default_with_x = True - packaging_method = 'posix' + default_packaging_method = 'posix' #--------------------------------------------------------- @@ -123,7 +129,7 @@ opts.AddOptions( '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 gettext first', 'auto', allowed_values = ( @@ -133,7 +139,10 @@ opts.AddOptions( ) ), # EnumOption('spell', 'Choose spell checker to use.', 'auto', - allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ), + allowed_values = ('aspell', 'pspell', 'ispell', 'auto', 'no') ), + # packaging method + EnumOption('packaging', 'Packaging method to use.', default_packaging_method, + allowed_values = ('windows', 'posix', 'macosx')), # 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. @@ -145,7 +154,7 @@ opts.AddOptions( BoolOption('warnings', 'Use warnings', False), # enable glib, (config.h has _GLIBCXX_CONCEPT_CHECKS) BoolOption('concept_checks', 'Enable concept checks', True), - # + # BoolOption('nls', 'Whether or not use native language support', True), # FIXME: not implemented BoolOption('profile', '(NA) Whether or not enable profiling', False), @@ -154,8 +163,7 @@ opts.AddOptions( # using x11? BoolOption('X11', 'Use x11 windows system', default_with_x), # use MS VC++ to build lyx - # FIXME: detect mavc automatically (check for cl.exe) - BoolOption('use_vc', 'Use MS VC++ to build lyx', False), + BoolOption('use_vc', 'Use MS VC++ to build lyx (cl.exe will be probed)', None), # PathOption('qt_dir', 'Path to qt directory', None), # @@ -177,11 +185,9 @@ opts.AddOptions( # rebuild only specifed, comma separated targets ('rebuild', 'rebuild only specifed, comma separated targets', None), # can be set to a non-existing directory - ('prefix', 'install architecture-independent files in PREFIX', None), - # will install to dest_dir if defined. Otherwise, prefix will be used. - ('dest_dir', 'install to dest_dir', None), + ('prefix', 'install architecture-independent files in PREFIX', default_prefix), # version suffix - ('version_suffix', 'install lyx as lyx-suffix', ''), + ('version_suffix', 'install lyx as lyx-suffix', None), # how to load options ('load_option', '''load option from previous scons run. option can be yes (default): load all options @@ -194,7 +200,10 @@ opts.AddOptions( PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', None), # log file ('logfile', 'save commands (not outputs) to logfile', default_log_file), + # provided for backward compatibility + ('dest_dir', 'install to DESTDIR. (Provided for backward compatibility only)', None), # environment variable can be set as options. + ('DESTDIR', 'install to DESTDIR', None), ('CC', 'replace default $CC', None), ('LINK', 'replace default $LINK', None), ('CPP', 'replace default $CPP', None), @@ -202,16 +211,16 @@ opts.AddOptions( ('CXXCPP', 'replace default $CXXCPP', None), ('CCFLAGS', 'replace default $CCFLAGS', None), ('CPPFLAGS', 'replace default $CPPFLAGS', None), - ('LUBKFLAGS', 'replace default $LINKFLAGS', None), + ('LINKFLAGS', 'replace default $LINKFLAGS', None), ) # copied from SCons/Options/BoolOption.py +# We need to use them before a boolean ARGUMENTS option is available +# in env as bool. true_strings = ('y', 'yes', 'true', 't', '1', 'on' , 'all' ) false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none') # whether or not use current config.h, and cached tests -# note that env is not defined yet, so we have to use ARGUMENTS -# and raw values of 'yes', 'no' etc. # # if fast_start=yes (default), load variables from env_cache_file if (not ARGUMENTS.has_key('fast_start') or \ @@ -231,7 +240,7 @@ else: # if load_option=yes (default), load saved comand line options # -# This option can take values yes/no/opt1,opt2/-opt1,opt2 +# This option can take value yes/no/opt1,opt2/-opt1,opt2 # and tries to be clever in choosing options to load if (not ARGUMENTS.has_key('load_option') or \ ARGUMENTS['load_option'] not in false_strings) \ @@ -246,7 +255,7 @@ if (not ARGUMENTS.has_key('load_option') or \ opt_cache.pop('qt_dir') # some options will require full rebuild # these are in general things that will change src/config.h - for arg in ['version_suffix', 'nls', 'boost']: + for arg in ['version_suffix', 'nls', 'boost', 'spell']: if ARGUMENTS.has_key(arg) and ((not opt_cache.has_key(arg)) or \ ARGUMENTS[arg] != opt_cache[arg]): if fast_start: @@ -257,7 +266,7 @@ if (not ARGUMENTS.has_key('load_option') or \ for arg in ['fast_start', 'load_option']: if opt_cache.has_key(arg): opt_cache.pop(arg) - # now, if load_option=opt1,opt2 + # now, if load_option=opt1,opt2 or -opt1,opt2 if ARGUMENTS.has_key('load_option') and \ ARGUMENTS['load_option'] not in true_strings + false_strings: # if -opt1,opt2 is specified, do not load these options @@ -286,38 +295,74 @@ env_cache['arg_cache'] = ARGUMENTS # Setting up environment #--------------------------------------------------------- -# I do not really like ENV=os.environ, but you may add it +# I do not really like ENV=os.environ, but you may add it # here if you experience some environment related problem env = Environment(options = opts) -# Determine the frontend to use, which may be loaded -# from option cache -frontend = env.get('frontend', default_frontend) -# make sure the key exists (when using default_frontend) -env['frontend'] = frontend -# FIXME: will remove after lyx change file extension to .cpp -env['LYX_EXT'] = lyx_ext -# -use_X11 = env.get('X11', default_with_x) -# FIXME: determine the use of vc automatically -use_vc = env.get('use_vc', False) -# FIXME: use it only once for s scons-bug, will remove it later. -env['USE_VC'] = use_vc - # set individual variables since I do not really like ENV = os.environ env['ENV']['PATH'] = os.environ.get('PATH') env['ENV']['HOME'] = os.environ.get('HOME') # these are defined for MSVC env['ENV']['LIB'] = os.environ.get('LIB') env['ENV']['INCLUDE'] = os.environ.get('INCLUDE') -if use_vc: - # full path name is used to build msvs project files - env['TOP_SRC_DIR'] = Dir(TOP_SRC_DIR).abspath + +# for simplicity, use var instead of env[var] +frontend = env['frontend'] +prefix = env['prefix'] + +if platform_name == 'win32': + if env.has_key('use_vc'): + use_vc = env['use_vc'] + if WhereIs('cl.exe') is None: + print "cl.exe is not found. Are you using the MSVC environment?" + Exit(2) + elif WhereIs('cl.exe') is not None: + use_vc = True + else: + use_vc = False +else: + use_vc = False + +# 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 env.has_key('build_dir') and env['build_dir'] is not None: + env['BUILDDIR'] = env['build_dir'] else: - env['TOP_SRC_DIR'] = TOP_SRC_DIR -env['SCONS_DIR'] = SCONS_DIR + # 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) +env['LOCALLIBPATH'] = '$BUILDDIR/libs' +env.AppendUnique(LIBPATH = ['$LOCALLIBPATH']) + + +# Here is a summary of variables defined in env +# 1. defined options +# 2. undefined options with a non-None default value +# 3. compiler commands and flags like CCFLAGS. +# MSGFMT used to process po files +# 4. Variables that will be used to replace variables in some_file.in +# src/support/package.C.in: +# TOP_SRCDIR, LOCALEDIR, LYX_DIR, PROGRAM_SUFFIX +# lib/lyx2lyx/lyx2lyx_version.py.in +# PACKAGE_VERSION +# src/version.C.in +# PACKAGE_VERSION, VERSION_INFO +# src/frontends/xforms/lyx_xpm.h.in +# XPM_H_LOCATION +# src/frontends/xforms/lyx_forms.h.in +# FORMS_H_LOCATION + +# full path name is used to build msvs project files +# and to replace TOP_SRCDIR in package.C +env['TOP_SRCDIR'] = Dir(top_src_dir).abspath +# needed by src/version.C.in => src/version.C +env['PACKAGE_VERSION'] = package_version # determine share_dir etc +packaging_method = env.get('packaging') if packaging_method == 'windows': share_dir = 'Resources' man_dir = 'Resources/man/man1' @@ -330,69 +375,43 @@ else: default_prefix = '/usr/local/' # install to default_prefix by default -env['PREFIX'] = env.get('prefix', default_prefix) # program suffix: can be yes, or a string if env.has_key('version_suffix'): if env['version_suffix'] in true_strings: - env['PROGRAM_SUFFIX'] = PACKAGE_VERSION + program_suffix = package_version + elif env['version_suffix'] in false_strings: + program_suffix = '' else: - env['PROGRAM_SUFFIX'] = env['version_suffix'] + program_suffix = env['version_suffix'] else: - env['PROGRAM_SUFFIX'] = '' + program_suffix = '' +# used by package.C.in +env['PROGRAM_SUFFIX'] = program_suffix # whether or not add suffix to file and directory names -env['ADD_SUFFIX'] = packaging_method != 'windows' -if env['ADD_SUFFIX']: - env['SHARE_DIR'] = os.path.join(env['PREFIX'], share_dir + env['PROGRAM_SUFFIX']) -else: - env['SHARE_DIR'] = os.path.join(env['PREFIX'], share_dir) -env['LOCALE_DIR'] = os.path.join(env['PREFIX'], locale_dir) -# -# if dest_dir is different from prefix. -env['DEST_DIR'] = env.get('dest_dir', env['PREFIX']) -if env.has_key('exec_prefix'): - env['BIN_DEST_DIR'] = env['exec_prefix'] +add_suffix = packaging_method != 'windows' +# LYX_DIR are different (used in package.C.in) +if add_suffix: + env['LYX_DIR'] = Dir(os.path.join(prefix, share_dir + program_suffix)).abspath else: - env['BIN_DEST_DIR'] = os.path.join(env['DEST_DIR'], 'bin') -if env['ADD_SUFFIX']: - env['SHARE_DEST_DIR'] = os.path.join(env['DEST_DIR'], share_dir + env['PROGRAM_SUFFIX']) -else: - env['SHARE_DEST_DIR'] = os.path.join(env['DEST_DIR'], share_dir) -env['MAN_DEST_DIR'] = os.path.join(env['DEST_DIR'], man_dir) -env['LOCALE_DEST_DIR'] = os.path.join(env['DEST_DIR'], locale_dir) - -# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs -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 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 $mode - 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' -# to make use of local cached parameters, this one has to be '.' -env['MSVSPATH'] = '.' -env.AppendUnique(LIBPATH = ['$LOCALLIBPATH']) + env['LYX_DIR'] = Dir(os.path.join(prefix, share_dir)).abspath +# we need absolute path for package.C +env['LOCALEDIR'] = Dir(os.path.join(prefix, locale_dir)).abspath #--------------------------------------------------------- # Setting building environment (Tools, compiler flags etc) #--------------------------------------------------------- -# Since Tool('mingw') will reset CCFLAGS etc, this should be +# Since Tool('mingw') will reset CCFLAGS etc, this should be # done before getEnvVariable -if platform_name == 'win32' and not use_vc: - env.Tool('mingw') - # FIXME: set this as option? - env.AppendUnique(CPPPATH = ['#c:/MinGW/include']) -elif use_vc: - env.Tool('msvc') - env.Tool('mslink') +if platform_name == 'win32': + if use_vc: + env.Tool('msvc') + env.Tool('mslink') + else: + env.Tool('mingw') + env.AppendUnique(CPPPATH = ['#c:/MinGW/include']) # we differentiate between hard-coded options and default options # hard-coded options are required and will always be there @@ -405,28 +424,24 @@ CCFLAGS_default = [] # 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. -# # save the old c compiler and CCFLAGS (used by libintl) -env['C_COMPILER'] = env.subst('$CC') -env['C_CCFLAGS'] = env.subst('$CCFLAGS').split() +C_COMPILER = env.subst('$CC') +C_CCFLAGS = env.subst('$CCFLAGS').split() # if we use ms vc, the commands are fine (cl.exe and link.exe) -if not use_vc: +if use_vc: + # /TP treat all source code as C++ + # C4819: The file contains a character that cannot be represented + # in the current code page (number) + # C4996: foo was decleared deprecated + CCFLAGS_required.extend(['/TP', '/EHsc']) + CCFLAGS_default.extend(['/wd4819', '/wd4996', '/nologo']) +else: if env.has_key('CXX') and env['CXX']: env['CC'] = env.subst('$CXX') env['LINK'] = env.subst('$CXX') else: env['CC'] = 'g++' env['LINK'] = 'g++' -else: - # /TP treat all source code as C++ - # C4819: The file contains a character that cannot be represented - # in the current code page (number) - # C4996: foo was decleared deprecated - CCFLAGS_required.extend(['/TP', '/EHsc']) - CCFLAGS_default.extend(['/wd4819', '/wd4996', '/nologo']) - env.Append(C_CCFLAGS=['/Dinline#', '/D__attribute__(x)#', '/Duintmax_t=UINT_MAX']) # for debug/release mode if env.has_key('optimization') and env['optimization'] is not None: @@ -454,19 +469,35 @@ elif env['mode'] == 'release' and set_default_optimization_flags: # 1. if command line option exists: replace default # 2. then if s envronment variable exists: replace default # 3. set variable to required + default -def setEnvVariable(env, name, required=[], default=[]): +def setEnvVariable(env, name, required = None, default = None, split = True): + ''' env: environment to set variable + name: variable + required: hardcoded options + default: default options that can be replaced by command line or + environment variables + split: whether or not split obtained variable like '-02 -g' + ''' # first try command line argument (override environment settings) if ARGUMENTS.has_key(name): - # multiple options may be passed like "-02 -g" - default = ARGUMENTS[name].split() + default = ARGUMENTS[name] + if split: + default = default.split() # then use environment default elif os.environ.has_key(name): - print "Acquiring varaible %s from system environment: %s" % (name, env[name]) - default = os.environ[name].split() + print "Acquiring varaible %s from system environment: %s" % (name, os.environ[name]) + default = os.environ[name] + if split: + default = default.split() # set variable - if required != [] or default != []: - env[name] = required + default + if required is not None: + env[name] = required + if default is not None: + if env.has_key(name): + env[name] += default + else: + env[name] = default +setEnvVariable(env, 'DESTDIR', split=False) setEnvVariable(env, 'CC') setEnvVariable(env, 'LINK') setEnvVariable(env, 'CPP') @@ -477,6 +508,11 @@ setEnvVariable(env, 'CXXFLAGS') setEnvVariable(env, 'CPPFLAGS') setEnvVariable(env, 'LINKFLAGS', LINKFLAGS_required) +# if DESTDIR is not set... +if env.has_key('dest_dir'): + print "This option is obsolete. Please use DESTDIR instead." + env['DESTDIR'] = env['dest_dir'] +dest_dir = env.get('DESTDIR', prefix) #--------------------------------------------------------- # Frontend related variables (QTDIR etc) @@ -492,38 +528,45 @@ else: env['QTDIR'] = os.environ.get('QTDIR', '/usr/lib/qt-3.3') if env.has_key('qt_lib_path') and env['qt_lib_path']: - env['QT_LIB_PATH'] = env['qt_lib_path'] + qt_lib_path = env.subst('$qt_lib_path') else: - env['QT_LIB_PATH'] = '$QTDIR/lib' -env.AppendUnique(LIBPATH = ['$QT_LIB_PATH']) + qt_lib_path = env.subst('$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')) +env.PrependENVPath('PKG_CONFIG_PATH', qt_lib_path) if env.has_key('qt_inc_path') and env['qt_inc_path']: - env['QT_INC_PATH'] = env['qt_inc_path'] + 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/' + qt_inc_path = '$QTDIR/include' +# this is the path for cygwin. +elif os.path.isdir('/usr/include/' + frontend): + qt_inc_path = '/usr/include/$frontend' +else: + print "Qt include directory not found. Please specify it using qt_inc_path" + Exit(1) # Note that this CPPPATH is for testing only # it will be removed before calling SConscript -env['CPPPATH'] = [env['QT_INC_PATH']] +env['CPPPATH'] = [qt_inc_path] # # extra_inc_path and extra_lib_path # +extra_inc_paths = [] if env.has_key('extra_inc_path') and env['extra_inc_path']: - env.AppendUnique(CPPPATH = [env['extra_inc_path']]) + extra_inc_paths.append(env['extra_inc_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') and env['extra_inc_path1']: - env.AppendUnique(CPPPATH = [env['extra_inc_path1']]) + extra_inc_paths.append(env['extra_inc_path1']) if env.has_key('extra_lib_path1') and env['extra_lib_path1']: env.AppendUnique(LIBPATH = [env['extra_lib_path1']]) if env.has_key('extra_bin_path') and env['extra_bin_path']: # maybe only one of them is needed os.environ['PATH'] += os.pathsep + env['extra_bin_path'] env['ENV']['PATH'] += os.pathsep + env['extra_bin_path'] +# extra_inc_paths will be used later by intlenv etc +env.AppendUnique(CPPPATH = extra_inc_paths) #---------------------------------------------------------- @@ -540,11 +583,9 @@ conf = Configure(env, 'CheckCommand' : utils.checkCommand, 'CheckCXXGlobalCstd' : utils.checkCXXGlobalCstd, 'CheckLC_MESSAGES' : utils.checkLC_MESSAGES, - 'CheckIconvConst' : utils.checkIconvConst, } ) - # pkg-config? (if not, we use hard-coded options) if not fast_start: if conf.CheckPkgConfig('0.15.0'): @@ -588,8 +629,8 @@ if not fast_start: succ = True for lib in ['QtCore', 'QtGui']: # windows version has something like QtGui4 ... - if not (os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s.a' % lib)) or \ - os.path.isfile(os.path.join(env.subst('$QT_LIB_PATH'), 'lib%s4.a' % lib))): + if not (os.path.isfile(os.path.join(qt_lib_path, 'lib%s.a' % lib)) or \ + os.path.isfile(os.path.join(qt_lib_path, 'lib%s4.a' % lib))): succ = False break # still can not find it @@ -602,48 +643,49 @@ if not fast_start: # now, if msvc2005 is used, we will need that QT_LIB_PATH/QT_LIB.manifest file if use_vc: # glob file xxx.dll.manifest (msvc 2003 may not have it) - manifests = glob.glob(os.path.join(env.subst('$QT_LIB_PATH'), '*.dll.manifest')) + manifests = glob.glob(os.path.join(qt_lib_path, '*.dll.manifest')) if manifests != []: env['LINKCOM'] = [env['LINKCOM'], 'mt.exe /MANIFEST %s /outputresource:$TARGET;1' % manifests[0]] # check socket libs if not fast_start: - env['SOCKET_LIBS'] = [] + socket_libs = [] if conf.CheckLib('socket'): - env['SOCKET_LIBS'].append('socket') - + socket_libs.append('socket') # nsl is the network services library and provides a # transport-level interface to networking services. if conf.CheckLib('nsl'): - env['SOCKET_LIBS'].append('nsl') - - env_cache['SOCKET_LIBS'] = env['SOCKET_LIBS'] + socket_libs.append('nsl') + env_cache['SOCKET_LIBS'] = socket_libs else: - env['SOCKET_LIBS'] = env_cache['SOCKET_LIBS'] + socket_libs = env_cache['SOCKET_LIBS'] + +# check available boost libs (since lyx1.4 does not use iostream) +boost_libs = [] +for lib in ['signals', 'regex', 'filesystem', 'iostreams']: + if os.path.isdir(os.path.join(top_src_dir, 'boost', 'libs', lib)): + boost_libs.append(lib) if not fast_start: # check boost libraries boost_opt = ARGUMENTS.get('boost', 'auto') # check for system boost paths = env['LIBPATH'] + ['/usr/lib', '/usr/local/lib'] - env['BOOST_LIBRARIES'] = [] + boost_libraries = [] boost_libpath = None # here I assume that all libraries are in the same directory - for lib in ['signals', 'regex', 'filesystem', 'iostreams']: - # lyx1.4 does not use iostreams - if not os.path.isdir(os.path.join(env.subst('$TOP_SRC_DIR'), 'boost', 'libs', lib)): - continue + for lib in boost_libs: if boost_opt == 'included': - env['BOOST_LIBRARIES'].append('included_boost_%s' % lib) + boost_libraries.append('included_boost_%s' % lib) env['INCLUDED_BOOST'] = True elif boost_opt == 'auto': res = conf.CheckBoostLibraries('boost_%s' % lib , paths) # if not found if res[0] == '': - env['BOOST_LIBRARIES'].append('included_boost_%s' % lib) + boost_libraries.append('included_boost_%s' % lib) env['INCLUDED_BOOST'] = True else: - env['BOOST_LIBRARIES'].append(res[1]) + boost_libraries.append(res[1]) env['INCLUDED_BOOST'] = False boost_libpath = res[0] elif boost_opt == 'system': @@ -654,25 +696,25 @@ if not fast_start: print "Or use boost=included to use included boost libraries." Exit(2) else: - env['BOOST_LIBRARIES'].append(res[1]) + boost_libraries.append(res[1]) env.AppendUnique(LIBPATH = [res[0]]) boost_libpath = res[0] - env_cache['BOOST_LIBRARIES'] = env['BOOST_LIBRARIES'] + env_cache['BOOST_LIBRARIES'] = boost_libraries env_cache['INCLUDED_BOOST'] = env['INCLUDED_BOOST'] env_cache['BOOST_LIBPATH'] = boost_libpath else: - env['BOOST_LIBRARIES'] = env_cache['BOOST_LIBRARIES'] + boost_libraries = env_cache['BOOST_LIBRARIES'] if env_cache['BOOST_LIBPATH'] is not None: env.AppendUnique(LIBPATH = [env_cache['BOOST_LIBPATH']]) env['INCLUDED_BOOST'] = env_cache['INCLUDED_BOOST'] -env['ENABLE_NLS'] = not env.has_key('nls') or env['nls'] +env['ENABLE_NLS'] = env['nls'] if not fast_start: if not env['ENABLE_NLS']: - env['INTL_LIBS'] = [] - env['INCLUDED_GETTEXT'] = False + intl_libs = [] + included_gettext = False else: # check gettext libraries gettext_opt = ARGUMENTS.get('gettext', 'auto') @@ -680,8 +722,8 @@ if not fast_start: succ = False if gettext_opt in ['auto', 'system']: if conf.CheckLib('intl'): - env['INCLUDED_GETTEXT'] = False - env['INTL_LIBS'] = ['intl'] + included_gettext = False + intl_libs = ['intl'] succ = True else: # no found if gettext_opt == 'system': @@ -692,13 +734,13 @@ if not fast_start: # now, auto and succ = false, or gettext=included if not succ: # we do not need to set LIBPATH now. - env['INCLUDED_GETTEXT'] = True - env['INTL_LIBS'] = ['included_intl'] - env_cache['INCLUDED_GETTEXT'] = env['INCLUDED_GETTEXT'] - env_cache['INTL_LIBS'] = env['INTL_LIBS'] + included_gettext = True + intl_libs = ['included_intl'] + env_cache['INCLUDED_GETTEXT'] = included_gettext + env_cache['INTL_LIBS'] = intl_libs else: - env['INTL_LIBS'] = env_cache['INTL_LIBS'] - env['INCLUDED_GETTEXT'] = env_cache['INCLUDED_GETTEXT'] + intl_libs = env_cache['INTL_LIBS'] + included_gettext = env_cache['INCLUDED_GETTEXT'] # # check for msgfmt command @@ -713,437 +755,258 @@ else: # Generating config.h #---------------------------------------------------------- if not fast_start: - print "Generating ", utils.config_h, "..." - - # I do not handle all macros in src/config.h.in, rather I am following a list - # of *used-by-lyx* macros compiled by Abdelrazak Younes - # - # 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_STRINGS_H - # HAVE_DIRECT_H - # HAVE_ISTREAM - # HAVE_OSTREAM - # HAVE_IOS - - # for libintl % grep HAVE * | grep _H | cut -d: -f2 | sort -u - - # - # HAVE_INTTYPES_H - # HAVE_STDINT_H - # HAVE_ALLOCA_H - # HAVE_STDLIB_H - # HAVE_STRING_H - # HAVE_STDDEF_H - # HAVE_LIMITS_H - # HAVE_ARGZ_H - # HAVE_UNISTD_H - # HAVE_SYS_PARAM_H - - # 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'), - ('inttypes.h', 'HAVE_INTTYPES_H', 'c'), - ('utime.h', 'HAVE_UTIME_H', 'c'), - ('string.h', 'HAVE_STRING_H', 'c'), - ('strings.h', 'HAVE_STRINGS_H', 'c'), - ('direct.h', 'HAVE_DIRECT_H', 'c'), - ('istream', 'HAVE_ISTREAM', 'cxx'), - ('ostream', 'HAVE_OSTREAM', 'cxx'), - ('ios', 'HAVE_IOS', 'cxx'), - ('argz.h', 'HAVE_ARGZ_H', 'c'), - ('limits.h', 'HAVE_LIMITS_H', 'c'), - ('alloca.h', 'HAVE_ALLOCA_H', 'c'), - ('stddef.h', 'HAVE_STDDEF_H', 'c'), - ('stdint.h', 'HAVE_STDINT_H', 'c'), - ('sys/param.h', 'HAVE_SYS_PARAM_H', 'c'), - ] - - 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])): - utils.addToConfig('#define %s 1' % header[1], desc = description) - else: - utils.addToConfig('/* #undef %s */' % header[1], desc = description) - - # 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_PUTENV - # HAVE_MKTEMP - # HAVE_MKSTEMP - # HAVE_STRERROR - # HAVE_STD_COUNT - # HAVE_GETCWD - # HAVE_STRCPY - # HAVE_STRCASECMP - # HAVE_STRDUP - # HAVE_STRTOUL - # HAVE_WCSLEN - # HAVE_MMAP ? - # HAVE_ALLOCA - # HAVE___FSETLOCKING - # HAVE_MEMPCPY - # HAVE_STRCASECMP - # HAVE___ARGZ_COUNT - # HAVE___ARGZ_NEXT - # HAVE___ARGZ_STRINGIFY - # HAVE___FSETLOCKING - # HAVE_GETCWD - # HAVE_STRTOUL - # HAVE_STRCASECMP - # HAVE_STRDUP - # HAVE_TSEARCH - - # Check functions - functions = [ - ('open', 'HAVE_OPEN', None), - ('close', 'HAVE_CLOSE', None), - ('popen', 'HAVE_POPEN', None), - ('pclose', 'HAVE_PCLOSE', None), - ('_open', 'HAVE__OPEN', None), - ('_close', 'HAVE__CLOSE', None), - ('_popen', 'HAVE__POPEN', None), - ('_pclose', 'HAVE__PCLOSE', None), - ('getpid', 'HAVE_GETPID', None), - ('_getpid', 'HAVE__GETPID', None), - ('mkdir', 'HAVE_MKDIR', None), - ('_mkdir', 'HAVE__MKDIR', None), - ('putenv', 'HAVE_PUTENV', None), - ('mktemp', 'HAVE_MKTEMP', None), - ('mkstemp', 'HAVE_MKSTEMP', None), - ('strerror', 'HAVE_STRERROR', None), - ('count', 'HAVE_STD_COUNT', ''' -#include -int count() -{ - char a[] = "hello"; - return std::count(a, a+5, 'l'); -} -'''), - ('getcwd', 'HAVE_GETCWD', None), - ('stpcpy', 'HAVE_STPCPY', None), - ('strcasecmp', 'HAVE_STRCASECMP', None), - ('strdup', 'HAVE_STRDUP', None), - ('strtoul', 'HAVE_STRTOUL', None), - ('alloca', 'HAVE_ALLOCA', None), - ('__fsetlocking', 'HAVE___FSETLOCKING', None), - ('mempcpy', 'HAVE_MEMPCPY', None), - ('__argz_count', 'HAVE___ARGZ_COUNT', None), - ('__argz_next', 'HAVE___ARGZ_NEXT', None), - ('__argz_stringify', 'HAVE___ARGZ_STRINGIFY', None), - ('setlocale', 'HAVE_SETLOCALE', None), - ('tsearch', 'HAVE_TSEARCH', None), - ('getegid', 'HAVE_GETEGID', None), - ('getgid', 'HAVE_GETGID', None), - ('getuid', 'HAVE_GETUID', None), - ('wcslen', 'HAVE_WCSLEN', None) - ] - - for func in functions: - description = "Define to 1 if you have the `%s' function." % func[0] - if conf.CheckFunc(func[0], header=func[2]): - utils.addToConfig('#define %s 1' % func[1], desc = description) - else: - utils.addToConfig('/* #undef %s */' % func[1], desc = description) - - - # HAVE_ASPRINTF - # HAVE_WPRINTF - # HAVE_SNPRINTF - # HAVE_POSIX_PRINTF - # HAVE_FCNTL - - env_functions = [ - ('asprintf', 'HAVE_ASPRINTF'), - ('wprintf', 'HAVE_WPRINTF'), - ('snprintf', 'HAVE_SNPRINTF'), - ('printf', 'HAVE_POSIX_PRINTF'), - ('fcntl', 'HAVE_FCNTL') - ] - - for func in env_functions: - description = "Define to 1 if you have the `%s' function." % func[0] - if conf.CheckFunc(func[0]): - utils.addToConfig('#define %s 1' % func[1], desc = description) - env[func[1]] = 1 - else: - utils.addToConfig('/* #undef %s */' % func[1], desc = description) - env[func[1]] = 0 - - # HAVE_INTMAX_T - # HAVE_DECL_ISTREAMBUF_ITERATOR - description = "Define to 1 if you have the `intmax_t' type." - if conf.CheckType('intmax_t', includes='#include ') or \ - conf.CheckType('intmax_t', includes='#include '): - utils.addToConfig('#define HAVE_INTMAX_T 1', desc = description) - else: - utils.addToConfig('/* #undef HAVE_INTMAX_T */',desc = description) - - # HAVE_INTMAX_T - # HAVE_LONG_DOUBLE - # HAVE_LONG_LONG - # HAVE_WCHAR_T - # HAVE_WINT_T - # HAVE_INTTYPES_H_WITH_UINTMAX - # HAVE_STDINT_H_WITH_UINTMAX - - types = [ - ('intmax_t', 'HAVE_INTMAX_T', None), - ('long double', 'HAVE_LONG_DOUBLE', None), - ('long long', 'HAVE_LONG_LONG', None), - ('wchar_t', 'HAVE_WCHAR_T', None), - ('wint_t', 'HAVE_WINT_T', None), - ('uintmax_t', 'HAVE_INTTYPES_H_WITH_UINTMAX', '#include '), - ('uintmax_t', 'HAVE_STDINT_H_WITH_UINTMAX', '#include '), - ('std::istreambuf_iterator', 'HAVE_DECL_ISTREAMBUF_ITERATOR', - '#include \n#include ') - ] - for t in types: - description = "Define to 1 if you have the `%s' type." % t[0] - if conf.CheckType(t[0], includes=t[2]): - utils.addToConfig('#define %s 1' % t[1], desc = description) - else: - utils.addToConfig('/* #undef %s */' % t[1], desc = description) - - # windows/msvc sys/types.h does not have pid_t - # FIXME: #include is the right way? - if not conf.CheckType('pid_t', includes='#include '): - utils.addToConfig('#define pid_t int', desc = 'Define is sys/types.h does not have pid_t') - - # determine the use of std::tolower or tolower - description = 'Define if your C++ compiler puts C library functions in the global namespace' - if conf.CheckCXXGlobalCstd(): - utils.addToConfig('#define CXX_GLOBAL_CSTD 1', desc = description) - else: - utils.addToConfig('/* #undef CXX_GLOBAL_CSTD */', desc = description) - - # HAVE_LIBGDI32 - # HAVE_ICONV - # HAVE_LIBC - # HAVE_LIBAIKSAURUS - libs = [ - ('gdi32', 'HAVE_LIBGDI32'), - ('iconv', 'HAVE_ICONV'), - ('c', 'HAVE_LIBC'), - ('Aiksaurus', 'HAVE_LIBAIKSAURUS'), - ] - for lib in libs: - description = "Define to 1 if you have the `%s' library (-l%s)." % (lib[0], lib[0]) - if conf.CheckLib(lib[0]): - utils.addToConfig('#define %s 1' % lib[1], desc = description) - env[lib[1]] = True - else: - utils.addToConfig('/* #undef %s */' % lib[1], desc = description) - env[lib[1]] = False - - # HAVE_LC_MESSAGES - description = 'Define if your file defines LC_MESSAGES.' - if conf.CheckLC_MESSAGES(): - utils.addToConfig('#define HAVE_LC_MESSAGES 1', desc = description) - else: - utils.addToConfig('/* #undef HAVE_LC_MESSAGES */', desc = description) - - # ICONV_CONST - description = 'Define as const if the declaration of iconv() needs const.' - if conf.CheckIconvConst(): - utils.addToConfig('#define ICONV_CONST', desc = description) - else: - utils.addToConfig('/* #undef ICONV_CONST */', desc = description) - - # PACKAGE - # PACKAGE_VERSION - # PACKAGE_BUGREPORT - # PACKAGE_NAME - # PACKAGE_STRING - # DEVEL_VERSION - utils.addToConfig('#define PACKAGE "%s%s"' % (PACKAGE, env['PROGRAM_SUFFIX']), - desc = "Name of package") - - utils.addToConfig('#define PACKAGE_BUGREPORT "%s"' % PACKAGE_BUGREPORT, - desc = 'Define to the address where bug reports for this package should be sent.') - - utils.addToConfig('#define PACKAGE_NAME "%s"' % PACKAGE_NAME, - desc = 'Define to the full name of this package.') - - utils.addToConfig('#define PACKAGE_STRING "%s"' % PACKAGE_STRING, - desc = "Define to the full name and version of this package.") - - utils.addToConfig('#define PACKAGE_TARNAME "%s"' % PACKAGE_TARNAME, - desc = "Define to the one symbol short name of this package.") - - utils.addToConfig('#define PACKAGE_VERSION "%s"' % PACKAGE_VERSION, - desc = "Define to the version of this package.") - - 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', 'Define if you want assertions to be enabled in the code'), - ('ENABLE_NLS', 'nls', "Define to 1 if translation of program messages to the user's native anguage is requested."), - ('WITH_WARNINGS', 'warnings', 'Define this if you want to see the warning directives put here and there by the developpers to get attention'), - ('_GLIBCXX_CONCEPT_CHECKS', 'concept_checks', 'libstdc++ concept checking'), - ] - - for val in values: - if (env.has_key(val[0]) and env[val[0]]) or \ - (env.has_key(val[1]) and env[val[1]]): - utils.addToConfig('#define %s 1' % val[0], desc = val[2]) - else: - utils.addToConfig('/* #undef %s */' % val[0], desc = val[2]) - - # disable automatic linking of boost libraries. - # This is an interesting feature that is supposed to be useful under - # windows but since I can not find a way to use it on all platforms, - # I disable it for now. - utils.addToConfig('#define BOOST_ALL_NO_LIB 1') + print "Generating src/config.h..." # AIKSAURUS_H_LOCATION if (conf.CheckCXXHeader("Aiksaurus.h")): - utils.addToConfig("#define AIKSAURUS_H_LOCATION ") + aik_location = '' elif (conf.CheckCXXHeader("Aiksaurus/Aiksaurus.h")): - utils.addToConfig("#define AIKSAURUS_H_LOCATION ") + aik_location = '' else: - utils.addToConfig("#define AIKSAURUS_H_LOCATION") - - # USE_ASPELL - # USE_PSPELL - # USE_ISPELL + aik_location = '' # 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', desc = 'Define as 1 to use the aspell library') - env['USE_ASPELL'] = True - env['USE_PSPELL'] = False - env['USE_ISPELL'] = False - spell_detected = True - elif spell_engine in ['auto', 'pspell'] and \ - conf.CheckLib('pspell'): - utils.addToConfig('#define USE_PSPELL 1', desc = 'Define as 1 to use the pspell library') - env['USE_ASPELL'] = False - env['USE_PSPELL'] = True - env['USE_ISPELL'] = False - spell_detected = True - elif spell_engine in ['auto', 'ispell'] and \ - conf.CheckLib('ispell'): - utils.addToConfig('#define USE_ISPELL 1', desc = 'Define as 1 to use the ispell library') - env['USE_ASPELL'] = False - env['USE_PSPELL'] = False - env['USE_ISPELL'] = True - 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 - - # 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 - # 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. - if os.name != 'nt': - utils.addToConfig('#define BOOST_POSIX 1') + spell_opt = ARGUMENTS.get('spell', 'auto') + env['USE_ASPELL'] = False + env['USE_PSPELL'] = False + env['USE_ISPELL'] = False + if spell_opt in ['auto', 'aspell'] and conf.CheckLib('aspell'): + spell_engine = 'USE_ASPELL' + elif spell_opt in ['auto', 'pspell'] and conf.CheckLib('pspell'): + spell_engine = 'USE_PSPELL' + elif spell_opt in ['auto', 'ispell'] and conf.CheckLib('ispell'): + spell_engine = 'USE_ISPELL' else: - utils.addToConfig('/* #undef BOOST_POSIX */') + spell_engine = None - # MKDIR_TAKES_ONE_ARG - description = 'Define if mkdir takes only one argument.' - if conf.CheckMkdirOneArg(): - utils.addToConfig('#define MKDIR_TAKES_ONE_ARG 1', desc = description) + if spell_engine is not None: + env[spell_engine] = True else: - utils.addToConfig('/* #undef MKDIR_TAKES_ONE_ARG */', desc = description) - - # SELECT_TYPE_ARG1 - # SELECT_TYPE_ARG234 - # SELECT_TYPE_ARG5 - (arg1, arg234, arg5) = conf.CheckSelectArgType() - utils.addToConfig('#define SELECT_TYPE_ARG1 %s' % arg1, - desc = "Define to the type of arg 1 for `select'.") - utils.addToConfig('#define SELECT_TYPE_ARG234 %s' % arg234, - desc = "Define to the type of arg 2, 3, 4 for `select'.") - utils.addToConfig('#define SELECT_TYPE_ARG5 %s' % arg5, - desc = "Define to the type of arg 5 for `select'.") - - # mkstemp - # USE_BOOST_FORMAT - # WANT_GETFILEATTRIBUTESEX_WRAPPER - utils.endConfigH(TOP_SRC_DIR) - - for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_ASPRINTF', \ - 'HAVE_WPRINTF', 'HAVE_SNPRINTF', 'HAVE_POSIX_PRINTF', 'HAVE_FCNTL', \ - 'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBC', 'HAVE_LIBAIKSAURUS']: + if spell_opt == 'auto': + print "Warning: Can not locate any spell checker" + elif spell_opt != 'no': + print "Warning: Can not locate specified spell checker:", spell_opt + Exit(1) + + # check arg types of select function + (select_arg1, select_arg234, select_arg5) = conf.CheckSelectArgType() + + # + # create config.h + result = utils.createConfigFile(conf, + config_file = os.path.join(top_src_dir, 'src', 'config.h'), + config_pre = '''/* src/config.h. Generated by SCons. */ + +/* -*- 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 +''', + 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'), + ('direct.h', 'HAVE_DIRECT_H', 'c'), + ('istream', 'HAVE_ISTREAM', 'cxx'), + ('ostream', 'HAVE_OSTREAM', 'cxx'), + ('ios', 'HAVE_IOS', 'cxx'), + ], + functions = [ + ('open', 'HAVE_OPEN', None), + ('close', 'HAVE_CLOSE', None), + ('popen', 'HAVE_POPEN', None), + ('pclose', 'HAVE_PCLOSE', None), + ('_open', 'HAVE__OPEN', None), + ('_close', 'HAVE__CLOSE', None), + ('_popen', 'HAVE__POPEN', None), + ('_pclose', 'HAVE__PCLOSE', None), + ('getpid', 'HAVE_GETPID', None), + ('_getpid', 'HAVE__GETPID', None), + ('mkdir', 'HAVE_MKDIR', None), + ('_mkdir', 'HAVE__MKDIR', None), + ('mktemp', 'HAVE_MKTEMP', None), + ('mkstemp', 'HAVE_MKSTEMP', None), + ('strerror', 'HAVE_STRERROR', None), + ('count', 'HAVE_STD_COUNT', ''' + #include + int count() + { + char a[] = "hello"; + return std::count(a, a+5, 'l'); + } + '''), + ('getcwd', 'HAVE_GETCWD', None), + ('setenv', 'HAVE_SETENV', None), + ('putenv', 'HAVE_PUTENV', None), + ('fcntl', 'HAVE_FCNTL', None), + ], + types = [ + ('std::istreambuf_iterator', 'HAVE_DECL_ISTREAMBUF_ITERATOR', + '#include \n#include ') + ], + libs = [ + ('gdi32', 'HAVE_LIBGDI32'), + (('iconv', 'libiconv'), 'HAVE_ICONV', 'ICONV_LIB'), + (('Aiksaurus', 'libAiksaurus'), 'HAVE_LIBAIKSAURUS', 'AIKSAURUS_LIB'), + ], + custom_tests = [ + (conf.CheckType('pid_t', includes='#include '), + 'HAVE_PID_T', + 'Define is sys/types.h does not have pid_t', + '', + '#define pid_t int', + ), + (conf.CheckCXXGlobalCstd(), + 'CXX_GLOBAL_CSTD', + 'Define if your C++ compiler puts C library functions in the global namespace' + ), + (conf.CheckMkdirOneArg(), + 'MKDIR_TAKES_ONE_ARG', + 'Define if mkdir takes only one argument.' + ), + (conf.CheckLC_MESSAGES(), + 'HAVE_LC_MESSAGES', + 'Define if your file defines LC_MESSAGES.' + ), + (devel_version, 'DEVEL_VERSION', 'Whether or not a development version'), + (env.has_key('assertions') and env['assertions'], + 'ENABLE_ASSERTIONS', + 'Define if you want assertions to be enabled in the code' + ), + (env.has_key('nls') and env['nls'], + 'ENABLE_NLS', + "Define to 1 if translation of program messages to the user's native anguage is requested.", + ), + (env.has_key('warnings') and env['warnings'], + 'WITH_WARNINGS', + 'Define this if you want to see the warning directives put here and there by the developpers to get attention' + ), + (env.has_key('concept_checks') and env['concept_checks'], + '_GLIBCXX_CONCEPT_CHECKS', + 'libstdc++ concept checking' + ), + (os.name != 'nt', 'BOOST_POSIZ', + 'Indicates to boost which API to use (posix or windows).' + ), + (spell_engine is not None, spell_engine, + 'Spell engine to use' + ), + ], + extra_items = [ + ('#define PACKAGE "%s%s"' % (package, program_suffix), + 'Name of package'), + ('#define PACKAGE_BUGREPORT "%s"' % package_bugreport, + 'Define to the address where bug reports for this package should be sent.'), + ('#define PACKAGE_NAME "%s"' % package_name, + 'Define to the full name of this package.'), + ('#define PACKAGE_STRING "%s"' % package_string, + 'Define to the full name and version of this package.'), + ('#define PACKAGE_TARNAME "%s"' % package_tarname, + 'Define to the one symbol short name of this package.'), + ('#define PACKAGE_VERSION "%s"' % package_version, + 'Define to the version of this package.'), + ('#define BOOST_ALL_NO_LIB 1', + 'disable automatic linking of boost libraries.'), + ('#define USE_%s_PACKAGING 1' % packaging_method.upper(), + 'Packaging method'), + ('#define AIKSAURUS_H_LOCATION ' + aik_location, + 'Aiksaurus include file'), + ('#define SELECT_TYPE_ARG1 %s' % select_arg1, + "Define to the type of arg 1 for `select'."), + ('#define SELECT_TYPE_ARG234 %s' % select_arg234, + "Define to the type of arg 2, 3, 4 for `select'."), + ('#define SELECT_TYPE_ARG5 %s' % select_arg5, + "Define to the type of arg 5 for `select'."), + ], + config_post = '''/************************************************************ + ** 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 + +#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 +''' + ) + + # these keys are needed in env + for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_FCNTL',\ + 'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS', + 'ICONV_LIB', 'AIKSAURUS_LIB']: + # USE_ASPELL etc does not go through result + if result.has_key(key): + env[key] = result[key] env_cache[key] = env[key] else: # - # this comes as a big surprise, without this line + # this comes as a big surprise, without this line # (doing nothing obvious), adding fast_start=yes # to a build with fast_start=no will result in a rebuild # Note that the exact header file to check does not matter conf.CheckCHeader('io.h') # only a few variables need to be rescanned - for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_ASPRINTF', \ - 'HAVE_WPRINTF', 'HAVE_SNPRINTF', 'HAVE_POSIX_PRINTF', 'HAVE_FCNTL', \ - 'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBC', 'HAVE_LIBAIKSAURUS']: + for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_FCNTL',\ + 'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS', + 'ICONV_LIB', 'AIKSAURUS_LIB']: env[key] = env_cache[key] - # # Finish auto-configuration env = conf.Finish() @@ -1160,16 +1023,14 @@ env = conf.Finish() try: if frontend in ['qt2', 'qt3']: # note: env.Tool('qt') my set QT_LIB to qt - env['QT_LIB'] = 'qt-mt' - env['FRONTEND_LIBS'] = ['qt-mt'] - if platform_name == 'cygwin' and use_X11: - env.AppendUnique(LIBPATH = ['/usr/X11R6/lib']) + qt_libs = ['qt-mt'] + frontend_libs = ['qt-mt'] elif frontend == 'qt4': if platform_name == "win32": - env['QT_LIB'] = ['QtCore4', 'QtGui4'] + qt_libs = ['QtCore4', 'QtGui4'] else: - env['QT_LIB'] = ['QtCore', 'QtGui'] - env['FRONTEND_LIBS'] = env['QT_LIB'] + qt_libs = ['QtCore', 'QtGui'] + frontend_libs = qt_libs except: print "Can not locate qt tools" print "What I get is " @@ -1180,20 +1041,20 @@ if platform_name in ['win32', 'cygwin']: # the final link step needs stdc++ to succeed under mingw # FIXME: shouldn't g++ automatically link to stdc++? if use_vc: - env['SYSTEM_LIBS'] = ['shlwapi', 'shell32', 'advapi32', 'zdll'] + system_libs = ['shlwapi', 'shell32', 'advapi32', 'zdll'] else: - env['SYSTEM_LIBS'] = ['shlwapi', 'stdc++', 'z'] -elif platform_name == 'cygwin' and use_X11: - env['SYSTEM_LIBS'] = ['GL', 'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor', + system_libs = ['shlwapi', 'stdc++', 'z'] +elif platform_name == 'cygwin' and env['X11']: + system_libs = ['GL', 'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor', 'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv', 'pthread', 'z'] else: - env['SYSTEM_LIBS'] = ['z'] + system_libs = ['z'] libs = [ - ('HAVE_ICONV', 'iconv'), + ('HAVE_ICONV', env['ICONV_LIB']), ('HAVE_LIBGDI32', 'gdi32'), - ('HAVE_LIBAIKSAURUS', 'Aiksaurus'), + ('HAVE_LIBAIKSAURUS', env['AIKSAURUS_LIB']), ('USE_ASPELL', 'aspell'), ('USE_ISPELL', 'ispell'), ('USE_PSPELL', 'pspell'), @@ -1201,16 +1062,20 @@ libs = [ for lib in libs: if env[lib[0]]: - env['SYSTEM_LIBS'].append(lib[1]) + system_libs.append(lib[1]) # # Build parameters CPPPATH etc +# +if env['X11']: + env.AppendUnique(LIBPATH = ['/usr/X11R6/lib']) + # # boost is always in, src is needed for config.h -# +# # QT_INC_PATH is not needed for *every* source file -env['CPPPATH'].remove(env['QT_INC_PATH']) -env['CPPPATH'] += ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src'] +env['CPPPATH'].remove(qt_inc_path) +env['CPPPATH'] += ['$TOP_SRCDIR/boost', '$TOP_SRCDIR/src'] # # Customized builders @@ -1233,15 +1098,6 @@ if platform_name == 'cygwin': # # Report results # -# src/support/package.C.in needs the following to replace -# LYX_ABS_INSTALLED_DATADIR (e.g. /usr/local/lyx/share/lyx) -env['LYX_DIR'] = Dir(env['SHARE_DIR']).abspath -# LYX_ABS_INSTALLED_LOCALEDIR -env['LOCALEDIR'] = Dir(env['LOCALE_DIR']).abspath -# during variable substitution, absolute path is needed. -env['TOP_SRCDIR'] = Dir(env['TOP_SRC_DIR']).abspath -# 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 @@ -1265,7 +1121,6 @@ Frontend: Frontend: %s Packaging: %s LyX dir: %s - LyX binary dir: %s LyX files dir: %s ''' % (platform_name, env.subst('$CCFLAGS'), env.subst('$CC'), @@ -1274,16 +1129,16 @@ Frontend: 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['FRONTEND_LIBS']), str(env['SYSTEM_LIBS']), str(env['CPPPATH']), - env['frontend'], packaging_method, - env['PREFIX'], env['BIN_DEST_DIR'], env['SHARE_DIR']) + str(env['LIBPATH']), str(boost_libraries), + str(frontend_libs), str(system_libs), str(env['CPPPATH']), + frontend, packaging_method, + prefix, env['LYX_DIR']) -if env['frontend'] in ['qt2', 'qt3', 'qt4']: +if frontend in ['qt2', '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) +''' % (qt_inc_path, qt_lib_path, env['X11']) if not fast_start: print env['VERSION_INFO'] @@ -1307,35 +1162,1184 @@ if logfile != '' or platform_name == 'win32': env['VERSION_INFO'].replace('\n','\n# ')) ) -# # Cleanup stuff # # -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') - # this has been the source of problems on some platforms... # I find that I need to supply it with full path name env.SConsignFile(os.path.join(Dir(env['BUILDDIR']).abspath, '.sconsign')) # this usage needs further investigation. #env.CacheDir('%s/Cache/%s' % (env['BUILDDIR'], frontend)) -env['BUILD_TARGETS'] = BUILD_TARGETS +print "Building all targets recursively" + if env.has_key('rebuild'): - env['REBUILD_TARGETS'] = env['rebuild'].split(',') + rebuild_targets = env['rebuild'].split(',') else: - env['REBUILD_TARGETS'] = None + rebuild_targets = None + +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 = 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 = (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 frontend == 'qt2') or 'qt2' in targets +build_qt3 = (build_lyx and frontend == 'qt3') or 'qt3' in targets +build_qt4 = (build_lyx and frontend == 'qt4') or 'qt4' in targets +build_msvs_projects = use_vc and 'msvs_projects' in targets + + +# now, if rebuild_targets is specified, do not rebuild some targets +rebuild_targets = 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 frontend (maybe build qt4 with frontend=qt3) +if build_qt2: + frontend = 'qt2' +elif build_qt3: + frontend = 'qt3' +elif build_qt4: + frontend = 'qt4' + + +if build_boost: + # + # boost libraries + # + # special builddir + env.BuildDir('$BUILDDIR/boost', '$TOP_SRCDIR/boost/libs', duplicate = 0) -print "Building all targets recursively" + boostenv = env.Copy() + # + boost_config_h = os.path.join(top_src_dir, 'boost', 'libs', 'config.h') + if not os.path.isfile(boost_config_h) or not fast_start: + # + print "Creating boost/config.h..." + # + # start another configuration session. + conf = Configure(boostenv, + custom_tests = {'CheckMkdirOneArg' : utils.checkMkdirOneArg}, + ) + # + # create config.h + result = utils.createConfigFile(conf, + config_file = boost_config_h, + config_pre = '''/* boost/libs/config.h. Generated by SCons. */ + +/* -*- 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 +''', + 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'), + ('direct.h', 'HAVE_DIRECT_H', 'c'), + ('istream', 'HAVE_ISTREAM', 'cxx'), + ('ostream', 'HAVE_OSTREAM', 'cxx'), + ('ios', 'HAVE_IOS', 'cxx'), + ], + functions = [ + ('open', 'HAVE_OPEN', None), + ('close', 'HAVE_CLOSE', None), + ('popen', 'HAVE_POPEN', None), + ('pclose', 'HAVE_PCLOSE', None), + ('_open', 'HAVE__OPEN', None), + ('_close', 'HAVE__CLOSE', None), + ('_popen', 'HAVE__POPEN', None), + ('_pclose', 'HAVE__PCLOSE', None), + ('getpid', 'HAVE_GETPID', None), + ('_getpid', 'HAVE__GETPID', None), + ('mkdir', 'HAVE_MKDIR', None), + ('_mkdir', 'HAVE__MKDIR', None), + ('mktemp', 'HAVE_MKTEMP', None), + ('mkstemp', 'HAVE_MKSTEMP', None), + ('strerror', 'HAVE_STRERROR', None), + ('getcwd', 'HAVE_GETCWD', None), + ('setenv', 'HAVE_SETENV', None), + ('putenv', 'HAVE_PUTENV', None), + ('fcntl', 'HAVE_FCNTL', None), + ], + custom_tests = [ + (conf.CheckMkdirOneArg(), + 'MKDIR_TAKES_ONE_ARG', + 'Define if mkdir takes only one argument.' + ), + (env.has_key('assertions') and env['assertions'], + 'ENABLE_ASSERTIONS', + 'Define if you want assertions to be enabled in the code' + ), + (env.has_key('warnings') and env['warnings'], + 'WITH_WARNINGS', + 'Define this if you want to see the warning directives put here and there by the developpers to get attention' + ), + (env.has_key('concept_checks') and env['concept_checks'], + '_GLIBCXX_CONCEPT_CHECKS', + 'libstdc++ concept checking' + ), + (os.name != 'nt', 'BOOST_POSIZ', + 'Indicates to boost which API to use (posix or windows).' + ), + ], + extra_items = [ + ('#define BOOST_ALL_NO_LIB 1', + 'disable automatic linking of boost libraries.'), + ], + config_post = ''' + +#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 + +#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 + +#endif +''' + ) + conf.Finish() + # + # boost use its own config.h + boostenv['CPPPATH'] = ['$TOP_SRCDIR/boost', '$TOP_SRCDIR/boost/libs'] + extra_inc_paths + boostenv.AppendUnique(CCFLAGS = ['-DBOOST_USER_CONFIG=""']) -env.SConscript('$SCONS_DIR/SConscript', duplicate = 0) + for lib in boost_libs: + print 'Processing files in boost/libs/%s/src...' % lib + boostlib = boostenv.StaticLibrary( + target = '$LOCALLIBPATH/included_boost_%s' % lib, + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/boost/libs/%s/src' % lib), + pattern = '*.cpp', build_dir = '$BUILDDIR/boost/%s/src' % lib) + ) + Alias('boost', boostlib) +if build_intl: + # + # intl + # + intlenv = env.Copy() + # + intl_config_h = os.path.join(top_src_dir, 'intl', 'config.h') + if not os.path.isfile(intl_config_h) or not fast_start: + # + print "Creating intl/config.h..." + # + # start another configuration session. + conf = Configure(intlenv, + custom_tests = { + 'CheckLC_MESSAGES' : utils.checkLC_MESSAGES, + 'CheckIconvConst' : utils.checkIconvConst, + } + ) + # create config.h + result = utils.createConfigFile(conf, + config_file = intl_config_h, + config_pre = '''/* intl/config.h. Generated by SCons. */ + +/* -*- 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 +''', + headers = [ + ('unistd.h', 'HAVE_UNISTD_H', 'c'), + ('inttypes.h', 'HAVE_INTTYPES_H', 'c'), + ('string.h', 'HAVE_STRING_H', 'c'), + ('strings.h', 'HAVE_STRINGS_H', 'c'), + ('argz.h', 'HAVE_ARGZ_H', 'c'), + ('limits.h', 'HAVE_LIMITS_H', 'c'), + ('alloca.h', 'HAVE_ALLOCA_H', 'c'), + ('stddef.h', 'HAVE_STDDEF_H', 'c'), + ('stdint.h', 'HAVE_STDINT_H', 'c'), + ('sys/param.h', 'HAVE_SYS_PARAM_H', 'c'), + ], + functions = [ + ('getcwd', 'HAVE_GETCWD', None), + ('stpcpy', 'HAVE_STPCPY', None), + ('strcasecmp', 'HAVE_STRCASECMP', None), + ('strdup', 'HAVE_STRDUP', None), + ('strtoul', 'HAVE_STRTOUL', None), + ('alloca', 'HAVE_ALLOCA', None), + ('__fsetlocking', 'HAVE___FSETLOCKING', None), + ('mempcpy', 'HAVE_MEMPCPY', None), + ('__argz_count', 'HAVE___ARGZ_COUNT', None), + ('__argz_next', 'HAVE___ARGZ_NEXT', None), + ('__argz_stringify', 'HAVE___ARGZ_STRINGIFY', None), + ('setlocale', 'HAVE_SETLOCALE', None), + ('tsearch', 'HAVE_TSEARCH', None), + ('getegid', 'HAVE_GETEGID', None), + ('getgid', 'HAVE_GETGID', None), + ('getuid', 'HAVE_GETUID', None), + ('wcslen', 'HAVE_WCSLEN', None), + ('asprintf', 'HAVE_ASPRINTF', None), + ('wprintf', 'HAVE_WPRINTF', None), + ('snprintf', 'HAVE_SNPRINTF', None), + ('printf', 'HAVE_POSIX_PRINTF', None), + ('fcntl', 'HAVE_FCNTL', None), + ], + types = [ + ('intmax_t', 'HAVE_INTMAX_T', None), + ('long double', 'HAVE_LONG_DOUBLE', None), + ('long long', 'HAVE_LONG_LONG', None), + ('wchar_t', 'HAVE_WCHAR_T', None), + ('wint_t', 'HAVE_WINT_T', None), + ('uintmax_t', 'HAVE_INTTYPES_H_WITH_UINTMAX', '#include '), + ('uintmax_t', 'HAVE_STDINT_H_WITH_UINTMAX', '#include '), + ], + libs = [ + (('iconv', 'libiconv'), 'HAVE_ICONV', 'ICONV_LIB'), + ('c', 'HAVE_LIBC'), + ], + custom_tests = [ + (conf.CheckLC_MESSAGES(), + 'HAVE_LC_MESSAGES', + 'Define if your file defines LC_MESSAGES.' + ), + (conf.CheckIconvConst(), + 'ICONV_CONST', + 'Define as const if the declaration of iconv() needs const.', + '#define ICONV_CONST', + '#define ICONV_CONST const', + ), + (conf.CheckType('intmax_t', includes='#include ') or \ + conf.CheckType('intmax_t', includes='#include '), + 'HAVE_INTMAX_T', + "Define to 1 if you have the `intmax_t' type." + ), + (env.has_key('nls') and env['nls'], + 'ENABLE_NLS', + "Define to 1 if translation of program messages to the user's native anguage is requested.", + ), + ], + config_post = '#endif' + ) + conf.Finish() + # these keys are needed in env + for key in ['HAVE_ASPRINTF', 'HAVE_WPRINTF', 'HAVE_SNPRINTF', \ + 'HAVE_POSIX_PRINTF', 'HAVE_ICONV', 'HAVE_LIBC']: + # USE_ASPELL etc does not go through result + if result.has_key(key): + env[key] = result[key] + env_cache[key] = env[key] + else: + # only a few variables need to be rescanned + for key in ['HAVE_ASPRINTF', 'HAVE_WPRINTF', 'HAVE_SNPRINTF', \ + 'HAVE_POSIX_PRINTF', 'HAVE_ICONV', 'HAVE_LIBC']: + env[key] = env_cache[key] + + print "Processing files in intl..." + + env.BuildDir('$BUILDDIR/intl', '$TOP_SRCDIR/intl', duplicate = 0) + + # we need the original C compiler for these files + intlenv['CC'] = C_COMPILER + intlenv['CCFLAGS'] = C_CCFLAGS + if use_vc: + intlenv.Append(CCFLAGS=['/Dinline#', '/D__attribute__(x)#', '/Duintmax_t=UINT_MAX']) + # intl does not use global config.h + intlenv['CPPPATH'] = ['intl'] + extra_inc_paths + + intlenv.Append(CCFLAGS = [ + r'-DLOCALEDIR=\"' + env['LOCALEDIR'].replace('\\', '\\\\') + r'\"', + r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALEDIR'].replace('\\', '\\\\') + r'\"', + r'-DLIBDIR=\"' + env['TOP_SRCDIR'].replace('\\', '\\\\') + r'/lib\"', + '-DIN_LIBINTL', + '-DENABLE_RELOCATABLE=1', + '-DIN_LIBRARY', + r'-DINSTALLDIR=\"' + 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_SRCDIR/intl/libintl.h', '$TOP_SRCDIR/intl/libgnuintl.h.in') + env.Command('$TOP_SRCDIR/intl/libgnuintl.h', '$TOP_SRCDIR/intl/libintl.h', + [Copy('$TARGET', '$SOURCE')]) + + intl = intlenv.StaticLibrary( + target = '$LOCALLIBPATH/included_intl', + LIBS = ['c'], + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/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_SRCDIR/src', duplicate = 0) + + +if build_support: + # + # src/support + # + print "Processing files in src/support..." + + env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRCDIR/src/support/package.C.in') + + support = env.StaticLibrary( + target = '$LOCALLIBPATH/support', + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/support'), pattern = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/mathed'), pattern = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/insets'), pattern = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/frontends'), pattern = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/graphics'), pattern = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/frontends/controllers'), pattern = 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_SRCDIR/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 \ + utils.globSource(dir = env.subst('$TOP_SRCDIR/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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/frontends/qt2/'), pattern = 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 \ + utils.globSource(dir = env.subst('$TOP_SRCDIR/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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/frontends/qt3/'), pattern = 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', [scons_dir]) + qt4env.EnableQt4Modules(qt_libs, debug = False) + + qt4env.AppendUnique(CPPPATH = [ + '$BUILDDIR/common', + '$BUILDDIR/common/images', + '$BUILDDIR/common/frontends', + '$BUILDDIR/common/frontends/qt4', + '$BUILDDIR/common/frontends/controllers', + qt_inc_path + ] + ) + + # 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 \ + utils.globSource(dir = env.subst('$TOP_SRCDIR/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 = qt_libs, + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/frontends/qt4'), pattern = lyx_ext, + exclude = ['QBrowseBox.C'], build_dir = '$BUILDDIR/common/frontends/qt4') + ) + Alias('qt4', qt4) + + +if build_client: + # + # src/client + # + env.BuildDir('$BUILDDIR/common', '$TOP_SRCDIR/src', duplicate = 0) + + print "Processing files in src/client..." + + if env['HAVE_FCNTL']: + client = env.Program( + target = '$BUILDDIR/common/client/lyxclient', + LIBS = ['support'] + intl_libs + system_libs + + socket_libs + boost_libraries, + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/client'), pattern = 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_SRCDIR/src/'+file, + [Copy('$TARGET', '$SOURCE')]) + + tex2lyx = tex2lyx_env.Program( + target = '$BUILDDIR/common/tex2lyx/tex2lyx', + LIBS = ['support'] + boost_libraries + system_libs, + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/src/tex2lyx'), pattern = 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_SRCDIR/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') + + # msvc requires at least one source file with main() + # so I exclude main.C from lyxbase + lyxbase_pre = env.StaticLibrary( + target = '$LOCALLIBPATH/lyxbase_pre', + source = utils.globSource(dir = env.subst('$TOP_SRCDIR/src'), pattern = lyx_ext, + exclude = lyx_post_source + ['main.C', 'aspell.C', 'pspell.C', + 'ispell.C', 'Variables.C', 'Sectioning.C'], + include = ['version.C'], 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 + # + lyx = env.Program( + target = '$BUILDDIR/$frontend/lyx', + source = ['$BUILDDIR/common/main.C'], + LIBS = [ + 'lyxbase_pre', + 'mathed', + 'insets', + 'frontends', + frontend, + 'controllers', + 'graphics', + 'support', + 'lyxbase_post', + ] + + boost_libraries + + frontend_libs + + intl_libs + + socket_libs + + 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 = 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 = utils.globSource(dir = env.subst('$TOP_SRCDIR/'+resource), pattern = '*.ui', + build_dir = env.subst('$TOP_SRCDIR/'+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(utils.globSource(dir = env.subst('$TOP_SRCDIR/' + d), + pattern = src_pattern, include = include, + build_dir = env.subst('$TOP_SRCDIR/' + d) )) + inc.extend(utils.globSource(dir = env.subst('$TOP_SRCDIR/' + d), + pattern = '*.h', + build_dir = env.subst('$TOP_SRCDIR/' + d) )) + else: + src = utils.globSource(dir = env.subst('$TOP_SRCDIR/' + dir), + pattern = src_pattern, include = include, + build_dir = env.subst('$TOP_SRCDIR/' + dir) ) + inc = utils.globSource(dir = env.subst('$TOP_SRCDIR/' + dir), + pattern = '*.h', + build_dir = env.subst('$TOP_SRCDIR/' + dir) ) + if full_target is None: + build_target = target + else: + build_target = full_target + # project + proj = env.MSVSProject( + target = target + env['MSVSPROJECTSUFFIX'], + srcs = src, + incs = [env.subst('$TOP_SRCDIR/src/config.h')], + localincs = inc, + resources = res, + buildtarget = build_target, + cmdargs = cmds, + variant = 'Debug' + ) + Alias('msvs_projects', proj) + # + build_project('boost', ['boost/libs/%s/src' % x for x in boost_libs], + 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_SRCDIR'), '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: + # if dest_dir is different from prefix. + if env.has_key('exec_prefix'): + bin_dest_dir = env['exec_prefix'] + else: + bin_dest_dir = os.path.join(dest_dir, 'bin') + if add_suffix: + share_dest_dir = os.path.join(dest_dir, share_dir + program_suffix) + else: + share_dest_dir = os.path.join(dest_dir, share_dir) + man_dest_dir = os.path.join(dest_dir, man_dir) + locale_dest_dir = os.path.join(dest_dir, locale_dir) + # create the directory if needed + if not os.path.isdir(dest_dir): + try: + os.makedirs(dest_dir) + except: + pass + if not os.path.isdir(dest_dir): + print 'Can not create directory', 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 add_suffix: + version_suffix = 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(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(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(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(bin_dest_dir, target_name) + env.InstallAs(target, client) + Alias('install', target) + # + # share/lyx + dirs = install(share_dest_dir, + [env.subst('$TOP_SRCDIR/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_SRCDIR/lib/lyx2lyx/lyx2lyx_version.py.in') + Alias('install', dirs) + # man + env.InstallAs(os.path.join(man_dest_dir, 'lyx' + version_suffix + '.1'), + env.subst('$TOP_SRCDIR/lyx.man')) + env.InstallAs(os.path.join(man_dest_dir, 'tex2lyx' + version_suffix + '.1'), + env.subst('$TOP_SRCDIR/src/tex2lyx/tex2lyx.man')) + env.InstallAs(os.path.join(man_dest_dir, 'lyxclient' + version_suffix + '.1'), + env.subst('$TOP_SRCDIR/src/client/lyxclient.man')) + Alias('install', [os.path.join(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(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']) + + +# save environment settings (for fast_start option) +cache_file = open(env_cache_file, 'w') +cPickle.dump(env_cache, cache_file) +cache_file.close() diff --git a/development/scons/scons_utils.py b/development/scons/scons_utils.py index 0b344b3bca..50857fd44c 100644 --- a/development/scons/scons_utils.py +++ b/development/scons/scons_utils.py @@ -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 '<>:', 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 - -#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 @@ -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__) -## -## -## - -- 2.39.2