]> git.lyx.org Git - lyx.git/blobdiff - development/scons/SConstruct
Scons: check minor version number (>=0.96.92)
[lyx.git] / development / scons / SConstruct
index 11664f17900f4ac1d22fc8ddc9e595d7ed6808c3..465f9cb9fe88b40336a422b1dd4acf7e585eb206 100644 (file)
@@ -24,8 +24,14 @@ import scons_utils as utils
 
 # scons asks for 1.5.2, lyx requires 2.3
 EnsurePythonVersion(2, 3)
-# Please use at least 0.96.91 (not 0.96.1)
+# Please use at least 0.96.92 (not 0.96.1)
 EnsureSConsVersion(0, 96)
+# also check for minor version number for scons 0.96
+from SCons import __version__
+version = map(int, __version__.split('.'))
+if version[0] == 0 and version[1] == 96 and version[2] < 92:
+    print "Scons >= 0.96.92 is required."
+    Exit(1)
 
 # determine where I am ...
 #
@@ -122,7 +128,7 @@ opts = Options(['config.py'])
 opts.AddOptions(
     # frontend
     EnumOption('frontend', 'Main GUI', default_frontend,
-        allowed_values = ('xform', 'qt2', 'qt3', 'qt4', 'gtk') ),
+        allowed_values = ('qt2', 'qt3', 'qt4', 'gtk') ),
     # debug or release build
     EnumOption('mode', 'Building method', default_build_mode,
         allowed_values = ('debug', 'release') ),
@@ -187,7 +193,10 @@ opts.AddOptions(
     #
     PathOption('extra_lib_path1', 'Extra library path', None),
     # rebuild only specifed, comma separated targets
-    ('rebuild', 'rebuild only specifed, comma separated targets', None),
+    ('rebuild', '''rebuild only specifed, comma separated targets.
+        yes or all (default): rebuild everything
+        no or none: rebuild nothing (usually used for installation)
+        comp1,comp2,...: rebuild specified targets''', None),
     # can be set to a non-existing directory
     ('prefix', 'install architecture-independent files in PREFIX', default_prefix),
     # build directory, will use $mode if not set
@@ -220,6 +229,9 @@ opts.AddOptions(
     ('LINKFLAGS', 'replace default $LINKFLAGS', None),
 )
 
+# allowed options
+all_options = [x.key for x in opts.options]
+
 # copied from SCons/Options/BoolOption.py
 # We need to use them before a boolean ARGUMENTS option is available
 # in env as bool.
@@ -268,10 +280,15 @@ if (not ARGUMENTS.has_key('load_option') or \
                 print "  ** fast_start is disabled because of the change of option", arg
                 print
                 fast_start = False
-    # and we do not cache some options
-    for arg in ['fast_start', 'load_option']:
+    # and we do not cache some options (dest_dir is obsolete)
+    for arg in ['fast_start', 'load_option', 'dest_dir']:
         if opt_cache.has_key(arg):
             opt_cache.pop(arg)
+    # remove obsolete cached keys (well, SConstruct is evolving. :-)
+    for arg in opt_cache.keys():
+        if arg not in all_options:
+            print 'Option %s is obsolete, do not load it' % arg
+            opt_cache.pop(arg)
     # now, if load_option=opt1,opt2 or -opt1,opt2
     if ARGUMENTS.has_key('load_option') and \
         ARGUMENTS['load_option'] not in true_strings + false_strings:
@@ -293,6 +310,16 @@ if (not ARGUMENTS.has_key('load_option') or \
             print "Restoring cached option  %s=%s" % (key, ARGUMENTS[key])
     print
 
+# check if there is unused (or misspelled) argument
+for arg in ARGUMENTS.keys():
+    if arg not in all_options:
+        import textwrap
+        print "Unknown option '%s'... exiting." % arg
+        print
+        print "Available options are (check 'scons -help' for details):"
+        print '    ' + '\n    '.join(textwrap.wrap(',  '.join(all_options)))
+        Exit(1)
+
 # save arguments
 env_cache['arg_cache'] = ARGUMENTS
 
@@ -366,10 +393,6 @@ env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
 #       PACKAGE_VERSION
 #     src/version.C.in
 #       PACKAGE_VERSION, VERSION_INFO
-#     src/frontends/xforms/lyx_xpm.h.in
-#       XPM_H_LOCATION
-#     src/frontends/xforms/lyx_forms.h.in
-#       FORMS_H_LOCATION
 
 # full path name is used to build msvs project files
 # and to replace TOP_SRCDIR in package.C
@@ -1451,6 +1474,12 @@ print "Building all targets recursively"
 
 if env.has_key('rebuild'):
     rebuild_targets = env['rebuild'].split(',')
+    if 'none' in rebuild_targets or 'no' in rebuild_targets:
+        rebuild_targets = []
+    elif 'all' in rebuild_targets or 'yes' in rebuild_targets:
+        # None: let scons decide which components to build
+        # Forcing all components to be rebuilt is in theory not necessary
+        rebuild_targets = None    
 else:
     rebuild_targets = None
 
@@ -1458,6 +1487,10 @@ def libExists(libname):
     ''' Check whether or not lib $LOCALLIBNAME/libname already exists'''
     return os.path.isfile(File(env.subst('$LOCALLIBPATH/${LIBPREFIX}%s$LIBSUFFIX'%libname)).abspath)
 
+def appExists(apppath, appname):
+    ''' Check whether or not application already exists'''
+    return os.path.isfile(File(env.subst('$BUILDDIR/common/%s/${PROGPREFIX}%s$PROGSUFFIX' % (apppath, appname))).abspath)
+
 targets = BUILD_TARGETS
 # msvc need to pass full target name, so I have to look for path/lyx etc
 build_lyx = targets == [] or True in ['lyx' in x for x in targets] \
@@ -1483,8 +1516,8 @@ build_msvs_projects = use_vc and 'msvs_projects' in targets
 
 
 # now, if rebuild_targets is specified, do not rebuild some targets
-rebuild_targets = rebuild_targets
-if rebuild_targets:
+if rebuild_targets is not None:
+    #
     def ifBuildLib(name, libname, old_value):
         # explicitly asked to rebuild
         if name in rebuild_targets:
@@ -1507,6 +1540,19 @@ if rebuild_targets:
     build_qt2 = ifBuildLib('qt2', 'qt2', build_qt2)
     build_qt3 = ifBuildLib('qt3', 'qt3', build_qt3)
     build_qt4 = ifBuildLib('qt4', 'qt4', build_qt4)
+    #
+    def ifBuildApp(name, appname, old_value):
+        # explicitly asked to rebuild
+        if name in rebuild_targets:
+            return True
+        # else if not rebuild, and if the library already exists
+        elif appExists(name, appname):
+            return False
+        # do not change the original value
+        else:
+            return old_value
+    build_tex2lyx = ifBuildApp('tex2lyx', 'tex2lyx', build_tex2lyx)
+    build_client = ifBuildApp('client', 'lyxclient', build_client)
 
 # sync frontend and frontend (maybe build qt4 with frontend=qt3)
 if build_qt2:
@@ -1914,6 +1960,7 @@ if build_qt4:
         '-DQT_GENUINE_STR',
         '-DQT_NO_STL',
         '-DQT3_SUPPORT',
+        '-DQT_NO_KEYWORDS',
         ]
     )
 
@@ -2023,6 +2070,12 @@ if build_client:
     else:
         client = None
     Alias('client', client)
+else:
+    if env['HAVE_FCNTL']:
+        # define client even if lyxclient is not built with rebuild=no
+        client = [env.subst('$BUILDDIR/common/client/${PROGPREFIX}lyxclient$PROGSUFFIX')]
+    else:
+        client = None
 
 
 if build_tex2lyx:
@@ -2052,6 +2105,9 @@ if build_tex2lyx:
     Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
         tex2lyx, [Copy('$TARGET', '$SOURCE')]))
     Alias('tex2lyx', tex2lyx)
