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'
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']
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('''
983 resources = [qt4env.Uic4(x) for x in qt4_ui_files]
986 # moc qt4_moc_files, the moced files are included in the original files
988 qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
990 qt4 = qt4env.StaticLibrary(
991 target = '$LOCALLIBPATH/qt4',
992 LIBS = qt4env['QT_LIB'],
993 source = qt4_source_files + qt4_moc_files
1002 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
1004 print "Processing files in src/client..."
1006 if env['HAVE_FCNTL']:
1007 client = env.Program(
1008 target = '$BUILDDIR/common/client/lyxclient',
1009 LIBS = ['supports'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] +
1010 env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
1011 source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
1019 Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
1020 client, [Copy('$TARGET', '$SOURCE')]))
1023 Alias('client', client)
1030 print "Processing files in src/tex2lyx..."
1032 tex2lyx_env = env.Copy()
1033 # the order is important here.
1034 tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
1035 tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
1037 for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C',
1038 'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
1039 env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
1040 [Copy('$TARGET', '$SOURCE')])
1042 tex2lyx = tex2lyx_env.Program(
1043 target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1044 LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1045 source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1066 Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1067 tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1068 Alias('tex2lyx', tex2lyx)
1075 print "Processing files in src..."
1077 env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1079 lyx_source_pre = Split('''
1099 ParagraphParameters.C
1184 # temporary fix for MSVC, will remove later.
1185 if not env['USE_VC']:
1186 lyx_source_pre.append('main.C')
1188 lyx_source_post = Split('''
1197 if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1198 lyx_source_post.append('aspell.C')
1199 elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1200 lyx_source_post.append('pspell.C')
1201 elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1202 lyx_source_post.append('ispell.C')
1204 lyxbase_pre = env.StaticLibrary(
1205 target = '$LOCALLIBPATH/lyxbase_pre',
1206 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1208 lyxbase_post = env.StaticLibrary(
1209 target = '$LOCALLIBPATH/lyxbase_post',
1210 source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1212 Alias('lyxbase', lyxbase_pre)
1213 Alias('lyxbase', lyxbase_post)
1218 # Build lyx with given frontend
1220 # temporary fix for MSVC, will remove later.
1222 lyx_source = ['$BUILDDIR/common/main.C']
1226 target = '$BUILDDIR/$frontend/lyx',
1227 source = lyx_source,
1239 env['BOOST_LIBRARIES'] +
1242 env['SOCKET_LIBS'] +
1245 # [/path/to/lyx.ext] => lyx-qt3.ext
1246 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1247 Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1248 [Copy('$TARGET', '$SOURCE')]))
1256 print 'Processing files in po...'
1261 # files to translate
1262 transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1263 # possibly *only* handle these languages
1265 if env.has_key('languages'):
1266 languages = env.make_list(env['lanauges'])
1267 # use defulat msgfmt
1268 if not env['MSGFMT']:
1269 print 'msgfmt does not exist. Can not process po files'
1272 env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1275 for f in transfiles:
1277 fname = os.path.split(f)[1]
1279 country = fname.split('.')[0]
1281 if not languages or country in languages:
1282 gmo_files.extend(env.Transfiles(f))
1285 if 'install' in targets:
1286 # create the directory if needed
1287 if not os.path.isdir(env['DEST_DIR']):
1289 os.makedirs(env['DEST_DIR'])
1292 if not os.path.isdir(env['DEST_DIR']):
1293 print 'Can not create directory', env['DEST_DIR']
1298 # do not install these files
1299 exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile',
1300 'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1302 def install(dest, src):
1303 ''' recusive installation of src to dest '''
1304 # separate file and directory
1305 files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1306 dirs = filter(os.path.isdir, src)
1308 env.Install(dest, files)
1312 ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1313 glob.glob(os.path.join(dir, '*'))) )
1316 # executables (some of them may be none)
1318 if env['ADD_SUFFIX_TO_EXECUTABLES']:
1319 program_suffix = env['PROGRAM_SUFFIX']
1324 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1325 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1326 env.InstallAs(target, lyx)
1327 Alias('install', target)
1328 # install lyx as lyx-qt3
1329 target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1330 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1331 env.InstallAs(target, lyx)
1332 Alias('install', target)
1335 target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1336 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1337 env.InstallAs(target, tex2lyx)
1338 Alias('install', target)
1340 # install lyxclient, may not exist
1342 target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1343 target = os.path.join(env['BIN_DEST_DIR'], target_name)
1344 env.InstallAs(target, client)
1345 Alias('install', target)
1348 dirs = install(env['SHARE_DEST_DIR'],
1349 [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1350 'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1351 'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts',
1352 'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc', 'ui']]
1354 env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py',
1355 '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1356 Alias('install', dirs)
1358 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyx.1'),
1359 env.subst('$TOP_SRC_DIR/lyx.man'))
1360 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'tex2lyx.1'),
1361 env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1362 env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyxclient.1'),
1363 env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1364 Alias('install', [os.path.join(env['MAN_DEST_DIR'], x) for
1365 x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1367 # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1368 for gmo in gmo_files:
1369 lan = os.path.split(str(gmo))[1].split('.')[0]
1370 dest_file = os.path.join(env['LOCALE_DEST_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1371 env.InstallAs(dest_file, gmo)
1372 Alias('install', dest_file)
1376 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])