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