+else:
+    # define tex2lyx even if tex2lyx is not built with rebuild=no
+    tex2lyx = [env.subst('$BUILDDIR/common/tex2lyx/${PROGPREFIX}tex2lyx$PROGSUFFIX')]
 
 
 if build_lyxbase:
@@ -2124,6 +2180,9 @@ if build_lyx:
     Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
         [Copy('$TARGET', '$SOURCE')]))
     Alias('lyx', lyx)
+else:
+    # define lyx even if lyx is not built with rebuild=no
+    lyx = [env.subst('$BUILDDIR/$frontend/${PROGPREFIX}lyx$PROGSUFFIX')]
 
 
 if build_msvs_projects:
@@ -2148,9 +2207,9 @@ if build_msvs_projects:
         else:
             res = []
         if rebuildTargetOnly:
-            cmds = 'faststart=yes rebuild='+target
+            cmds = 'fast_start=yes rebuild='+target
         else:
-            cmds = 'faststart=yes'
+            cmds = 'fast_start=yes'
         if type(dir) == type([]):
             src = []
             inc = []
@@ -2244,13 +2303,13 @@ if build_po:
     if env.has_key('languages'):
         languages = env.make_list(env['lanauges'])
     # use defulat msgfmt
+    gmo_files = []
     if not env['MSGFMT']:
         print 'msgfmt does not exist. Can not process po files'
     else:
         # create a builder
         env['BUILDERS']['Transfiles'] = Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po')
         #
-        gmo_files = []
         for f in transfiles:
             # get filename
             fname = os.path.split(f)[1]