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/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/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/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/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'] + r'\"',
102 r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALE_DIR'] + r'\"',
103 r'-DLIBDIR=\"' + env['TOP_SRC_DIR'] + r'/lib\"',
105 '-DENABLE_RELOCATABLE=1',
107 r'-DINSTALLDIR=\"' + env['PREFIX'] + 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/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',
729 '$QT_INC_PATH/QtCore',
730 '$QT_INC_PATH/QtGui']
733 # FIXME: replace by something from pkg_config
734 qt4env.Append(CCFLAGS = [
736 '-DQT_CLEAN_NAMESPACE',
743 qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
815 qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
860 QSpellcheckerDialog.C
862 QTabularCreateDialog.C
878 qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
945 resources = [qt4env.Uic4(x) for x in qt4_ui_files]
948 # moc qt4_moc_files, the moced files are included in the original files
950 qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
952 qt4 = qt4env.StaticLibrary(
953 target = '$LOCALLIBPATH/qt4',
954 LIBS = qt4env['QT_LIB'],
955 source = qt4_source_files + qt4_moc_files
960 if 'client' in targets or 'install' in targets or 'all' in targets:
964 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
966 print "Processing files in src/client"
968 if env['HAVE_FCNTL']:
969 client = env.Program(
970 target = '$BUILDDIR/common/client/lyxclient',
971 LIBS = ['supports'] + env['INTL_LIB'] + env['SYSTEM_LIBS'] +
972 env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
973 source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
981 Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
982 client, [Copy('$TARGET', '$SOURCE')]))
985 Alias('client', client)
988 if 'tex2lyx' in targets or 'install' in targets or 'all' in targets:
992 print "Processing files in src/tex2lyx"
994 tex2lyx_env = env.Copy()
995 # the order is important here.
996 tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
997 tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
999 for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
1000 'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
1001 env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
1002 [Copy('$TARGET', '$SOURCE')])
1004 tex2lyx = tex2lyx_env.Program(
1005 target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1006 LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1007 source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1028 Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1029 tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1030 Alias('tex2lyx', tex2lyx)
1033 if build_lyx or 'lyxbase' in targets:
1037 print "Processing files in src"
1039 env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1041 lyx_source_pre = Split('''
1061 ParagraphParameters.C
1147 lyx_source_post = Split('''
1156 if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1157 lyx_source_post.append('aspell.C')
1158 elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1159 lyx_source_post.append('pspell.C')
1160 elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1161 lyx_source_post.append('ispell.C')
1163 lyxbase_pre = env.StaticLibrary(
1164 target = '$LOCALLIBPATH/lyxbase_pre',
1165 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1167 lyxbase_post = env.StaticLibrary(
1168 target = '$LOCALLIBPATH/lyxbase_post',
1169 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1171 Alias('lyxbase', lyxbase_pre)
1172 Alias('lyxbase', lyxbase_post)
1175 if build_lyx or 'lyx' in targets:
1177 # Build lyx with given frontend
1180 target = '$BUILDDIR/$frontend/lyx',
1193 env['BOOST_LIBRARIES'] +
1196 env['SOCKET_LIBS'] +
1199 # [/path/to/lyx.ext] => lyx-qt3.ext
1200 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1201 Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1202 [Copy('$TARGET', '$SOURCE')]))
1206 if 'po' in targets or 'install' in targets or 'all' in targets:
1210 print 'Processing files in po...'
1215 # files to translate
1216 transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1217 # possibly *only* handle these languages
1219 if env.has_key('languages'):
1220 languages = env.make_list(env['lanauges'])
1221 # use defulat msgfmt
1222 if not env['MSGFMT']:
1223 print 'msgfmt does not exist. Can not process po files'
1226 env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1229 for f in transfiles:
1231 fname = os.path.split(f)[1]
1233 country = fname.split('.')[0]
1235 if not languages or country in languages:
1236 gmo_files.extend(env.Transfiles(f))
1239 if 'install' in targets:
1240 # create the directory if needed
1241 if not os.path.isdir(env['PREFIX']):
1243 os.makedirs(env['PREFIX'])
1246 if not os.path.isdir(env['PREFIX']):
1247 print 'Can not create directory', env['PREFIX']
1252 # windows: $PREFIX/Resources
1253 # others: $PREDIX/share/lyx
1254 share_dir = env['SHARE_DIR']
1255 # windows: $PREFIX/Resouces/man/man1
1256 # others: $PREFIX/man/man1
1257 man_dir = env['MAN_DIR']
1258 # windows: $PREFIX/Resources/locale
1259 # others: $PREFIX/share/locale
1260 locale_dir = env['LOCALE_DIR']
1261 # do not install these files
1262 exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
1263 'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1265 def install(dest, src):
1266 ''' recusive installation of src to dest '''
1267 # separate file and directory
1268 files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1269 dirs = filter(os.path.isdir, src)
1271 env.Install(dest, files)
1275 ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1276 glob.glob(os.path.join(dir, '*'))) )
1279 # executables (some of them may be none)
1281 if env['ADD_SUFFIX_TO_EXECUTABLES']:
1282 program_suffix = env['PROGRAM_SUFFIX']
1287 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1288 target = os.path.join(env['BIN_DIR'], target_name)
1289 env.InstallAs(target, lyx)
1290 Alias('install', target)
1291 # install lyx as lyx-qt3
1292 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1293 target = os.path.join(env['BIN_DIR'], target_name)
1294 env.InstallAs(target, lyx)
1295 Alias('install', target)
1298 target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1299 target = os.path.join(env['BIN_DIR'], target_name)
1300 env.InstallAs(target, tex2lyx)
1301 Alias('install', target)
1303 # install lyxclient, may not exist
1305 target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1306 target = os.path.join(env['BIN_DIR'], target_name)
1307 env.InstallAs(target, client)
1308 Alias('install', target)
1311 dirs = install(env['SHARE_DIR'],
1312 [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1313 'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1314 'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
1315 'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
1317 env.substFile('$SHARE_DIR/lyx2lyx/lyx2lyx_version.py',
1318 '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1319 Alias('install', dirs)
1321 env.InstallAs(os.path.join(env['MAN_DIR'], 'lyx.1'),
1322 env.subst('$TOP_SRC_DIR/lyx.man'))
1323 env.InstallAs(os.path.join(env['MAN_DIR'], 'tex2lyx.1'),
1324 env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1325 env.InstallAs(os.path.join(env['MAN_DIR'], 'lyxclient.1'),
1326 env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1327 Alias('install', [os.path.join(env['MAN_DIR'], x) for
1328 x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1330 # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1331 for gmo in gmo_files:
1332 lan = os.path.split(str(gmo))[1].split('.')[0]
1333 dest_file = os.path.join(env['LOCALE_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1334 env.InstallAs(dest_file, gmo)
1335 Alias('install', dest_file)
1339 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])