]> git.lyx.org Git - lyx.git/blob - development/scons/SConscript
Scons: add option rebuild that rebuild only specified targets, regardless of environm...
[lyx.git] / development / scons / SConscript
1 # vi:filetype=python:expandtab:tabstop=2:shiftwidth=2
2
3 # file SConscript
4 #
5 # This file is part of LyX, the document processor.
6 # Licence details can be found in the file COPYING.
7 #
8 # \author Bo Peng
9 # Full author contact details are available in file CREDITS.
10
11 import os, sys
12
13 Import('env')
14
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
31
32
33 # now, if rebuild_targets is specified, do not rebuild some targets
34 rebuild_targets = env['REBUILD_TARGETS']
35 if rebuild_targets:
36   def ifBuildLib(name, libname, old_value):
37     # explicitly asked to rebuild
38     if name in rebuild_targets:
39       return True
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):
42       return False
43     # do not change the original value
44     else:
45       return old_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)
57
58 # sync frontend and env['frontend'] (maybe build qt4 with frontend=qt3)
59 if build_qt3:
60   frontend = 'qt3'
61   env['frontend'] = 'qt4'
62 elif build_qt4:
63   frontend = 'qt4'
64   env['frontend'] = 'qt4'
65
66
67 if build_boost:
68   #
69   # boost libraries
70   #
71   # special builddir
72   env.BuildDir('$BUILDDIR/boost', '$TOP_SRC_DIR/boost/libs', duplicate = 0)
73
74   boostenv = env.Copy()
75   boostenv.AppendUnique(CCFLAGS = '-DBOOST_USER_CONFIG="<config.h>"')
76
77   print 'Processing files in boost/libs/filesystem/src...'
78
79   filesystem = boostenv.StaticLibrary(
80     target = '$LOCALLIBPATH/included_boost_filesystem',
81     source = ["$BUILDDIR/boost/filesystem/src/%s" % x for x in Split('''
82       convenience.cpp
83       exception.cpp
84       operations_posix_windows.cpp
85       path_posix_windows.cpp
86     ''')]
87   )
88
89   print 'Processing files in boost/libs/regex/src...'
90
91   regex = boostenv.StaticLibrary(
92     target = '$LOCALLIBPATH/included_boost_regex',
93     source = ["$BUILDDIR/boost/regex/src/%s" % x for x in Split('''
94       cpp_regex_traits.cpp
95       c_regex_traits.cpp
96       cregex.cpp
97       fileiter.cpp
98       instances.cpp
99       regex.cpp
100       regex_raw_buffer.cpp
101       regex_traits_defaults.cpp
102       w32_regex_traits.cpp
103     ''')]
104   )
105
106   print 'Processing files in boost/libs/signals/src...'
107
108   signals = boostenv.StaticLibrary(
109     target = '$LOCALLIBPATH/included_boost_signals',
110     source = ["$BUILDDIR/boost/signals/src/%s" % x for x in Split('''
111       connection.cpp
112       named_slot_map.cpp
113       signal_base.cpp
114       slot.cpp
115       trackable.cpp
116     ''')]
117   )
118
119   print 'Processing files in boost/libs/iostreams/src...'
120
121   iostreams = boostenv.StaticLibrary(
122     target = '$LOCALLIBPATH/included_boost_iostreams',
123     source = ["$BUILDDIR/boost/iostreams/src/%s" % x for x in Split('''
124       file_descriptor.cpp
125       mapped_file.cpp
126       zlib.cpp
127     ''') ]
128   )
129   Alias('boost', filesystem)
130   Alias('boost', regex)
131   Alias('boost', signals)
132   Alias('boost', iostreams)
133
134
135 if build_intl:
136   # 
137   # intl
138   # 
139   print "Processing files in intl..."
140
141   env.BuildDir('$BUILDDIR/intl', '$TOP_SRC_DIR/intl', duplicate = 0)
142
143   intlenv = env.Copy()
144   # we need the original C compiler for these files
145   intlenv['CC'] = intlenv['C_COMPILER']
146   intlenv['CPPPATH'] += ['intl']
147   
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\"',
152     '-DIN_LIBINTL',
153     '-DENABLE_RELOCATABLE=1',
154     '-DIN_LIBRARY',
155     r'-DINSTALLDIR=\"' + env['PREFIX'].replace('\\', '\\\\') + r'/lib\"',
156     '-DNO_XMALLOC',
157     '-Dset_relocation_prefix=libintl_set_relocation_prefix',
158     '-Drelocate=libintl_relocate',
159     '-DDEPENDS_ON_LIBICONV=1',
160     '-DHAVE_CONFIG_H'
161     ]
162   )
163
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')])
168   
169   intl = intlenv.StaticLibrary(
170     target = '$LOCALLIBPATH/included_intl',
171     LIBS = ['c'],
172     source = ["$BUILDDIR/intl/%s" % x for x in Split('''
173       bindtextdom.c
174       dcgettext.c
175       dgettext.c
176       gettext.c
177       finddomain.c
178       loadmsgcat.c
179       localealias.c
180       textdomain.c
181       l10nflist.c
182       explodename.c
183       dcigettext.c
184       dcngettext.c
185       dngettext.c
186       ngettext.c
187       plural.c
188       plural-exp.c
189       localcharset.c
190       relocatable.c
191       localename.c
192       log.c
193       printf.c
194       osdep.c
195       os2compat.c
196       intl-compat.c
197     ''')]
198   )
199   Alias('intl', intl)
200
201 #
202 # Now, src code under src/
203 #
204 env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
205
206
207 if build_supports:
208   #
209   # src/support
210   #
211   print "Processing files in src/support..."
212
213   env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRC_DIR/src/support/package.C.in')
214
215   supports = env.StaticLibrary(
216     target = '$LOCALLIBPATH/supports',
217     source = ['$BUILDDIR/common/support/%s' % x for x in Split('''
218       FileMonitor.C
219       abort.C
220       chdir.C
221       convert.C
222       copy.C
223       environment.C
224       filefilterlist.C
225       filename.C
226       filetools.C
227       forkedcall.C
228       forkedcallqueue.C
229       forkedcontr.C
230       fs_extras.C
231       getcwd.C
232       kill.C
233       lstrings.C
234       lyxtime.C
235       lyxsum.C
236       mkdir.C
237       os.C
238       path.C
239       package.C
240       rename.C
241       socktools.C
242       systemcall.C
243       tempname.C
244       userinfo.C
245       unlink.C
246     ''')]
247   )
248   Alias('supports', supports)
249
250
251 if build_mathed:
252   #
253   # src/mathed
254   #
255   print "Processing files in src/mathed..."
256
257   mathed = env.StaticLibrary(
258     target = '$LOCALLIBPATH/mathed',
259     source = ["$BUILDDIR/common/mathed/%s" % x for x in Split('''
260       textpainter.C
261       math_amsarrayinset.C
262       math_arrayinset.C
263       math_atom.C
264       math_autocorrect.C
265       math_biginset.C
266       math_binominset.C
267       math_boldsymbolinset.C
268       math_boxinset.C
269       math_boxedinset.C
270       math_braceinset.C
271       math_casesinset.C
272       math_charinset.C
273       math_colorinset.C
274       math_commentinset.C
275       math_data.C
276       math_decorationinset.C
277       math_deliminset.C
278       math_dfracinset.C
279       math_diffinset.C
280       math_diminset.C
281       math_dotsinset.C
282       math_envinset.C
283       math_extern.C
284       math_exfuncinset.C
285       math_exintinset.C
286       math_factory.C
287       math_fboxinset.C
288       math_frameboxinset.C
289       math_fontinset.C
290       math_fontoldinset.C
291       math_fracinset.C
292       math_fracbase.C
293       math_gridinset.C
294       math_hullinset.C
295       math_inset.C
296       math_kerninset.C
297       math_lefteqninset.C
298       math_liminset.C
299       math_macro.C
300       math_macroarg.C
301       math_macrotemplate.C
302       math_macrotable.C
303       math_makeboxinset.C
304       math_mathmlstream.C
305       math_matrixinset.C
306       math_nestinset.C
307       math_numberinset.C
308       math_oversetinset.C
309       math_parinset.C
310       math_parser.C
311       math_phantominset.C
312       math_rootinset.C
313       math_scriptinset.C
314       math_sizeinset.C
315       math_spaceinset.C
316       math_splitinset.C
317       math_sqrtinset.C
318       math_stackrelinset.C
319       math_streamstr.C
320       math_stringinset.C
321       math_substackinset.C
322       math_support.C
323       math_symbolinset.C
324       math_tabularinset.C
325       math_tfracinset.C
326       math_unknowninset.C
327       math_undersetinset.C
328       math_xarrowinset.C
329       math_xymatrixinset.C
330       command_inset.C
331       ref_inset.C
332     ''')]
333   )
334   Alias('mathed', mathed)
335
336
337 if build_insets:
338   #
339   # src/insets
340   #
341   print "Processing files in src/insets..."
342
343   insets = env.StaticLibrary(
344     target = '$LOCALLIBPATH/insets',
345     source = ["$BUILDDIR/common/insets/%s" % x for x in Split('''
346       mailinset.C
347       ExternalSupport.C
348       ExternalTemplate.C
349       ExternalTransforms.C
350       render_button.C
351       render_graphic.C
352       render_preview.C
353       inset.C
354       insetbase.C
355       insetbibitem.C
356       insetbibtex.C
357       insetbox.C
358       insetbranch.C
359       insetcaption.C
360       insetcharstyle.C
361       insetcite.C
362       insetcollapsable.C
363       insetcommand.C
364       insetcommandparams.C
365       insetenv.C
366       insetert.C
367       insetexternal.C
368       insetfloat.C
369       insetfloatlist.C
370       insetfoot.C
371       insetfootlike.C
372       insetgraphicsParams.C
373       insetgraphics.C
374       insethfill.C
375       insetinclude.C
376       insetindex.C
377       insetlabel.C
378       insetlatexaccent.C
379       insetline.C
380       insetmarginal.C
381       insetnewline.C
382       insetnote.C
383       insetoptarg.C
384       insetpagebreak.C
385       insetquotes.C
386       insetref.C
387       insetspace.C
388       insetspecialchar.C
389       insettabular.C
390       insettext.C
391       insettoc.C
392       inseturl.C
393       insetvspace.C
394       insetwrap.C
395     ''')]
396   )
397   Alias('insets', insets)
398
399
400 if build_frontends:
401   #
402   # src/frontends
403   #
404   print "Processing files in src/frontends..."
405
406   frontends = env.StaticLibrary(
407     target = '$LOCALLIBPATH/frontends',
408     source = ["$BUILDDIR/common/frontends/%s" % x for x in Split('''
409       Alert.C
410       Dialogs.C
411       LyXView.C
412       Painter.C
413       Timeout.C
414       Toolbars.C
415       guiapi.C
416       nullpainter.C
417       screen.C
418     ''')]
419   )
420   Alias('frontends', frontends)
421
422
423 if build_graphics:
424   #
425   # src/graphics
426   #
427   print "Processing files in src/graphics..."
428
429   graphics = env.StaticLibrary(
430     target = '$LOCALLIBPATH/graphics',
431     source = ["$BUILDDIR/common/graphics/%s" % x for x in Split('''
432       GraphicsCache.C
433       GraphicsCacheItem.C
434       GraphicsConverter.C
435       GraphicsImage.C
436       GraphicsLoader.C
437       GraphicsParams.C
438       LoaderQueue.C
439       GraphicsTypes.C
440       PreviewImage.C
441       PreviewLoader.C
442       Previews.C
443     ''')]
444   )
445   Alias('graphics', graphics)
446
447
448 if build_controllers:
449   #
450   # src/frontends/controllers
451   #
452   print "Processing files in src/frontends/controllers..."
453
454   controllers = env.StaticLibrary(
455     target = '$LOCALLIBPATH/controllers',
456     source = ["$BUILDDIR/common/frontends/controllers/%s" % x for x in Split('''
457       Dialog.C
458       Kernel.C
459       biblio.C
460       character.C
461       frnt_lang.C
462       tex_helpers.C
463       BCView.C
464       ButtonController.C
465       ButtonPolicies.C
466       ControlAboutlyx.C
467       ControlBibtex.C
468       ControlBox.C
469       ControlBranch.C
470       ControlCharacter.C
471       ControlChanges.C
472       ControlCitation.C
473       ControlCommand.C
474       ControlCommandBuffer.C
475       ControlDocument.C
476       ControlErrorList.C
477       ControlERT.C
478       ControlExternal.C
479       ControlFloat.C
480       ControlGraphics.C
481       ControlInclude.C
482       ControlLog.C
483       ControlViewSource.C
484       ControlMath.C
485       ControlNote.C
486       ControlParagraph.C
487       ControlPreamble.C
488       ControlPrefs.C
489       ControlPrint.C
490       ControlRef.C
491       ControlSearch.C
492       ControlSendto.C
493       ControlShowFile.C
494       ControlSpellchecker.C
495       ControlTabular.C
496       ControlTabularCreate.C
497       ControlTexinfo.C
498       ControlThesaurus.C
499       ControlToc.C
500       ControlVSpace.C
501       ControlWrap.C
502       helper_funcs.C
503       helper_funcs.h
504     ''')]
505     )
506   Alias('controllers', controllers)
507
508
509 #
510 # src/frontend/qt3/4
511 #
512 if build_qt3 or build_qt4:
513   env.BuildDir('$BUILDDIR/$frontend', '$TOP_SRC_DIR/src/frontend/$frontend', duplicate = 0)
514
515 if build_qt3:
516   print "Processing files in src/frontends/qt3..."
517
518   qt3env = env.Copy()
519   # disable auto scan to speed up non build time
520   qt3env['QT_AUTOSCAN'] = 0
521   qt3env['QT_MOCHPREFIX'] = ''
522
523   # load qt3 tools
524   qt3env.Tool('qt')
525
526   qt3env.AppendUnique(CPPPATH = [
527     '$BUILDDIR/common',
528     '$BUILDDIR/common/images',
529     '$BUILDDIR/common/frontends',
530     '$BUILDDIR/common/frontends/qt3',
531     '$BUILDDIR/common/frontends/controllers',
532     '$QT_INC_PATH']
533   )
534
535   qt3_ui_files = Split('''
536     BiblioModuleBase.ui
537     BranchesModuleBase.ui
538     BulletsModuleBase.ui
539     TextLayoutModuleBase.ui
540     LanguageModuleBase.ui
541     LaTeXModuleBase.ui
542     MarginsModuleBase.ui
543     NumberingModuleBase.ui
544     MathsModuleBase.ui
545     PageLayoutModuleBase.ui
546     PreambleModuleBase.ui
547     QAboutDialogBase.ui
548     QAskForTextDialog.ui
549     QBibitemDialogBase.ui
550     QBibtexDialogBase.ui
551     QBibtexAddDialogBase.ui
552     QBoxDialogBase.ui
553     QBranchDialogBase.ui
554     QChangesDialogBase.ui
555     QCharacterDialogBase.ui
556     QCitationDialogBase.ui
557     QCitationFindDialogBase.ui
558     QDelimiterDialogBase.ui
559     QDocumentDialogBase.ui
560     QErrorListDialogBase.ui
561     QERTDialogBase.ui
562     QExternalDialogBase.ui
563     QFloatDialogBase.ui
564     QGraphicsDialogBase.ui
565     QIncludeDialogBase.ui
566     QIndexDialogBase.ui
567     QLogDialogBase.ui
568     QViewSourceDialogBase.ui
569     QMathDialogBase.ui
570     QMathMatrixDialogBase.ui
571     QNoteDialogBase.ui
572     QParagraphDialogBase.ui
573     QPrefAsciiModule.ui
574     QPrefColorsModule.ui
575     QPrefConvertersModule.ui
576     QPrefCopiersModule.ui
577     QPrefCygwinPathModule.ui
578     QPrefDateModule.ui
579     QPrefDisplayModule.ui
580     QPrefFileformatsModule.ui
581     QPrefIdentityModule.ui
582     QPrefKeyboardModule.ui
583     QPrefLanguageModule.ui
584     QPrefLatexModule.ui
585     QPrefPathsModule.ui
586     QPrefPrinterModule.ui
587     QPrefScreenFontsModule.ui
588     QPrefsDialogBase.ui
589     QPrefSpellcheckerModule.ui
590     QPrefUIModule.ui
591     QPrintDialogBase.ui
592     QRefDialogBase.ui
593     QSearchDialogBase.ui
594     QSendtoDialogBase.ui
595     QShowFileDialogBase.ui
596     QSpellcheckerDialogBase.ui
597     QTabularCreateDialogBase.ui
598     QTabularDialogBase.ui
599     QTexinfoDialogBase.ui
600     QThesaurusDialogBase.ui
601     QTocDialogBase.ui
602     QURLDialogBase.ui
603     QVSpaceDialogBase.ui
604     QWrapDialogBase.ui
605   ''')
606
607   qt3_moc_files = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
608     BulletsModule.C
609     emptytable.C
610     FileDialog_private.C
611     floatplacement.C
612     iconpalette.C
613     lengthcombo.C
614     panelstack.C
615     QAboutDialog.C
616     QBibitemDialog.C
617     QBibtexDialog.C
618     QBoxDialog.C
619     QBranchDialog.C
620     QBrowseBox.C
621     QChangesDialog.C
622     QCharacterDialog.C
623     QCitationDialog.C
624     QCommandBuffer.C
625     QCommandEdit.C
626     QContentPane.C
627     QDelimiterDialog.C
628     QDocumentDialog.C
629     QErrorListDialog.C
630     QERTDialog.C
631     QExternalDialog.C
632     QFloatDialog.C
633     QGraphicsDialog.C
634     QIncludeDialog.C
635     QIndexDialog.C
636     QLogDialog.C
637     QViewSourceDialog.C
638     QLPopupMenu.C
639     QLPrintDialog.C
640     QMathDialog.C
641     QMathMatrixDialog.C
642     QNoteDialog.C
643     QParagraphDialog.C
644     QPrefsDialog.C
645     QRefDialog.C
646     QSearchDialog.C
647     QSendtoDialog.C
648     qsetborder.C
649     QShowFileDialog.C
650     QSpellcheckerDialog.C
651     QDialogView.C
652     QTabularCreateDialog.C
653     QTabularDialog.C
654     QTexinfoDialog.C
655     QThesaurusDialog.C
656     QTocDialog.C
657     qttableview.C
658     QtView.C
659     QURLDialog.C
660     QVSpaceDialog.C
661     QWrapDialog.C
662     QLToolbar.C
663     socket_callback.C
664     validators.C
665   ''')]
666
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]
669
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:])
674
675   qt3 = qt3env.StaticLibrary(
676     target = '$LOCALLIBPATH/qt3',
677     source = ["$BUILDDIR/common/frontends/qt3/%s" % x for x in Split('''
678       QDialogView.C
679       Alert_pimpl.C
680       Dialogs.C
681       FileDialog.C
682       LyXKeySymFactory.C
683       LyXScreenFactory.C
684       QLMenubar.C
685       qtTimeout.C
686       QAbout.C
687       QBibitem.C
688       QBibtex.C
689       QBox.C
690       QBranch.C
691       QChanges.C
692       QCharacter.C
693       QCitation.C
694       QDocument.C
695       QErrorList.C
696       QERT.C
697       QExternal.C
698       QFloat.C
699       QGraphics.C
700       QInclude.C
701       QIndex.C
702       QLImage.C
703       QLog.C
704       QViewSource.C
705       QLPainter.C
706       QLyXKeySym.C
707       QMath.C
708       QNote.C
709       QParagraph.C
710       QPrefs.C
711       QPrint.C
712       QRef.C
713       QSearch.C
714       QSendto.C
715       QShowFile.C
716       QSpellchecker.C
717       QTabular.C
718       QTabularCreate.C
719       QTexinfo.C
720       QThesaurus.C
721       QToc.C
722       QURL.C
723       QVSpace.C
724       QWorkArea.C
725       QWrap.C
726       Qt2BC.C
727       WorkAreaFactory.C
728       checkedwidgets.C
729       lyx_gui.C
730       lcolorcache.C
731       panelstack.C
732       qcoloritem.C
733       qfontexample.C
734       qfont_loader.C
735       qfont_metrics.C
736       qscreen.C
737       qt_helpers.C
738     ''')] +
739     qt3_moc_files + qt3_moced_files + qt3_uiced_cc_files
740   )
741   Alias('qt3', qt3)
742
743
744 if build_qt4:
745   print "Processing files in src/frontends/qt4..."
746
747   qt4env = env.Copy()
748   qt4env['QT_AUTOSCAN'] = 0
749
750   # local qt4 toolset from
751   # http://www.iua.upf.es/~dgarcia/Codders/sconstools.html
752   #
753   # NOTE: I have to patch qt4.py since it does not automatically
754   # process .C file!!! (add to cxx_suffixes )
755   #
756   qt4env.Tool('qt4', [env['SCONS_DIR']])
757   qt4env.EnableQt4Modules(env['QT_LIB'], debug = False)
758
759   qt4env.AppendUnique(CPPPATH = [
760     '$BUILDDIR/common',
761     '$BUILDDIR/common/images',
762     '$BUILDDIR/common/frontends',
763     '$BUILDDIR/common/frontends/qt4',
764     '$BUILDDIR/common/frontends/controllers' 
765     ]
766   )
767
768   # FIXME: replace by something from pkg_config
769   qt4env.Append(CCFLAGS = [
770     '-DHAVE_CONFIG_H',
771     '-DQT_CLEAN_NAMESPACE',
772     '-DQT_GENUINE_STR',
773     '-DQT_NO_STL',
774     '-DQT3_SUPPORT',
775     '-Winvalid-pch']
776   )
777
778   qt4_ui_files = ['$BUILDDIR/common/frontends/qt4/ui/%s' % x for x in Split('''
779     BiblioUi
780     BranchesUi
781     BulletsUi
782     TextLayoutUi
783     LanguageUi
784     LaTeXUi
785     MarginsUi
786     NumberingUi
787     MathsUi
788     PageLayoutUi
789     PreambleUi
790     QAboutUi
791     QAskForTextUi
792     QBibitemUi
793     QBibtexUi
794     QBibtexAddUi
795     QBoxUi
796     QBranchUi
797     QChangesUi
798     QCharacterUi
799     QCitationUi
800     QCitationFindUi
801     QDelimiterUi
802     QDocumentUi
803     QErrorListUi
804     QERTUi
805     QExternalUi
806     QFloatUi
807     QGraphicsUi
808     QIncludeUi
809     QIndexUi
810     QLogUi
811     QViewSourceUi
812     QMathUi
813     QMathMatrixUi
814     QNoteUi
815     QParagraphUi
816     QPrefAsciiUi
817     QPrefColorsUi
818     QPrefConvertersUi
819     QPrefCopiersUi
820     QPrefCygwinPathUi
821     QPrefDateUi
822     QPrefDisplayUi
823     QPrefFileformatsUi
824     QPrefIdentityUi
825     QPrefKeyboardUi
826     QPrefLanguageUi
827     QPrefLatexUi
828     QPrefPathsUi
829     QPrefPrinterUi
830     QPrefScreenFontsUi
831     QPrefsUi
832     QPrefSpellcheckerUi
833     QPrefUi
834     QPrintUi
835     QRefUi
836     QSearchUi
837     QSendtoUi
838     QShowFileUi
839     QSpellcheckerUi
840     QTabularCreateUi
841     QTabularUi
842     QTexinfoUi
843     QThesaurusUi
844     QTocUi
845     QURLUi
846     QVSpaceUi
847     QWrapUi
848   ''')]
849
850   qt4_moc_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
851     BulletsModule.C
852     emptytable.C
853     FileDialog_private.C
854     floatplacement.C
855     iconpalette.C
856     lengthcombo.C
857     panelstack.C
858     QAboutDialog.C
859     QBibitemDialog.C
860     QBibtexDialog.C
861     QBoxDialog.C
862     QBranchDialog.C
863     QBranches.C
864     QChangesDialog.C
865     QCharacterDialog.C
866     QCitationDialog.C
867     QCommandBuffer.C
868     QCommandEdit.C
869     QDelimiterDialog.C
870     QDocumentDialog.C
871     QErrorListDialog.C
872     QERTDialog.C
873     QExternalDialog.C
874     QFloatDialog.C
875     QGraphicsDialog.C
876     QIncludeDialog.C
877     QIndexDialog.C
878     QLAction.C
879     QLogDialog.C
880     QViewSourceDialog.C
881     QViewSource.C
882     QLMenubar.C
883     QLPopupMenu.C
884     QLPrintDialog.C
885     QMathDialog.C
886     QMathMatrixDialog.C
887     QNoteDialog.C
888     QParagraphDialog.C
889     QPrefsDialog.C
890     QRefDialog.C
891     QSearchDialog.C
892     QSendtoDialog.C
893     qsetborder.C
894     QShowFileDialog.C
895     QSpellcheckerDialog.C
896     QDialogView.C
897     QTabularCreateDialog.C
898     QTabularDialog.C
899     QTexinfoDialog.C
900     QThesaurusDialog.C
901     TocModel.C
902     QTocDialog.C
903     QtView.C
904     QURLDialog.C
905     QVSpaceDialog.C
906     QWorkArea.C
907     QWrapDialog.C
908     QLToolbar.C
909     socket_callback.C
910     validators.C
911   ''') ]
912
913   qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
914     QDialogView.C
915     Alert_pimpl.C
916     Dialogs.C
917     FileDialog.C
918     LyXKeySymFactory.C
919     LyXScreenFactory.C
920     QLMenubar.C
921     qtTimeout.C
922     QAbout.C
923     QBibitem.C
924     QBibtex.C
925     QBox.C
926     QBranch.C
927     QBranches.C
928     QChanges.C
929     QCharacter.C
930     QCitation.C
931     QDocument.C
932     QErrorList.C
933     QERT.C
934     QExternal.C
935     QFloat.C
936     QGraphics.C
937     QInclude.C
938     QIndex.C
939     QLAction.C
940     QLImage.C
941     QLog.C
942     QViewSource.C
943     QLPainter.C
944     QLyXKeySym.C
945     QMath.C
946     QNote.C
947     QParagraph.C
948     QPrefs.C
949     QPrint.C
950     QRef.C
951     QSearch.C
952     QSendto.C
953     QShowFile.C
954     QSpellchecker.C
955     QTabular.C
956     QTabularCreate.C
957     QTexinfo.C
958     QThesaurus.C
959     QToc.C
960     QURL.C
961     QVSpace.C
962     QWorkArea.C
963     QWrap.C
964     Qt2BC.C
965     WorkAreaFactory.C
966     checkedwidgets.C
967     lyx_gui.C
968     lcolorcache.C
969     panelstack.C
970     qfontexample.C
971     qfont_loader.C
972     qfont_metrics.C
973     qscreen.C
974     qt_helpers.C
975   ''')]
976
977   #
978   # Compile resources
979   #
980   resources = [qt4env.Uic4(x) for x in qt4_ui_files]
981
982   # 
983   # moc qt4_moc_files, the moced files are included in the original files
984   #
985   qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
986
987   qt4 = qt4env.StaticLibrary(
988     target = '$LOCALLIBPATH/qt4',
989     LIBS = qt4env['QT_LIB'],
990     source = qt4_source_files + qt4_moc_files
991   )
992   Alias('qt4', qt4)
993
994
995 if build_client:
996   #
997   # src/client
998   #
999   env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
1000
1001   print "Processing files in src/client..."
1002
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('''
1009         boost.C
1010         client.C
1011         debug.C
1012         gettext.C
1013         messages.C
1014       ''')]
1015     )
1016     Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
1017       client, [Copy('$TARGET', '$SOURCE')]))
1018   else:
1019     client = None
1020   Alias('client', client)
1021
1022
1023 if build_tex2lyx:
1024   #
1025   # tex2lyx
1026   #
1027   print "Processing files in src/tex2lyx..."
1028
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'])
1033
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')])
1038
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('''
1043       FloatList.C
1044       Floating.C
1045       counters.C
1046       lyxlayout.C
1047       lyxtextclass.C
1048       lyxlex.C
1049       lyxlex_pimpl.C
1050       boost.C
1051       context.C
1052       gettext.C
1053       lengthcommon.C
1054       lyxfont.C
1055       texparser.C
1056       tex2lyx.C
1057       preamble.C
1058       math.C
1059       table.C
1060       text.C
1061     ''')]
1062   )
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)
1066
1067
1068 if build_lyxbase:
1069   #
1070   # src/
1071   #
1072   print "Processing files in src..."
1073
1074   env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1075
1076   lyx_source_pre = Split('''
1077     Bidi.C
1078     BufferView.C
1079     BufferView_pimpl.C
1080     Bullet.C
1081     BranchList.C
1082     Chktex.C
1083     Color.C
1084     CutAndPaste.C
1085     DepTable.C
1086     FloatList.C
1087     Floating.C
1088     FontIterator.C
1089     FuncStatus.C
1090     InsetList.C
1091     LColor.C
1092     LaTeX.C
1093     LaTeXFeatures.C
1094     LyXAction.C
1095     MenuBackend.C
1096     ParagraphParameters.C
1097     Spacing.C
1098     ToolbarBackend.C
1099     author.C
1100     boost.C
1101     buffer.C
1102     buffer_funcs.C
1103     bufferlist.C
1104     bufferparams.C
1105     bufferview_funcs.C
1106     changes.C
1107     chset.C
1108     converter.C
1109     counters.C
1110     coordcache.C
1111     cursor.C
1112     cursor_slice.C
1113     debug.C
1114     dociterator.C
1115     encoding.C
1116     errorlist.C
1117     exporter.C
1118     gettext.C
1119     factory.C
1120     format.C
1121     funcrequest.C
1122     graph.C
1123     importer.C
1124     intl.C
1125     insetiterator.C
1126     kbmap.C
1127     kbsequence.C
1128     language.C
1129     session.C
1130     lengthcommon.C
1131     lyx_cb.C
1132     lyx_main.C
1133     lyx_sty.C
1134     lyxfont.C
1135     lyxfind.C
1136     lyxfunc.C
1137     lyxgluelength.C
1138     lyxlayout.C
1139     lyxlength.C
1140     lyxlex.C
1141     lyxlex_pimpl.C
1142     lyxrc.C
1143     lyxrow.C
1144     lyxrow_funcs.C
1145     lyxserver.C
1146     lyxsocket.C
1147     lyxtextclass.C
1148     lyxtextclasslist.C
1149     lyxvc.C
1150     messages.C
1151     metricsinfo.C
1152     mover.C
1153     output.C
1154     outputparams.C
1155     output_docbook.C
1156     output_latex.C
1157     output_linuxdoc.C
1158     output_plaintext.C
1159     paragraph.C
1160     paragraph_funcs.C
1161     paragraph_pimpl.C
1162     pariterator.C
1163     rowpainter.C
1164     sgml.C
1165     tex-accent.C
1166     tex-strings.C
1167     texrow.C
1168     text.C
1169     text2.C
1170     text3.C
1171     TocBackend.C
1172     toc.C
1173     trans.C
1174     trans_mgr.C
1175     undo.C
1176     vc-backend.C
1177     version.C
1178     vspace.C
1179     main.C
1180   ''')
1181
1182   lyx_source_post = Split('''
1183     tabular.C
1184     dimension.C
1185     PrinterParams.C
1186     box.C
1187     Thesaurus.C
1188     SpellBase.C
1189   ''')
1190
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')
1197
1198   lyxbase_pre = env.StaticLibrary(
1199     target = '$LOCALLIBPATH/lyxbase_pre',
1200     source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1201   )
1202   lyxbase_post = env.StaticLibrary(
1203     target = '$LOCALLIBPATH/lyxbase_post',
1204     source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1205   )
1206   Alias('lyxbase', lyxbase_pre)
1207   Alias('lyxbase', lyxbase_post)
1208
1209
1210 if build_lyx:
1211   #
1212   # Build lyx with given frontend
1213   #
1214   lyx = env.Program(
1215     target = '$BUILDDIR/$frontend/lyx',
1216     source = [],
1217     LIBS = [
1218       'lyxbase_pre',
1219       'mathed',
1220       'insets',
1221       'frontends',
1222       env['frontend'],
1223       'controllers',
1224       'graphics',
1225       'supports',
1226       'lyxbase_post',
1227       ] +
1228       env['BOOST_LIBRARIES'] +
1229       env['EXTRA_LIBS'] +
1230       env['INTL_LIBS'] + 
1231       env['SOCKET_LIBS'] +
1232       env['SYSTEM_LIBS']
1233   )
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')]))
1238   Alias('lyx', lyx)
1239
1240
1241 if build_po:
1242   #
1243   # po/
1244   #
1245   print 'Processing files in po...'
1246
1247   import glob
1248   # handle po files
1249   #
1250   # files to translate
1251   transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1252   # possibly *only* handle these languages
1253   languages = None
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'
1259   else:
1260     # create a builder
1261     env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1262     #
1263     gmo_files = []
1264     for f in transfiles:
1265       # get filename
1266       fname = os.path.split(f)[1]
1267       # country code
1268       country = fname.split('.')[0]
1269       #
1270       if not languages or country in languages:
1271         gmo_files.extend(env.Transfiles(f))
1272
1273
1274 if 'install' in targets:
1275   # create the directory if needed
1276   if not os.path.isdir(env['DEST_DIR']):
1277     try:
1278       os.makedirs(env['DEST_DIR'])
1279     except:
1280       pass
1281     if not os.path.isdir(env['DEST_DIR']):
1282       print 'Can not create directory', env['DEST_DIR']
1283       Exit(3)
1284   #
1285   import glob
1286   #
1287   # do not install these files
1288   exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile', 
1289     'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1290
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)
1296     # install file
1297     env.Install(dest, files)
1298     # install directory
1299     ins_dir = [dest]
1300     for dir in dirs:
1301       ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1302         glob.glob(os.path.join(dir, '*'))) )
1303     return ins_dir
1304   #
1305   # executables (some of them may be none)
1306   #
1307   if env['ADD_SUFFIX_TO_EXECUTABLES']:
1308     program_suffix = env['PROGRAM_SUFFIX']
1309   else:
1310     program_suffix = ''
1311   #
1312   # install lyx
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)
1322   #
1323   # install tex2lyx
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)
1328   #
1329   # install lyxclient, may not exist
1330   if client != None:
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)
1335   #
1336   # share/lyx
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']]
1342   )
1343   env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py', 
1344     '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1345   Alias('install', dirs)
1346   # man
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']])
1355   # locale files?
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)
1362
1363
1364 Default('lyx')
1365 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])