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'] = 'qt3'
64 env['frontend'] = 'qt4'
66 frontend = env['frontend']
74 env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
77 boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
79 print 'Processing files in boost/libs/filesystem/src...'
81 filesystem = boostenv.StaticLibrary(
82 target = '$LOCALLIBPATH/included_boost_filesystem',
83 source = ["$BUILDDIR/boost/filesystem/src/%s" % x for x in Split('''
86 operations_posix_windows.cpp
87 path_posix_windows.cpp
91 print 'Processing files in boost/libs/regex/src...'
93 regex = boostenv.StaticLibrary(
94 target = '$LOCALLIBPATH/included_boost_regex',
95 source = ["$BUILDDIR/boost/regex/src/%s" % x for x in Split('''
103 regex_traits_defaults.cpp
108 print 'Processing files in boost/libs/signals/src...'
110 signals = boostenv.StaticLibrary(
111 target = '$LOCALLIBPATH/included_boost_signals',
112 source = ["$BUILDDIR/boost/signals/src/%s" % x for x in Split('''
121 print 'Processing files in boost/libs/iostreams/src...'
123 iostreams = boostenv.StaticLibrary(
124 target = '$LOCALLIBPATH/included_boost_iostreams',
125 source = ["$BUILDDIR/boost/iostreams/src/%s" % x for x in Split('''
131 Alias('boost', filesystem)
132 Alias('boost', regex)
133 Alias('boost', signals)
134 Alias('boost', iostreams)
141 print "Processing files in intl..."
143 env.BuildDir('$BUILDDIR/intl', '$TOP_SRC_DIR/intl', duplicate = 0)
146 # we need the original C compiler for these files
147 intlenv['CC'] = intlenv['C_COMPILER']
148 intlenv['CCFLAGS'] = intlenv['C_CCFLAGS'].split()
149 intlenv['CPPPATH'] += ['intl']
151 intlenv.Append(CCFLAGS = [
152 r'-DLOCALEDIR=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
153 r'-DLOCALE_ALIAS_PATH=\"' + env['LOCALE_DIR'].replace('\\', '\\\\') + r'\"',
154 r'-DLIBDIR=\"' + env['TOP_SRC_DIR'].replace('\\', '\\\\') + r'/lib\"',
156 '-DENABLE_RELOCATABLE=1',
158 r'-DINSTALLDIR=\"' + env['PREFIX'].replace('\\', '\\\\') + r'/lib\"',
160 '-Dset_relocation_prefix=libintl_set_relocation_prefix',
161 '-Drelocate=libintl_relocate',
162 '-DDEPENDS_ON_LIBICONV=1',
167 # libgnuintl.h.in => libintl.h
168 env.substFile('$TOP_SRC_DIR/intl/libintl.h', '$TOP_SRC_DIR/intl/libgnuintl.h.in')
169 env.Command('$TOP_SRC_DIR/intl/libgnuintl.h', '$TOP_SRC_DIR/intl/libintl.h',
170 [Copy('$TARGET', '$SOURCE')])
172 intl = intlenv.StaticLibrary(
173 target = '$LOCALLIBPATH/included_intl',
175 source = ["$BUILDDIR/intl/%s" % x for x in Split('''
205 # Now, src code under src/
207 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
214 print "Processing files in src/support..."
216 env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
218 supports = env.StaticLibrary(
219 target = '$LOCALLIBPATH/supports',
220 source = ['$BUILDDIR/common/support/%s' % x for x in Split('''
251 Alias('supports', supports)
258 print "Processing files in src/mathed..."
260 mathed = env.StaticLibrary(
261 target = '$LOCALLIBPATH/mathed',
262 source = ["$BUILDDIR/common/mathed/%s" % x for x in Split('''
270 math_boldsymbolinset.C
279 math_decorationinset.C
337 Alias('mathed', mathed)
344 print "Processing files in src/insets..."
346 insets = env.StaticLibrary(
347 target = '$LOCALLIBPATH/insets',
348 source = ["$BUILDDIR/common/insets/%s" % x for x in Split('''
375 insetgraphicsParams.C
400 Alias('insets', insets)
407 print "Processing files in src/frontends..."
409 frontends = env.StaticLibrary(
410 target = '$LOCALLIBPATH/frontends',
411 source = ["$BUILDDIR/common/frontends/%s" % x for x in Split('''
423 Alias('frontends', frontends)
430 print "Processing files in src/graphics..."
432 graphics = env.StaticLibrary(
433 target = '$LOCALLIBPATH/graphics',
434 source = ["$BUILDDIR/common/graphics/%s" % x for x in Split('''
448 Alias('graphics', graphics)
451 if build_controllers:
453 # src/frontends/controllers
455 print "Processing files in src/frontends/controllers..."
457 controllers = env.StaticLibrary(
458 target = '$LOCALLIBPATH/controllers',
459 source = ["$BUILDDIR/common/frontends/controllers/%s" % x for x in Split('''
477 ControlCommandBuffer.C
497 ControlSpellchecker.C
499 ControlTabularCreate.C
508 Alias('controllers', controllers)
514 if build_qt3 or build_qt4:
515 env.BuildDir('$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
518 print "Processing files in src/frontends/qt3..."
521 # disable auto scan to speed up non build time
522 qt3env['QT_AUTOSCAN'] = 0
523 qt3env['QT_MOCHPREFIX'] = ''
528 qt3env.AppendUnique(CPPPATH = [
530 '$BUILDDIR/common/images',
531 '$BUILDDIR/common/frontends',
532 '$BUILDDIR/common/frontends/qt3',
533 '$BUILDDIR/common/frontends/controllers',
537 qt3_ui_files = Split('''
539 BranchesModuleBase.ui
541 TextLayoutModuleBase.ui
542 LanguageModuleBase.ui
545 NumberingModuleBase.ui
547 PageLayoutModuleBase.ui
548 PreambleModuleBase.ui
551 QBibitemDialogBase.ui
553 QBibtexAddDialogBase.ui
556 QChangesDialogBase.ui
557 QCharacterDialogBase.ui
558 QCitationDialogBase.ui
559 QCitationFindDialogBase.ui
560 QDelimiterDialogBase.ui
561 QDocumentDialogBase.ui
562 QErrorListDialogBase.ui
564 QExternalDialogBase.ui
566 QGraphicsDialogBase.ui
567 QIncludeDialogBase.ui
570 QViewSourceDialogBase.ui
572 QMathMatrixDialogBase.ui
574 QParagraphDialogBase.ui
577 QPrefConvertersModule.ui
578 QPrefCopiersModule.ui
579 QPrefCygwinPathModule.ui
581 QPrefDisplayModule.ui
582 QPrefFileformatsModule.ui
583 QPrefIdentityModule.ui
584 QPrefKeyboardModule.ui
585 QPrefLanguageModule.ui
588 QPrefPrinterModule.ui
589 QPrefScreenFontsModule.ui
591 QPrefSpellcheckerModule.ui
597 QShowFileDialogBase.ui
598 QSpellcheckerDialogBase.ui
599 QTabularCreateDialogBase.ui
600 QTabularDialogBase.ui
601 QTexinfoDialogBase.ui
602 QThesaurusDialogBase.ui
609 qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
652 QSpellcheckerDialog.C
654 QTabularCreateDialog.C
669 # manually moc and uic files for better performance
670 qt3_moced_files = [qt3env.Moc(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt3_moc_files]
672 qt3_uiced_files = [qt3env.Uic('$BUILDDIR/common/frontends/qt3/ui/'+x) for x in qt3_ui_files]
673 qt3_uiced_cc_files = []
674 for x in qt3_uiced_files:
675 qt3_uiced_cc_files.extend(x[1:])
677 qt3 = qt3env.StaticLibrary(
678 target = '$LOCALLIBPATH/qt3',
679 source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
741 qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
747 print "Processing files in src/frontends/qt4..."
750 qt4env['QT_AUTOSCAN'] = 0
752 # local qt4 toolset from
753 # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
755 # NOTE: I have to patch qt4.py since it does not automatically
756 # process .C file!!! (add to cxx_suffixes )
758 qt4env.Tool('qt4', [env['SCONS_DIR']])
759 qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
761 qt4env.AppendUnique(CPPPATH = [
763 '$BUILDDIR/common/images',
764 '$BUILDDIR/common/frontends',
765 '$BUILDDIR/common/frontends/qt4',
766 '$BUILDDIR/common/frontends/controllers'
770 # FIXME: replace by something from pkg_config
771 qt4env.Append(CCFLAGS = [
773 '-DQT_CLEAN_NAMESPACE',
780 qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
852 qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
898 QSpellcheckerDialog.C
900 QTabularCreateDialog.C
916 qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
982 resources = [qt4env.Uic4(x) for x in qt4_ui_files]
985 # moc qt4_moc_files, the moced files are included in the original files
987 qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
989 qt4 = qt4env.StaticLibrary(
990 target = '$LOCALLIBPATH/qt4',
991 LIBS = qt4env['QT_LIB'],
992 source = qt4_source_files + qt4_moc_files
1001 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
1003 print "Processing files in src/client..."
1005 if env['HAVE_FCNTL']:
1006 client = env.Program(
1007 target = '$BUILDDIR/common/client/lyxclient',
1008 LIBS = ['supports'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] +
1009 env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
1010 source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
1018 Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
1019 client, [Copy('$TARGET', '$SOURCE')]))
1022 Alias('client', client)
1029 print "Processing files in src/tex2lyx..."
1031 tex2lyx_env = env.Copy()
1032 # the order is important here.
1033 tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
1034 tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
1036 for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
1037 'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
1038 env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
1039 [Copy('$TARGET', '$SOURCE')])
1041 tex2lyx = tex2lyx_env.Program(
1042 target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1043 LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1044 source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1065 Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1066 tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1067 Alias('tex2lyx', tex2lyx)
1074 print "Processing files in src..."
1076 env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1078 lyx_source_pre = Split('''
1098 ParagraphParameters.C
1183 # temporary fix for MSVC, will remove later.
1184 if not env['USE_VC']:
1185 lyx_source_pre.append('main.C')
1187 lyx_source_post = Split('''
1196 if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1197 lyx_source_post.append('aspell.C')
1198 elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1199 lyx_source_post.append('pspell.C')
1200 elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1201 lyx_source_post.append('ispell.C')
1203 lyxbase_pre = env.StaticLibrary(
1204 target = '$LOCALLIBPATH/lyxbase_pre',
1205 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1207 lyxbase_post = env.StaticLibrary(
1208 target = '$LOCALLIBPATH/lyxbase_post',
1209 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1211 Alias('lyxbase', lyxbase_pre)
1212 Alias('lyxbase', lyxbase_post)
1217 # Build lyx with given frontend
1219 # temporary fix for MSVC, will remove later.
1221 lyx_source = ['$BUILDDIR/common/main.C']
1225 target = '$BUILDDIR/$frontend/lyx',
1226 source = lyx_source,
1238 env['BOOST_LIBRARIES'] +
1241 env['SOCKET_LIBS'] +
1244 # [/path/to/lyx.ext] => lyx-qt3.ext
1245 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1246 Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1247 [Copy('$TARGET', '$SOURCE')]))
1255 print 'Processing files in po...'
1260 # files to translate
1261 transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1262 # possibly *only* handle these languages
1264 if env.has_key('languages'):
1265 languages = env.make_list(env['lanauges'])
1266 # use defulat msgfmt
1267 if not env['MSGFMT']:
1268 print 'msgfmt does not exist. Can not process po files'
1271 env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1274 for f in transfiles:
1276 fname = os.path.split(f)[1]
1278 country = fname.split('.')[0]
1280 if not languages or country in languages:
1281 gmo_files.extend(env.Transfiles(f))
1284 if 'install' in targets:
1285 # create the directory if needed
1286 if not os.path.isdir(env['DEST_DIR']):
1288 os.makedirs(env['DEST_DIR'])
1291 if not os.path.isdir(env['DEST_DIR']):
1292 print 'Can not create directory', env['DEST_DIR']
1297 # do not install these files
1298 exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
1299 'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1301 def install(dest, src):
1302 ''' recusive installation of src to dest '''
1303 # separate file and directory
1304 files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1305 dirs = filter(os.path.isdir, src)
1307 env.Install(dest, files)
1311 ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1312 glob.glob(os.path.join(dir, '*'))) )
1315 # executables (some of them may be none)
1317 if env['ADD_SUFFIX_TO_EXECUTABLES']:
1318 program_suffix = env['PROGRAM_SUFFIX']
1323 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1324 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1325 env.InstallAs(target, lyx)
1326 Alias('install', target)
1327 # install lyx as lyx-qt3
1328 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1329 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1330 env.InstallAs(target, lyx)
1331 Alias('install', target)
1334 target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1335 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1336 env.InstallAs(target, tex2lyx)
1337 Alias('install', target)
1339 # install lyxclient, may not exist
1341 target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1342 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1343 env.InstallAs(target, client)
1344 Alias('install', target)
1347 dirs = install(env['SHARE_DEST_DIR'],
1348 [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1349 'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1350 'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
1351 'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
1353 env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py',
1354 '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1355 Alias('install', dirs)
1357 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyx.1'),
1358 env.subst('$TOP_SRC_DIR/lyx.man'))
1359 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'tex2lyx.1'),
1360 env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1361 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyxclient.1'),
1362 env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1363 Alias('install', [os.path.join(env['MAN_DEST_DIR'], x) for
1364 x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1366 # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1367 for gmo in gmo_files:
1368 lan = os.path.split(str(gmo))[1].split('.')[0]
1369 dest_file = os.path.join(env['LOCALE_DEST_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1370 env.InstallAs(dest_file, gmo)
1371 Alias('install', dest_file)
1375 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])