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)
17 build_boost = env['INCLUDED_BOOST'] or 'boost' in targets
18 build_intl = env['INCLUDED_GETTEXT'] or 'intl' in targets
19 build_supports = build_lyx or True in [x in targets for x in ['supports', 'client', 'tex2lyx']]
20 build_mathed = build_lyx or 'mathed' in targets
21 build_insets = build_lyx or 'insets' in targets
22 build_frontends = build_lyx or 'frontends' in targets
23 build_graphics = build_lyx or 'graphics' in targets
24 build_controllers = build_lyx or 'controllers' in targets
25 build_client = 'client' in targets or 'install' in targets or 'all' in targets
26 build_tex2lyx = 'tex2lyx' in targets or 'install' in targets or 'all' in targets
27 build_lyxbase = build_lyx or 'lyxbase' in targets
28 build_po = 'po' in targets or 'install' in targets or 'all' in targets
29 build_qt3 = (build_lyx and env['frontend'] == 'qt3') or 'qt3' in targets
30 build_qt4 = (build_lyx and env['frontend'] == 'qt4') or 'qt4' in targets
33 # now, if rebuild_targets is specified, do not rebuild some targets
34 rebuild_targets = env['REBUILD_TARGETS']
36 def ifBuildLib(name, libname, old_value):
37 # explicitly asked to rebuild
38 if name in rebuild_targets:
40 # else if not rebuild, and if the library already exists
41 elif os.path.isfile(File(env.subst('$LOCALLIBPATH/${LIBPREFIX}%s$LIBSUFFIX'%libname)).abspath):
43 # do not change the original value
46 build_boost = ifBuildLib('boost', 'included_boost_filesystem', build_boost)
47 build_intl = ifBuildLib('intl', 'included_intl', build_intl)
48 build_supports = ifBuildLib('supports', 'supports', build_supports)
49 build_mathed = ifBuildLib('mathed', 'mathed', build_mathed)
50 build_insets = ifBuildLib('insets', 'insets', build_insets)
51 build_frontends = ifBuildLib('frontends', 'frontends', build_frontends)
52 build_graphics = ifBuildLib('graphics', 'graphics', build_graphics)
53 build_controllers = ifBuildLib('controllers', 'controllers', build_controllers)
54 build_lyxbase = ifBuildLib('lyxbase', 'lyxbase_pre', build_lyxbase)
55 build_qt3 = ifBuildLib('qt3', 'qt3', build_qt3)
56 build_qt4 = ifBuildLib('qt4', 'qt4', build_qt4)
58 # sync frontend and env['frontend'] (maybe build qt4 with frontend=qt3)
61 env['frontend'] = 'qt4'
64 env['frontend'] = 'qt4'
72 env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
75 boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
77 print 'Processing files in boost/libs/filesystem/src...'
79 filesystem = boostenv.StaticLibrary(
80 target = '$LOCALLIBPATH/included_boost_filesystem',
81 source = ["$BUILDDIR/boost/filesystem/src/%s" % x for x in Split('''
84 operations_posix_windows.cpp
85 path_posix_windows.cpp
89 print 'Processing files in boost/libs/regex/src...'
91 regex = boostenv.StaticLibrary(
92 target = '$LOCALLIBPATH/included_boost_regex',
93 source = ["$BUILDDIR/boost/regex/src/%s" % x for x in Split('''
101 regex_traits_defaults.cpp
106 print 'Processing files in boost/libs/signals/src...'
108 signals = boostenv.StaticLibrary(
109 target = '$LOCALLIBPATH/included_boost_signals',
110 source = ["$BUILDDIR/boost/signals/src/%s" % x for x in Split('''
119 print 'Processing files in boost/libs/iostreams/src...'
121 iostreams = boostenv.StaticLibrary(
122 target = '$LOCALLIBPATH/included_boost_iostreams',
123 source = ["$BUILDDIR/boost/iostreams/src/%s" % x for x in Split('''
129 Alias('boost', filesystem)
130 Alias('boost', regex)
131 Alias('boost', signals)
132 Alias('boost', iostreams)
139 print "Processing files in intl..."
141 env.BuildDir('$BUILDDIR/intl', '$TOP_SRC_DIR/intl', duplicate = 0)
144 # we need the original C compiler for these files
145 intlenv['CC'] = intlenv['C_COMPILER']
146 intlenv['CPPPATH'] += ['intl']
148 intlenv.Append(CCFLAGS = [
149 r'-DLOCALEDIR=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
150 r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
151 r'-DLIBDIR=\"' + env['TOP_SRC_DIR'].replace('\\', '\\\\') + r'/lib\"',
153 '-DENABLE_RELOCATABLE=1',
155 r'-DINSTALLDIR=\"' + env['PREFIX'].replace('\\', '\\\\') + r'/lib\"',
157 '-Dset_relocation_prefix=libintl_set_relocation_prefix',
158 '-Drelocate=libintl_relocate',
159 '-DDEPENDS_ON_LIBICONV=1',
164 # libgnuintl.h.in => libintl.h
165 env.substFile('$TOP_SRC_DIR/intl/libintl.h', '$TOP_SRC_DIR/intl/libgnuintl.h.in')
166 env.Command('$TOP_SRC_DIR/intl/libgnuintl.h', '$TOP_SRC_DIR/intl/libintl.h',
167 [Copy('$TARGET', '$SOURCE')])
169 intl = intlenv.StaticLibrary(
170 target = '$LOCALLIBPATH/included_intl',
172 source = ["$BUILDDIR/intl/%s" % x for x in Split('''
202 # Now, src code under src/
204 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
211 print "Processing files in src/support..."
213 env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
215 supports = env.StaticLibrary(
216 target = '$LOCALLIBPATH/supports',
217 source = ['$BUILDDIR/common/support/%s' % x for x in Split('''
248 Alias('supports', supports)
255 print "Processing files in src/mathed..."
257 mathed = env.StaticLibrary(
258 target = '$LOCALLIBPATH/mathed',
259 source = ["$BUILDDIR/common/mathed/%s" % x for x in Split('''
267 math_boldsymbolinset.C
276 math_decorationinset.C
334 Alias('mathed', mathed)
341 print "Processing files in src/insets..."
343 insets = env.StaticLibrary(
344 target = '$LOCALLIBPATH/insets',
345 source = ["$BUILDDIR/common/insets/%s" % x for x in Split('''
372 insetgraphicsParams.C
397 Alias('insets', insets)
404 print "Processing files in src/frontends..."
406 frontends = env.StaticLibrary(
407 target = '$LOCALLIBPATH/frontends',
408 source = ["$BUILDDIR/common/frontends/%s" % x for x in Split('''
420 Alias('frontends', frontends)
427 print "Processing files in src/graphics..."
429 graphics = env.StaticLibrary(
430 target = '$LOCALLIBPATH/graphics',
431 source = ["$BUILDDIR/common/graphics/%s" % x for x in Split('''
445 Alias('graphics', graphics)
448 if build_controllers:
450 # src/frontends/controllers
452 print "Processing files in src/frontends/controllers..."
454 controllers = env.StaticLibrary(
455 target = '$LOCALLIBPATH/controllers',
456 source = ["$BUILDDIR/common/frontends/controllers/%s" % x for x in Split('''
474 ControlCommandBuffer.C
494 ControlSpellchecker.C
496 ControlTabularCreate.C
506 Alias('controllers', controllers)
512 if build_qt3 or build_qt4:
513 env.BuildDir('$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
516 print "Processing files in src/frontends/qt3..."
519 # disable auto scan to speed up non build time
520 qt3env['QT_AUTOSCAN'] = 0
521 qt3env['QT_MOCHPREFIX'] = ''
526 qt3env.AppendUnique(CPPPATH = [
528 '$BUILDDIR/common/images',
529 '$BUILDDIR/common/frontends',
530 '$BUILDDIR/common/frontends/qt3',
531 '$BUILDDIR/common/frontends/controllers',
535 qt3_ui_files = Split('''
537 BranchesModuleBase.ui
539 TextLayoutModuleBase.ui
540 LanguageModuleBase.ui
543 NumberingModuleBase.ui
545 PageLayoutModuleBase.ui
546 PreambleModuleBase.ui
549 QBibitemDialogBase.ui
551 QBibtexAddDialogBase.ui
554 QChangesDialogBase.ui
555 QCharacterDialogBase.ui
556 QCitationDialogBase.ui
557 QCitationFindDialogBase.ui
558 QDelimiterDialogBase.ui
559 QDocumentDialogBase.ui
560 QErrorListDialogBase.ui
562 QExternalDialogBase.ui
564 QGraphicsDialogBase.ui
565 QIncludeDialogBase.ui
568 QViewSourceDialogBase.ui
570 QMathMatrixDialogBase.ui
572 QParagraphDialogBase.ui
575 QPrefConvertersModule.ui
576 QPrefCopiersModule.ui
577 QPrefCygwinPathModule.ui
579 QPrefDisplayModule.ui
580 QPrefFileformatsModule.ui
581 QPrefIdentityModule.ui
582 QPrefKeyboardModule.ui
583 QPrefLanguageModule.ui
586 QPrefPrinterModule.ui
587 QPrefScreenFontsModule.ui
589 QPrefSpellcheckerModule.ui
595 QShowFileDialogBase.ui
596 QSpellcheckerDialogBase.ui
597 QTabularCreateDialogBase.ui
598 QTabularDialogBase.ui
599 QTexinfoDialogBase.ui
600 QThesaurusDialogBase.ui
607 qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
650 QSpellcheckerDialog.C
652 QTabularCreateDialog.C
667 # manually moc and uic files for better performance
668 qt3_moced_files = [qt3env.Moc(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt3_moc_files]
670 qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in qt3_ui_files]
671 qt3_uiced_cc_files = []
672 for x in qt3_uiced_files:
673 qt3_uiced_cc_files.extend(x[1:])
675 qt3 = qt3env.StaticLibrary(
676 target = '$LOCALLIBPATH/qt3',
677 source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
739 qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
745 print "Processing files in src/frontends/qt4..."
748 qt4env['QT_AUTOSCAN'] = 0
750 # local qt4 toolset from
751 # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
753 # NOTE: I have to patch qt4.py since it does not automatically
754 # process .C file!!! (add to cxx_suffixes )
756 qt4env.Tool('qt4', [env['SCONS_DIR']])
757 qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
759 qt4env.AppendUnique(CPPPATH = [
761 '$BUILDDIR/common/images',
762 '$BUILDDIR/common/frontends',
763 '$BUILDDIR/common/frontends/qt4',
764 '$BUILDDIR/common/frontends/controllers'
768 # FIXME: replace by something from pkg_config
769 qt4env.Append(CCFLAGS = [
771 '-DQT_CLEAN_NAMESPACE',
778 qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
850 qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
895 QSpellcheckerDialog.C
897 QTabularCreateDialog.C
913 qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
980 resources = [qt4env.Uic4(x) for x in qt4_ui_files]
983 # moc qt4_moc_files, the moced files are included in the original files
985 qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
987 qt4 = qt4env.StaticLibrary(
988 target = '$LOCALLIBPATH/qt4',
989 LIBS = qt4env['QT_LIB'],
990 source = qt4_source_files + qt4_moc_files
999 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
1001 print "Processing files in src/client..."
1003 if env['HAVE_FCNTL']:
1004 client = env.Program(
1005 target = '$BUILDDIR/common/client/lyxclient',
1006 LIBS = ['supports'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] +
1007 env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
1008 source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
1016 Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
1017 client, [Copy('$TARGET', '$SOURCE')]))
1020 Alias('client', client)
1027 print "Processing files in src/tex2lyx..."
1029 tex2lyx_env = env.Copy()
1030 # the order is important here.
1031 tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
1032 tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
1034 for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
1035 'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
1036 env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
1037 [Copy('$TARGET', '$SOURCE')])
1039 tex2lyx = tex2lyx_env.Program(
1040 target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1041 LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1042 source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1063 Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1064 tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1065 Alias('tex2lyx', tex2lyx)
1072 print "Processing files in src..."
1074 env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1076 lyx_source_pre = Split('''
1096 ParagraphParameters.C
1182 lyx_source_post = Split('''
1191 if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1192 lyx_source_post.append('aspell.C')
1193 elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1194 lyx_source_post.append('pspell.C')
1195 elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1196 lyx_source_post.append('ispell.C')
1198 lyxbase_pre = env.StaticLibrary(
1199 target = '$LOCALLIBPATH/lyxbase_pre',
1200 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1202 lyxbase_post = env.StaticLibrary(
1203 target = '$LOCALLIBPATH/lyxbase_post',
1204 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1206 Alias('lyxbase', lyxbase_pre)
1207 Alias('lyxbase', lyxbase_post)
1212 # Build lyx with given frontend
1215 target = '$BUILDDIR/$frontend/lyx',
1228 env['BOOST_LIBRARIES'] +
1231 env['SOCKET_LIBS'] +
1234 # [/path/to/lyx.ext] => lyx-qt3.ext
1235 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1236 Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1237 [Copy('$TARGET', '$SOURCE')]))
1245 print 'Processing files in po...'
1250 # files to translate
1251 transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1252 # possibly *only* handle these languages
1254 if env.has_key('languages'):
1255 languages = env.make_list(env['lanauges'])
1256 # use defulat msgfmt
1257 if not env['MSGFMT']:
1258 print 'msgfmt does not exist. Can not process po files'
1261 env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1264 for f in transfiles:
1266 fname = os.path.split(f)[1]
1268 country = fname.split('.')[0]
1270 if not languages or country in languages:
1271 gmo_files.extend(env.Transfiles(f))
1274 if 'install' in targets:
1275 # create the directory if needed
1276 if not os.path.isdir(env['DEST_DIR']):
1278 os.makedirs(env['DEST_DIR'])
1281 if not os.path.isdir(env['DEST_DIR']):
1282 print 'Can not create directory', env['DEST_DIR']
1287 # do not install these files
1288 exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
1289 'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1291 def install(dest, src):
1292 ''' recusive installation of src to dest '''
1293 # separate file and directory
1294 files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1295 dirs = filter(os.path.isdir, src)
1297 env.Install(dest, files)
1301 ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1302 glob.glob(os.path.join(dir, '*'))) )
1305 # executables (some of them may be none)
1307 if env['ADD_SUFFIX_TO_EXECUTABLES']:
1308 program_suffix = env['PROGRAM_SUFFIX']
1313 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1314 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1315 env.InstallAs(target, lyx)
1316 Alias('install', target)
1317 # install lyx as lyx-qt3
1318 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1319 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1320 env.InstallAs(target, lyx)
1321 Alias('install', target)
1324 target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1325 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1326 env.InstallAs(target, tex2lyx)
1327 Alias('install', target)
1329 # install lyxclient, may not exist
1331 target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1332 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1333 env.InstallAs(target, client)
1334 Alias('install', target)
1337 dirs = install(env['SHARE_DEST_DIR'],
1338 [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1339 'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1340 'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
1341 'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
1343 env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py',
1344 '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1345 Alias('install', dirs)
1347 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyx.1'),
1348 env.subst('$TOP_SRC_DIR/lyx.man'))
1349 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'tex2lyx.1'),
1350 env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1351 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyxclient.1'),
1352 env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1353 Alias('install', [os.path.join(env['MAN_DEST_DIR'], x) for
1354 x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1356 # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1357 for gmo in gmo_files:
1358 lan = os.path.split(str(gmo))[1].split('.')[0]
1359 dest_file = os.path.join(env['LOCALE_DEST_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1360 env.InstallAs(dest_file, gmo)
1361 Alias('install', dest_file)
1365 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])