]> git.lyx.org Git - lyx.git/blob - development/scons/SConscript
Scons: initial msvc support, and separate fast_start and load_option options.
[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     panelstack.C
860     QAboutDialog.C
861     QBibitemDialog.C
862     QBibtexDialog.C
863     QBoxDialog.C
864     QBranchDialog.C
865     QBranches.C
866     QChangesDialog.C
867     QCharacterDialog.C
868     QCitationDialog.C
869     QCommandBuffer.C
870     QCommandEdit.C
871     QDelimiterDialog.C
872     QDocumentDialog.C
873     QErrorListDialog.C
874     QERTDialog.C
875     QExternalDialog.C
876     QFloatDialog.C
877     QGraphicsDialog.C
878     QIncludeDialog.C
879     QIndexDialog.C
880     QLAction.C
881     QLogDialog.C
882     QViewSourceDialog.C
883     QViewSource.C
884     QLMenubar.C
885     QLPopupMenu.C
886     QLPrintDialog.C
887     QMathDialog.C
888     QMathMatrixDialog.C
889     QNoteDialog.C
890     QParagraphDialog.C
891     QPrefsDialog.C
892     QRefDialog.C
893     QSearchDialog.C
894     QSendtoDialog.C
895     qsetborder.C
896     QShowFileDialog.C
897     QSpellcheckerDialog.C
898     QDialogView.C
899     QTabularCreateDialog.C
900     QTabularDialog.C
901     QTexinfoDialog.C
902     QThesaurusDialog.C
903     TocModel.C
904     QTocDialog.C
905     QtView.C
906     QURLDialog.C
907     QVSpaceDialog.C
908     QWorkArea.C
909     QWrapDialog.C
910     QLToolbar.C
911     socket_callback.C
912     validators.C
913   ''') ]
914
915   qt4_source_files = ["$BUILDDIR/common/frontends/qt4/%s" % x for x in Split('''
916     QDialogView.C
917     Alert_pimpl.C
918     Dialogs.C
919     FileDialog.C
920     LyXKeySymFactory.C
921     LyXScreenFactory.C
922     QLMenubar.C
923     qtTimeout.C
924     QAbout.C
925     QBibitem.C
926     QBibtex.C
927     QBox.C
928     QBranch.C
929     QBranches.C
930     QChanges.C
931     QCharacter.C
932     QCitation.C
933     QDocument.C
934     QErrorList.C
935     QERT.C
936     QExternal.C
937     QFloat.C
938     QGraphics.C
939     QInclude.C
940     QIndex.C
941     QLAction.C
942     QLImage.C
943     QLog.C
944     QViewSource.C
945     QLPainter.C
946     QLyXKeySym.C
947     QMath.C
948     QNote.C
949     QParagraph.C
950     QPrefs.C
951     QPrint.C
952     QRef.C
953     QSearch.C
954     QSendto.C
955     QShowFile.C
956     QSpellchecker.C
957     QTabular.C
958     QTabularCreate.C
959     QTexinfo.C
960     QThesaurus.C
961     QToc.C
962     QURL.C
963     QVSpace.C
964     QWorkArea.C
965     QWrap.C
966     Qt2BC.C
967     WorkAreaFactory.C
968     checkedwidgets.C
969     lyx_gui.C
970     lcolorcache.C
971     panelstack.C
972     qfontexample.C
973     qfont_loader.C
974     qfont_metrics.C
975     qscreen.C
976     qt_helpers.C
977   ''')]
978
979   #
980   # Compile resources
981   #
982   resources = [qt4env.Uic4(x) for x in qt4_ui_files]
983
984   # 
985   # moc qt4_moc_files, the moced files are included in the original files
986   #
987   qt4_moced_files = [qt4env.Moc4(x.replace('.C', '_moc.cpp'), x.replace('.C', '.h')) for x in qt4_moc_files]
988
989   qt4 = qt4env.StaticLibrary(
990     target = '$LOCALLIBPATH/qt4',
991     LIBS = qt4env['QT_LIB'],
992     source = qt4_source_files + qt4_moc_files
993   )
994   Alias('qt4', qt4)
995
996
997 if build_client:
998   #
999   # src/client
1000   #
1001   env.BuildDir('$BUILDDIR/common', '$TOP_SRC_DIR/src', duplicate = 0)
1002
1003   print "Processing files in src/client..."
1004
1005   if env['HAVE_FCNTL']:
1006     client = env.Program(
1007       target = '$BUILDDIR/common/client/lyxclient',
1008       LIBS = ['supports'] + env['INTL_LIBS'] + env['SYSTEM_LIBS'] + 
1009         env['SOCKET_LIBS'] + env['BOOST_LIBRARIES'],
1010       source = ["$BUILDDIR/common/client/%s" % x for x in Split('''
1011         boost.C
1012         client.C
1013         debug.C
1014         gettext.C
1015         messages.C
1016       ''')]
1017     )
1018     Alias('client', env.Command(os.path.join('$BUILDDIR', os.path.split(str(client[0]))[1]),
1019       client, [Copy('$TARGET', '$SOURCE')]))
1020   else:
1021     client = None
1022   Alias('client', client)
1023
1024
1025 if build_tex2lyx:
1026   #
1027   # tex2lyx
1028   #
1029   print "Processing files in src/tex2lyx..."
1030
1031   tex2lyx_env = env.Copy()
1032   # the order is important here.
1033   tex2lyx_env.Prepend(CPPPATH = ['$BUILDDIR/common/tex2lyx'])
1034   tex2lyx_env.AppendUnique(LIBPATH = ['#$LOCALLIBPATH'])
1035
1036   for file in ['FloatList.C', 'Floating.C', 'counters.C', 'lyxlayout.h', 'lyxlayout.C', 
1037     'lyxtextclass.h', 'lyxtextclass.C', 'lyxlex.C', 'lyxlex_pimpl.C']:
1038     env.Command('$BUILDDIR/common/tex2lyx/'+file, '$TOP_SRC_DIR/src/'+file,
1039       [Copy('$TARGET', '$SOURCE')])
1040
1041   tex2lyx = tex2lyx_env.Program(
1042     target = '$BUILDDIR/common/tex2lyx/tex2lyx',
1043     LIBS = ['supports'] + env['BOOST_LIBRARIES'] + env['SYSTEM_LIBS'],
1044     source = ["$BUILDDIR/common/tex2lyx/%s" % x for x in Split('''
1045       FloatList.C
1046       Floating.C
1047       counters.C
1048       lyxlayout.C
1049       lyxtextclass.C
1050       lyxlex.C
1051       lyxlex_pimpl.C
1052       boost.C
1053       context.C
1054       gettext.C
1055       lengthcommon.C
1056       lyxfont.C
1057       texparser.C
1058       tex2lyx.C
1059       preamble.C
1060       math.C
1061       table.C
1062       text.C
1063     ''')]
1064   )
1065   Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
1066     tex2lyx, [Copy('$TARGET', '$SOURCE')]))
1067   Alias('tex2lyx', tex2lyx)
1068
1069
1070 if build_lyxbase:
1071   #
1072   # src/
1073   #
1074   print "Processing files in src..."
1075
1076   env.substFile('$BUILDDIR/common/version.C', '$TOP_SRC_DIR/src/version.C.in')
1077
1078   lyx_source_pre = Split('''
1079     Bidi.C
1080     BufferView.C
1081     BufferView_pimpl.C
1082     Bullet.C
1083     BranchList.C
1084     Chktex.C
1085     Color.C
1086     CutAndPaste.C
1087     DepTable.C
1088     FloatList.C
1089     Floating.C
1090     FontIterator.C
1091     FuncStatus.C
1092     InsetList.C
1093     LColor.C
1094     LaTeX.C
1095     LaTeXFeatures.C
1096     LyXAction.C
1097     MenuBackend.C
1098     ParagraphParameters.C
1099     Spacing.C
1100     ToolbarBackend.C
1101     author.C
1102     boost.C
1103     buffer.C
1104     buffer_funcs.C
1105     bufferlist.C
1106     bufferparams.C
1107     bufferview_funcs.C
1108     changes.C
1109     chset.C
1110     converter.C
1111     counters.C
1112     coordcache.C
1113     cursor.C
1114     cursor_slice.C
1115     debug.C
1116     dociterator.C
1117     encoding.C
1118     errorlist.C
1119     exporter.C
1120     gettext.C
1121     factory.C
1122     format.C
1123     funcrequest.C
1124     graph.C
1125     importer.C
1126     intl.C
1127     insetiterator.C
1128     kbmap.C
1129     kbsequence.C
1130     language.C
1131     session.C
1132     lengthcommon.C
1133     lyx_cb.C
1134     lyx_main.C
1135     lyx_sty.C
1136     lyxfont.C
1137     lyxfind.C
1138     lyxfunc.C
1139     lyxgluelength.C
1140     lyxlayout.C
1141     lyxlength.C
1142     lyxlex.C
1143     lyxlex_pimpl.C
1144     lyxrc.C
1145     lyxrow.C
1146     lyxrow_funcs.C
1147     lyxserver.C
1148     lyxsocket.C
1149     lyxtextclass.C
1150     lyxtextclasslist.C
1151     lyxvc.C
1152     messages.C
1153     metricsinfo.C
1154     mover.C
1155     output.C
1156     outputparams.C
1157     output_docbook.C
1158     output_latex.C
1159     output_linuxdoc.C
1160     output_plaintext.C
1161     paragraph.C
1162     paragraph_funcs.C
1163     paragraph_pimpl.C
1164     pariterator.C
1165     rowpainter.C
1166     sgml.C
1167     tex-accent.C
1168     tex-strings.C
1169     texrow.C
1170     text.C
1171     text2.C
1172     text3.C
1173     TocBackend.C
1174     toc.C
1175     trans.C
1176     trans_mgr.C
1177     undo.C
1178     vc-backend.C
1179     version.C
1180     vspace.C
1181   ''')
1182
1183   # temporary fix for MSVC, will remove later.
1184   if not env['USE_VC']:
1185     lyx_source_pre.append('main.C')
1186
1187   lyx_source_post = Split('''
1188     tabular.C
1189     dimension.C
1190     PrinterParams.C
1191     box.C
1192     Thesaurus.C
1193     SpellBase.C
1194   ''')
1195
1196   if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
1197     lyx_source_post.append('aspell.C')
1198   elif env.has_key('USE_PSPELL') and env['USE_PSPELL']:
1199     lyx_source_post.append('pspell.C')
1200   elif env.has_key('USE_ISPELL') and env['USE_ISPELL']:
1201     lyx_source_post.append('ispell.C')
1202
1203   lyxbase_pre = env.StaticLibrary(
1204     target = '$LOCALLIBPATH/lyxbase_pre',
1205     source = ["$BUILDDIR/common/%s" % x for x in lyx_source_pre]
1206   )
1207   lyxbase_post = env.StaticLibrary(
1208     target = '$LOCALLIBPATH/lyxbase_post',
1209     source = ["$BUILDDIR/common/%s" % x for x in lyx_source_post]
1210   )
1211   Alias('lyxbase', lyxbase_pre)
1212   Alias('lyxbase', lyxbase_post)
1213
1214
1215 if build_lyx:
1216   #
1217   # Build lyx with given frontend
1218   #
1219   # temporary fix for MSVC, will remove later.
1220   if env['USE_VC']:
1221     lyx_source = ['$BUILDDIR/common/main.C']
1222   else:
1223     lyx_source = []
1224   lyx = env.Program(
1225     target = '$BUILDDIR/$frontend/lyx',
1226     source = lyx_source,
1227     LIBS = [
1228       'lyxbase_pre',
1229       'mathed',
1230       'insets',
1231       'frontends',
1232       env['frontend'],
1233       'controllers',
1234       'graphics',
1235       'supports',
1236       'lyxbase_post',
1237       ] +
1238       env['BOOST_LIBRARIES'] +
1239       env['EXTRA_LIBS'] +
1240       env['INTL_LIBS'] + 
1241       env['SOCKET_LIBS'] +
1242       env['SYSTEM_LIBS']
1243   )
1244   # [/path/to/lyx.ext] => lyx-qt3.ext
1245   target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s' % frontend)
1246   Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
1247     [Copy('$TARGET', '$SOURCE')]))
1248   Alias('lyx', lyx)
1249
1250
1251 if build_po:
1252   #
1253   # po/
1254   #
1255   print 'Processing files in po...'
1256
1257   import glob
1258   # handle po files
1259   #
1260   # files to translate
1261   transfiles = glob.glob(os.path.join(env.subst('$TOP_SRC_DIR'), 'po', '*.po'))
1262   # possibly *only* handle these languages
1263   languages = None
1264   if env.has_key('languages'):
1265     languages = env.make_list(env['lanauges'])
1266   # use defulat msgfmt
1267   if not env['MSGFMT']:
1268     print 'msgfmt does not exist. Can not process po files'
1269   else:
1270     # create a builder
1271     env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
1272     #
1273     gmo_files = []
1274     for f in transfiles:
1275       # get filename
1276       fname = os.path.split(f)[1]
1277       # country code
1278       country = fname.split('.')[0]
1279       #
1280       if not languages or country in languages:
1281         gmo_files.extend(env.Transfiles(f))
1282
1283
1284 if 'install' in targets:
1285   # create the directory if needed
1286   if not os.path.isdir(env['DEST_DIR']):
1287     try:
1288       os.makedirs(env['DEST_DIR'])
1289     except:
1290       pass
1291     if not os.path.isdir(env['DEST_DIR']):
1292       print 'Can not create directory', env['DEST_DIR']
1293       Exit(3)
1294   #
1295   import glob
1296   #
1297   # do not install these files
1298   exclude_list = ['Makefile.am', 'Makefile.in', 'Makefile', 
1299     'lyx2lyx_version.py', 'lyx2lyx_version.py.in']
1300
1301   def install(dest, src):
1302     ''' recusive installation of src to dest '''
1303     # separate file and directory
1304     files = filter(lambda x: os.path.isfile(x) and not os.path.split(x)[1] in exclude_list, src)
1305     dirs = filter(os.path.isdir, src)
1306     # install file
1307     env.Install(dest, files)
1308     # install directory
1309     ins_dir = [dest]
1310     for dir in dirs:
1311       ins_dir.extend(install(os.path.join(dest, os.path.basename(dir)),
1312         glob.glob(os.path.join(dir, '*'))) )
1313     return ins_dir
1314   #
1315   # executables (some of them may be none)
1316   #
1317   if env['ADD_SUFFIX_TO_EXECUTABLES']:
1318     program_suffix = env['PROGRAM_SUFFIX']
1319   else:
1320     program_suffix = ''
1321   #
1322   # install lyx
1323   target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % program_suffix)
1324   target = os.path.join(env['BIN_DEST_DIR'], target_name)
1325   env.InstallAs(target, lyx)
1326   Alias('install', target)
1327   # install lyx as lyx-qt3
1328   target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, program_suffix))
1329   target = os.path.join(env['BIN_DEST_DIR'], target_name)
1330   env.InstallAs(target, lyx)
1331   Alias('install', target)
1332   #
1333   # install tex2lyx
1334   target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % program_suffix)
1335   target = os.path.join(env['BIN_DEST_DIR'], target_name)
1336   env.InstallAs(target, tex2lyx)
1337   Alias('install', target)
1338   #
1339   # install lyxclient, may not exist
1340   if client != None:
1341     target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % program_suffix)
1342     target = os.path.join(env['BIN_DEST_DIR'], target_name)
1343     env.InstallAs(target, client)
1344     Alias('install', target)
1345   #
1346   # share/lyx
1347   dirs = install(env['SHARE_DEST_DIR'],
1348     [env.subst('$TOP_SRC_DIR/lib/') + file for file in ['configure.py', 'encodings',
1349      'chkconfig.ltx', 'CREDITS', 'external_templates', 'symbols', 'languages',
1350      'lyxrc.example', 'syntax.default', 'bind', 'images', 'layouts', 'scripts', 
1351      'templates', 'examples', 'kbd', 'lyx2lyx', 'tex', 'clipart', 'doc',  'ui']]
1352   )
1353   env.substFile('$SHARE_DEST_DIR/lyx2lyx/lyx2lyx_version.py', 
1354     '$TOP_SRC_DIR/lib/lyx2lyx/lyx2lyx_version.py.in')
1355   Alias('install', dirs)
1356   # man
1357   env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyx.1'),
1358     env.subst('$TOP_SRC_DIR/lyx.man'))
1359   env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'tex2lyx.1'),
1360     env.subst('$TOP_SRC_DIR/src/tex2lyx/tex2lyx.man'))
1361   env.InstallAs(os.path.join(env['MAN_DEST_DIR'], 'lyxclient.1'),
1362     env.subst('$TOP_SRC_DIR/src/client/lyxclient.man'))
1363   Alias('install', [os.path.join(env['MAN_DEST_DIR'], x) for
1364     x in ['lyx.1', 'tex2lyx.1', 'lyxclient.1']])
1365   # locale files?
1366   # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
1367   for gmo in gmo_files:
1368     lan = os.path.split(str(gmo))[1].split('.')[0]
1369     dest_file = os.path.join(env['LOCALE_DEST_DIR'], lan, 'LC_MESSAGES', 'lyx' + env['PROGRAM_SUFFIX'] + '.mo')
1370     env.InstallAs(dest_file, gmo)
1371     Alias('install', dest_file)
1372
1373
1374 Default('lyx')
1375 Alias('all', ['lyx', 'client', 'tex2lyx', 'po'])