1 # vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
5 # This file is part of LyX, the document processor.
6 # Licence details can be found in the file COPYING.
9 # Full author contact details are available in file CREDITS.
15 targets = env['BUILD_TARGETS']
16 build_lyx = (targets == [] or 'lyx' in targets or 'install' in targets or 'all' in targets)
19 if env['INCLUDED_BOOST'] or 'boost' in targets:
24 env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
27 boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
29 print 'Processing files in boost/libs/filesystem/src...'
31 filesystem = boostenv.StaticLibrary(
32 target = '$LOCALLIBPATH/included_boost_filesystem',
33 source = ["$BUILDDIR/boost/filesystem/src/%s" % x for x in Split('''
36 operations_posix_windows.cpp
37 path_posix_windows.cpp
41 print 'Processing files in boost/libs/regex/src...'
43 regex = boostenv.StaticLibrary(
44 target = '$LOCALLIBPATH/included_boost_regex',
45 source = ["$BUILDDIR/boost/regex/src/%s" % x for x in Split('''
53 regex_traits_defaults.cpp
58 print 'Processing files in boost/libs/signals/src...'
60 signals = boostenv.StaticLibrary(
61 target = '$LOCALLIBPATH/included_boost_signals',
62 source = ["$BUILDDIR/boost/signals/src/%s" % x for x in Split('''
71 print 'Processing files in boost/libs/iostreams/src...'
73 iostreams = boostenv.StaticLibrary(
74 target = '$LOCALLIBPATH/included_boost_iostreams',
75 source = ["$BUILDDIR/boost/iostreams/src/%s" % x for x in Split('''
81 Alias('boost', filesystem)
83 Alias('boost', signals)
84 Alias('boost', iostreams)
87 if env['INCLUDED_GETTEXT'] or 'intl' in targets:
91 print "Processing files in intl..."
93 env.BuildDir('$BUILDDIR/intl', '$TOP_SRC_DIR/intl', duplicate = 0)
96 # we need the original C compiler for these files
97 intlenv['CC'] = intlenv['C_COMPILER']
98 intlenv['CPPPATH'] += ['intl']
100 intlenv.Append(CCFLAGS = [
101 r'-DLOCALEDIR=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
102 r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
103 r'-DLIBDIR=\"' + env['TOP_SRC_DIR'].replace('\\', '\\\\') + r'/lib\"',
105 '-DENABLE_RELOCATABLE=1',
107 r'-DINSTALLDIR=\"' + env['PREFIX'].replace('\\', '\\\\') + r'/lib\"',
109 '-Dset_relocation_prefix=libintl_set_relocation_prefix',
110 '-Drelocate=libintl_relocate',
111 '-DDEPENDS_ON_LIBICONV=1',
116 # libgnuintl.h.in => libintl.h
117 env.substFile('$TOP_SRC_DIR/intl/libintl.h', '$TOP_SRC_DIR/intl/libgnuintl.h.in')
118 env.Command('$TOP_SRC_DIR/intl/libgnuintl.h', '$TOP_SRC_DIR/intl/libintl.h',
119 [Copy('$TARGET', '$SOURCE')])
121 intl = intlenv.StaticLibrary(
122 target = '$LOCALLIBPATH/included_intl',
124 source = ["$BUILDDIR/intl/%s" % x for x in Split('''
154 # Now, src code under src/
156 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
159 if build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']]:
163 print "Processing files in src/support..."
165 env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
167 supports = env.StaticLibrary(
168 target = '$LOCALLIBPATH/supports',
169 source = ['$BUILDDIR/common/support/%s' % x for x in Split('''
200 Alias('supports', supports)
203 if build_lyx or 'mathed' in targets:
207 print "Processing files in src/mathed..."
209 mathed = env.StaticLibrary(
210 target = '$LOCALLIBPATH/mathed',
211 source = ["$BUILDDIR/common/mathed/%s" % x for x in Split('''
219 math_boldsymbolinset.C
228 math_decorationinset.C
286 Alias('mathed', mathed)
289 if build_lyx or 'insets' in targets:
293 print "Processing files in src/insets..."
295 insets = env.StaticLibrary(
296 target = '$LOCALLIBPATH/insets',
297 source = ["$BUILDDIR/common/insets/%s" % x for x in Split('''
324 insetgraphicsParams.C
349 Alias('insets', insets)
352 if build_lyx or 'frontends' in targets:
356 print "Processing files in src/frontends..."
358 frontends = env.StaticLibrary(
359 target = '$LOCALLIBPATH/frontends',
360 source = ["$BUILDDIR/common/frontends/%s" % x for x in Split('''
372 Alias('frontends', frontends)
375 if build_lyx or 'graphics' in targets:
379 print "Processing files in src/graphics..."
381 graphics = env.StaticLibrary(
382 target = '$LOCALLIBPATH/graphics',
383 source = ["$BUILDDIR/common/graphics/%s" % x for x in Split('''
397 Alias('graphics', graphics)
400 if build_lyx or 'controllers' in targets:
402 # src/frontends/controllers
404 print "Processing files in src/frontends/controllers..."
406 controllers = env.StaticLibrary(
407 target = '$LOCALLIBPATH/controllers',
408 source = ["$BUILDDIR/common/frontends/controllers/%s" % x for x in Split('''
426 ControlCommandBuffer.C
446 ControlSpellchecker.C
448 ControlTabularCreate.C
458 Alias('controllers', controllers)
464 if build_lyx or env['frontend'] in targets:
465 frontend = env['frontend']
466 env.BuildDir('$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
468 # frontend is qt3, but specify target qt4, OK
471 elif 'qt4' in targets:
477 if frontend == 'qt3':
478 print "Processing files in src/frontends/qt3..."
481 # disable auto scan to speed up non build time
482 qt3env['QT_AUTOSCAN'] = 0
483 qt3env['QT_MOCHPREFIX'] = ''
488 qt3env.AppendUnique(CPPPATH = [
490 '$BUILDDIR/common/images',
491 '$BUILDDIR/common/frontends',
492 '$BUILDDIR/common/frontends/qt3',
493 '$BUILDDIR/common/frontends/controllers',
497 qt3_ui_files = Split('''
499 BranchesModuleBase.ui
501 TextLayoutModuleBase.ui
502 LanguageModuleBase.ui
505 NumberingModuleBase.ui
507 PageLayoutModuleBase.ui
508 PreambleModuleBase.ui
511 QBibitemDialogBase.ui
513 QBibtexAddDialogBase.ui
516 QChangesDialogBase.ui
517 QCharacterDialogBase.ui
518 QCitationDialogBase.ui
519 QCitationFindDialogBase.ui
520 QDelimiterDialogBase.ui
521 QDocumentDialogBase.ui
522 QErrorListDialogBase.ui
524 QExternalDialogBase.ui
526 QGraphicsDialogBase.ui
527 QIncludeDialogBase.ui
530 QViewSourceDialogBase.ui
532 QMathMatrixDialogBase.ui
534 QParagraphDialogBase.ui
537 QPrefConvertersModule.ui
538 QPrefCopiersModule.ui
539 QPrefCygwinPathModule.ui
541 QPrefDisplayModule.ui
542 QPrefFileformatsModule.ui
543 QPrefIdentityModule.ui
544 QPrefKeyboardModule.ui
545 QPrefLanguageModule.ui
548 QPrefPrinterModule.ui
549 QPrefScreenFontsModule.ui
551 QPrefSpellcheckerModule.ui
557 QShowFileDialogBase.ui
558 QSpellcheckerDialogBase.ui
559 QTabularCreateDialogBase.ui
560 QTabularDialogBase.ui
561 QTexinfoDialogBase.ui
562 QThesaurusDialogBase.ui
569 qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
612 QSpellcheckerDialog.C
614 QTabularCreateDialog.C
629 # manually moc and uic files for better performance
630 qt3_moced_files = [qt3env.Moc(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt3_moc_files]
632 qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in qt3_ui_files]
633 qt3_uiced_cc_files = []
634 for x in qt3_uiced_files:
635 qt3_uiced_cc_files.extend(x[1:])
637 qt3 = qt3env.StaticLibrary(
638 target = '$LOCALLIBPATH/qt3',
639 source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
701 qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
706 elif frontend == 'qt4':
707 print "Processing files in src/frontends/qt4..."
710 qt4env['QT_AUTOSCAN'] = 0
712 # local qt4 toolset from
713 # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
715 # NOTE: I have to patch qt4.py since it does not automatically
716 # process .C file!!! (add to cxx_suffixes )
718 qt4env.Tool('qt4', [env['SCONS_DIR']])
719 qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
721 qt4env.AppendUnique(CPPPATH = [
723 '$BUILDDIR/common/images',
724 '$BUILDDIR/common/frontends',
725 '$BUILDDIR/common/frontends/qt4',
726 '$BUILDDIR/common/frontends/controllers'
730 # FIXME: replace by something from pkg_config
731 qt4env.Append(CCFLAGS = [
733 '-DQT_CLEAN_NAMESPACE',
740 qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
812 qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
857 QSpellcheckerDialog.C
859 QTabularCreateDialog.C
875 qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
942 resources = [qt4env.Uic4(x) for x in qt4_ui_files]
945 # moc qt4_moc_files, the moced files are included in the original files
947 qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
949 qt4 = qt4env.StaticLibrary(
950 target = '$LOCALLIBPATH/qt4',
951 LIBS = qt4env['QT_LIB'],
952 source = qt4_source_files + qt4_moc_files
957 if 'client' in targets or 'install' in targets or 'all' in targets:
961 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
963 print "Processing files in src/client..."
965 if env['HAVE_FCNTL']:
966 client = env.Program(
967 target = '$BUILDDIR/common/client/lyxclient',
968 LIBS = ['supports'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] +
969 env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
970 source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
978 Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
979 client, [Copy('$TARGET', '$SOURCE')]))
982 Alias('client', client)
985 if 'tex2lyx' in targets or 'install' in targets or 'all' in targets:
989 print "Processing files in src/tex2lyx..."
991 tex2lyx_env = env.Copy()
992 # the order is important here.
993 tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
994 tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
996 for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
997 'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
998 env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
999 [Copy('$TARGET', '$SOURCE')])
1001 tex2lyx = tex2lyx_env.Program(
1002 target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1003 LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1004 source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1025 Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1026 tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1027 Alias('tex2lyx', tex2lyx)
1030 if build_lyx or 'lyxbase' in targets:
1034 print "Processing files in src..."
1036 env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1038 lyx_source_pre = Split('''
1058 ParagraphParameters.C
1144 lyx_source_post = Split('''
1153 if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1154 lyx_source_post.append('aspell.C')
1155 elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1156 lyx_source_post.append('pspell.C')
1157 elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1158 lyx_source_post.append('ispell.C')
1160 lyxbase_pre = env.StaticLibrary(
1161 target = '$LOCALLIBPATH/lyxbase_pre',
1162 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1164 lyxbase_post = env.StaticLibrary(
1165 target = '$LOCALLIBPATH/lyxbase_post',
1166 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1168 Alias('lyxbase', lyxbase_pre)
1169 Alias('lyxbase', lyxbase_post)
1172 if build_lyx or 'lyx' in targets:
1174 # Build lyx with given frontend
1177 target = '$BUILDDIR/$frontend/lyx',
1190 env['BOOST_LIBRARIES'] +
1193 env['SOCKET_LIBS'] +
1196 # [/path/to/lyx.ext] => lyx-qt3.ext
1197 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1198 Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1199 [Copy('$TARGET', '$SOURCE')]))
1203 if 'po' in targets or 'install' in targets or 'all' in targets:
1207 print 'Processing files in po...'
1212 # files to translate
1213 transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1214 # possibly *only* handle these languages
1216 if env.has_key('languages'):
1217 languages = env.make_list(env['lanauges'])
1218 # use defulat msgfmt
1219 if not env['MSGFMT']:
1220 print 'msgfmt does not exist. Can not process po files'
1223 env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1226 for f in transfiles:
1228 fname = os.path.split(f)[1]
1230 country = fname.split('.')[0]
1232 if not languages or country in languages:
1233 gmo_files.extend(env.Transfiles(f))
1236 if 'install' in targets:
1237 # create the directory if needed
1238 if not os.path.isdir(env['PREFIX']):
1240 os.makedirs(env['PREFIX'])
1243 if not os.path.isdir(env['PREFIX']):
1244 print 'Can not create directory', env['PREFIX']
1249 # windows: $PREFIX/Resources
1250 # others: $PREDIX/share/lyx
1251 share_dir = env['SHARE_DIR']
1252 # windows: $PREFIX/Resouces/man/man1
1253 # others: $PREFIX/man/man1
1254 man_dir = env['MAN_DIR']
1255 # windows: $PREFIX/Resources/locale
1256 # others: $PREFIX/share/locale
1257 locale_dir = env['LOCALE_DIR']
1258 # do not install these files
1259 exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
1260 'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1262 def install(dest, src):
1263 ''' recusive installation of src to dest '''
1264 # separate file and directory
1265 files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1266 dirs = filter(os.path.isdir, src)
1268 env.Install(dest, files)
1272 ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1273 glob.glob(os.path.join(dir, '*'))) )
1276 # executables (some of them may be none)
1278 if env['ADD_SUFFIX_TO_EXECUTABLES']:
1279 program_suffix = env['PROGRAM_SUFFIX']
1284 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1285 target = os.path.join(env['BIN_DIR'], target_name)
1286 env.InstallAs(target, lyx)
1287 Alias('install', target)
1288 # install lyx as lyx-qt3
1289 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1290 target = os.path.join(env['BIN_DIR'], target_name)
1291 env.InstallAs(target, lyx)
1292 Alias('install', target)
1295 target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1296 target = os.path.join(env['BIN_DIR'], target_name)
1297 env.InstallAs(target, tex2lyx)
1298 Alias('install', target)
1300 # install lyxclient, may not exist
1302 target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1303 target = os.path.join(env['BIN_DIR'], target_name)
1304 env.InstallAs(target, client)
1305 Alias('install', target)
1308 dirs = install(env['SHARE_DIR'],
1309 [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1310 'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1311 'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
1312 'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
1314 env.substFile('$SHARE_DIR/lyx2lyx/lyx2lyx_version.py',
1315 '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1316 Alias('install', dirs)
1318 env.InstallAs(os.path.join(env['MAN_DIR'], 'lyx.1'),
1319 env.subst('$TOP_SRC_DIR/lyx.man'))
1320 env.InstallAs(os.path.join(env['MAN_DIR'], 'tex2lyx.1'),
1321 env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1322 env.InstallAs(os.path.join(env['MAN_DIR'], 'lyxclient.1'),
1323 env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1324 Alias('install', [os.path.join(env['MAN_DIR'], x) for
1325 x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1327 # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1328 for gmo in gmo_files:
1329 lan = os.path.split(str(gmo))[1].split('.')[0]
1330 dest_file = os.path.join(env['LOCALE_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1331 env.InstallAs(dest_file, gmo)
1332 Alias('install', dest_file)
1336 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])