]> git.lyx.org Git - lyx.git/blobdiff - development/scons/SConstruct
compile fix
[lyx.git] / development / scons / SConstruct
index b1cde5b479fb078650b9941479d6ad27d2c34a74..2e2fab77c91632cb3c671f7e5f11cc44d2bd3631 100644 (file)
@@ -12,7 +12,7 @@
 # to INSTALL.scons for detailed instructions.
 #
 
-import os, sys, copy, cPickle, glob
+import os, sys, copy, cPickle, glob, time
 
 # scons_utils.py defines a few utility function
 sys.path.append('config')
@@ -54,6 +54,7 @@ else:
 # some global settings
 #
 package_version = '1.5.0svn'
+package_cygwin_version = '1.5.0svn-1'
 boost_version = '1_33_1'
 
 devel_version = True
@@ -383,13 +384,14 @@ env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
 #     lib/lyx2lyx/lyx2lyx_version.py.in
 #       PACKAGE_VERSION
 #     src/version.C.in
-#       PACKAGE_VERSION, VERSION_INFO
+#       PACKAGE_VERSION, LYX_DATE, VERSION_INFO
 
 # full path name is used to build msvs project files
 # and to replace TOP_SRCDIR in package.C
 env['TOP_SRCDIR'] = Dir(top_src_dir).abspath
 # needed by src/version.C.in => src/version.C
 env['PACKAGE_VERSION'] = package_version
+env['LYX_DATE'] = time.asctime()
 
 # determine share_dir etc
 packaging_method = env.get('packaging')
@@ -397,14 +399,14 @@ if packaging_method == 'windows':
     share_dir = 'Resources'
     man_dir = 'Resources/man/man1'
     locale_dir = 'Resources/locale'
-    default_prefix = 'c:/program files/lyx'
 else:
     share_dir = 'share/lyx'
-    man_dir = 'man/man1'
     locale_dir = 'share/locale'
-    default_prefix = '/usr/local/'
+    if platform_name == 'cygwin':
+        man_dir = 'share/man/man1'
+    else:
+        man_dir = 'man/man1'
 
-# install to default_prefix by default
 # program suffix: can be yes, or a string
 if env.has_key('version_suffix'):
     if env['version_suffix'] in true_strings:
@@ -464,7 +466,7 @@ if use_vc:
     #   in the current code page (number)
     # C4996: foo was decleared deprecated
     CCFLAGS_required.extend(['/TP', '/EHsc'])
-    CCFLAGS_default.extend(['/wd4819', '/wd4996', '/nologo'])
+    CCFLAGS_default.extend(['/wd4819', '/wd4996', '/nologo', '/MD'])
 else:
     if env.has_key('CXX') and env['CXX']:
         env['CC'] = env.subst('$CXX')
@@ -523,25 +525,34 @@ def setEnvVariable(env, name, required = None, default = None, split = True):
                 environment variables
             split: whether or not split obtained variable like '-02 -g'
     '''
-    # first try command line argument (override environment settings)
+    # 1. ARGUMENTS is already set to env[name], override default.
     if ARGUMENTS.has_key(name):
-        default = ARGUMENTS[name]
-        if split:
-            default = default.split()
+        default = None
     # then use environment default
     elif os.environ.has_key(name):
-        print "Acquiring varaible %s from system environment: %s" % (name, os.environ[name])
+        print "Acquiring variable %s from system environment: %s" % (name, os.environ[name])
         default = os.environ[name]
         if split:
             default = default.split()
-    # set variable
-    if required is not None:
-        env[name] = required
-    if default is not None:
-        if env.has_key(name) and env[name] != default:
-            env[name] += default
-        else:
-            env[name] = default
+    # the real value should be env[name] + default + required
+    if split:
+        value = []
+        if env.has_key(name):
+            value = str(env[name]).split()
+        if required is not None:
+            value += required
+        if default is not None:
+            value += default
+    else:
+        value = ""
+        if env.has_key(name):
+            value = str(env[name])
+        if required is not None:
+            value += " " + required
+        if default is not None:
+            value += " " + default
+    env[name] = value
+    # print name, env[name]
 
 setEnvVariable(env, 'DESTDIR', split=False)
 setEnvVariable(env, 'CC')
@@ -642,6 +653,7 @@ conf = Configure(env,
         'CheckCXXGlobalCstd' : utils.checkCXXGlobalCstd,
         'CheckLC_MESSAGES' : utils.checkLC_MESSAGES,
         'CheckIconvConst' : utils.checkIconvConst,
+        'CheckSizeOfWChar' : utils.checkSizeOfWChar,
     }
 )
 
@@ -662,13 +674,27 @@ if not fast_start:
         or (use_vc and not conf.CheckLibWithHeader('zdll', 'zlib.h', 'C')):
         print 'Did not find zdll.lib or zlib.h, exiting!'
         Exit(1)
+    if conf.CheckLib('iconv'):
+        env['ICONV_LIB'] = ['iconv']
+    elif conf.CheckLib('libiconv'):
+        env['ICONV_LIB'] = ['libiconv']
+    elif conf.CheckFunc('iconv_open'):
+        env['ICONV_LIB'] = []
+    else:
+        print 'Did not find iconv or libiconv, exiting!'
+        Exit(1)
+    env_cache['ICONV_LIB'] = env['ICONV_LIB']
+else:
+    env['ICONV_LIB'] = env_cache['ICONV_LIB']
 
 # qt libraries?
 if not fast_start:
     #
     # qt3 does not use pkg_config
     if frontend == 'qt3':
-        if not conf.CheckLibWithHeader('qt-mt', 'qapp.h', 'c++', 'QApplication qapp();'):
+        # windows lib name is qt-mt3
+        if not conf.CheckLibWithHeader('qt-mt', 'qapp.h', 'c++', 'QApplication qapp();') \
+            and not conf.CheckLibWithHeader('qt-mt3', 'qapp.h', 'c++', 'QApplication qapp();'):
             print 'Did not find qt libraries, exiting!'
             Exit(1)
     elif frontend == 'qt4':
@@ -702,10 +728,13 @@ if not fast_start:
 
 # now, if msvc2005 is used, we will need that QT_LIB_PATH/QT_LIB.manifest file
 if use_vc:
-    if mode == 'debug':
-        manifest = os.path.join(qt_lib_path, 'QtGuid4.dll.manifest')
-    else:
-        manifest = os.path.join(qt_lib_path, 'QtGui4.dll.manifest')
+    if frontend == 'qt3':
+        manifest = os.path.join(qt_lib_path, 'qt-mt3.dll.manifest')
+    elif frontend == 'qt4':
+        if mode == 'debug':
+            manifest = os.path.join(qt_lib_path, 'QtGuid4.dll.manifest')
+        else:
+            manifest = os.path.join(qt_lib_path, 'QtGui4.dll.manifest')
     if os.path.isfile(manifest):
         env['LINKCOM'] = [env['LINKCOM'], 'mt.exe /MANIFEST %s /outputresource:$TARGET;1' % manifest]
 
@@ -816,6 +845,14 @@ if not fast_start:
 else:
     env['MSGFMT'] = env_cache['MSGFMT']
 
+# cygwin packaging requires the binaries to be stripped
+if platform_name == 'cygwin':
+    if not fast_start:
+        env['STRIP'] = conf.CheckCommand('strip')
+        env_cache['STRIP'] = env['STRIP']
+    else:
+        env['STRIP'] = env_cache['STRIP']
+
 # check uic and moc commands for qt frontends
 if not fast_start:
     if frontend[:2] == 'qt' and (conf.CheckCommand('uic') == None \
@@ -877,6 +914,9 @@ if not fast_start or not os.path.isfile(boost_config_h) \
                 'Define if you want assertions to be enabled in the code'
             ),
         ],
+        types = [
+            ('wchar_t', 'HAVE_WCHAR_T', None),
+        ],
         config_post = '''
 
 #if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM)
@@ -891,11 +931,12 @@ if not fast_start or not os.path.isfile(boost_config_h) \
 #define BOOST_ENABLE_ASSERT_HANDLER 1
 
 #define BOOST_DISABLE_THREADS 1
-#define BOOST_NO_WREGEX 1
 #define BOOST_NO_WSTRING 1
 
 #ifdef __CYGWIN__
 #  define BOOST_POSIX 1
+#  define BOOST_POSIX_API 1
+#  define BOOST_POSIX_PATH 1
 #endif
 
 #define BOOST_ALL_NO_LIB 1
@@ -944,6 +985,13 @@ if not fast_start or not os.path.isfile(boost_config_h) \
     # check arg types of select function
     (select_arg1, select_arg234, select_arg5) = conf.CheckSelectArgType()
 
+    # check the size of wchar_t
+    sizeof_wchar_t = conf.CheckSizeOfWChar()
+    # something wrong
+    if sizeof_wchar_t == 0:
+        print 'Error: Can not determine the size of wchar_t.'
+        Exit(1)
+
     #
     # create config.h
     result = utils.createConfigFile(conf,
@@ -1013,11 +1061,11 @@ int count()
         ],
         types = [
             ('std::istreambuf_iterator<std::istream>', 'HAVE_DECL_ISTREAMBUF_ITERATOR',
-                '#include <streambuf>\n#include <istream>')
+                '#include <streambuf>\n#include <istream>'),
+            ('wchar_t', 'HAVE_WCHAR_T', None),
         ],
         libs = [
             ('gdi32', 'HAVE_LIBGDI32'),
-            (('iconv', 'libiconv'), 'HAVE_ICONV', 'ICONV_LIB'),
             (('Aiksaurus', 'libAiksaurus'), 'HAVE_LIBAIKSAURUS', 'AIKSAURUS_LIB'),
         ],
         custom_tests = [
@@ -1035,6 +1083,12 @@ int count()
                 'MKDIR_TAKES_ONE_ARG',
                 'Define if mkdir takes only one argument.'
             ),
+            (conf.CheckIconvConst(),
+                'ICONV_CONST',
+                'Define as const if the declaration of iconv() needs const.',
+                '#define ICONV_CONST const',
+                '#define ICONV_CONST',
+            ),
             (conf.CheckLC_MESSAGES(),
                 'HAVE_LC_MESSAGES',
                 'Define if your <locale.h> file defines LC_MESSAGES.'
@@ -1065,11 +1119,21 @@ int count()
                 'libstdc++ pedantic debug mode'
             ),
             (os.name != 'nt', 'BOOST_POSIX',
-                'Indicates to boost which API to use (posix or windows).'
+                'Indicates to boost < 1.34 which API to use (posix or windows).'
+            ),
+            (os.name != 'nt', 'BOOST_POSIX_API',
+                'Indicates to boost 1.34 which API to use (posix or windows).'
+            ),
+            (os.name != 'nt', 'BOOST_POSIX_PATH',
+                'Indicates to boost 1.34 which path style to use (posix or windows).'
             ),
             (spell_engine is not None, spell_engine,
                 'Spell engine to use'
             ),
+            # we need to know the byte order for unicode conversions
+            (sys.byteorder == 'big', 'WORDS_BIGENDIAN',
+                'Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX).'
+            ),
         ],
         extra_items = [
             ('#define PACKAGE "%s%s"' % (package, program_suffix),
@@ -1096,6 +1160,8 @@ int count()
                 "Define to the type of arg 2, 3, 4 for `select'."),
             ('#define SELECT_TYPE_ARG5 %s' % select_arg5,
                 "Define to the type of arg 5 for `select'."),
+            ('#define SIZEOF_WCHAR_T %d' % sizeof_wchar_t,
+                'Define to be the size of type wchar_t'),
         ],
         config_post = '''/************************************************************
 ** You should not need to change anything beyond this point */
@@ -1124,8 +1190,7 @@ int mkstemp(char*);
 
     # these keys are needed in env
     for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_FCNTL',\
-        'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS',
-        'ICONV_LIB', 'AIKSAURUS_LIB']:
+        'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS', 'AIKSAURUS_LIB']:
         # USE_ASPELL etc does not go through result
         if result.has_key(key):
             env[key] = result[key]
@@ -1206,7 +1271,6 @@ int mkstemp(char*);
                 ('uintmax_t', 'HAVE_STDINT_H_WITH_UINTMAX', '#include <stdint.h>'),
             ],
             libs = [
-                (('iconv', 'libiconv'), 'HAVE_ICONV', 'ICONV_LIB'),
                 ('c', 'HAVE_LIBC'),
             ],
             custom_tests = [
@@ -1217,8 +1281,8 @@ int mkstemp(char*);
                 (conf.CheckIconvConst(),
                     'ICONV_CONST',
                     'Define as const if the declaration of iconv() needs const.',
-                    '#define ICONV_CONST',
                     '#define ICONV_CONST const',
+                    '#define ICONV_CONST',
                 ),
                 (conf.CheckType('intmax_t', includes='#include <stdint.h>') or \
                 conf.CheckType('intmax_t', includes='#include <inttypes.h>'),
@@ -1230,12 +1294,17 @@ int mkstemp(char*);
                     "Define to 1 if translation of program messages to the user's native anguage is requested.",
                 ),
             ],
+            extra_items = [
+                ('#define HAVE_ICONV 1', 'Define if iconv or libiconv is found'),
+                ('#define SIZEOF_WCHAR_T %d' % sizeof_wchar_t,
+                    'Define to be the size of type wchar_t'),
+            ],
             config_post = '#endif'
         )
 
         # these keys are needed in env
         for key in ['HAVE_ASPRINTF', 'HAVE_WPRINTF', 'HAVE_SNPRINTF', \
-            'HAVE_POSIX_PRINTF', 'HAVE_ICONV', 'HAVE_LIBC']:
+            'HAVE_POSIX_PRINTF', 'HAVE_LIBC']:
             # USE_ASPELL etc does not go through result
             if result.has_key(key):
                 env[key] = result[key]
@@ -1250,15 +1319,14 @@ else:
     conf.CheckCHeader('io.h')
     # only a few variables need to be rescanned
     for key in ['USE_ASPELL', 'USE_PSPELL', 'USE_ISPELL', 'HAVE_FCNTL',\
-        'HAVE_ICONV', 'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS',
-        'ICONV_LIB', 'AIKSAURUS_LIB']:
+        'HAVE_LIBGDI32', 'HAVE_LIBAIKSAURUS', 'AIKSAURUS_LIB']:
         env[key] = env_cache[key]
     #
     # nls related keys
     if env['nls'] and included_gettext:
         # only a few variables need to be rescanned
         for key in ['HAVE_ASPRINTF', 'HAVE_WPRINTF', 'HAVE_SNPRINTF', \
-            'HAVE_POSIX_PRINTF', 'HAVE_ICONV', 'HAVE_LIBC']:
+            'HAVE_POSIX_PRINTF', 'HAVE_LIBC']:
             env[key] = env_cache[key]
 
 # this looks misplaced, but intl/libintl.h is needed by src/message.C
@@ -1283,8 +1351,11 @@ env = conf.Finish()
 # in their respective directory and specialized env.
 if frontend == 'qt3':
     # note: env.Tool('qt') my set QT_LIB to qt
-    qt_libs = ['qt-mt']
-    frontend_libs = ['qt-mt']
+    if platform_name == 'win32':
+        qt_libs = ['qt-mt3']
+    else:
+        qt_libs = ['qt-mt']
+    frontend_libs = qt_libs
 elif frontend == 'qt4':
     qt_libs = ['QtCore', 'QtGui']
     # set the right lib names
@@ -1301,22 +1372,22 @@ elif frontend == 'qt4':
     frontend_libs = [x + qt_lib_suffix for x in qt_libs]
 
 
+system_libs = env['ICONV_LIB']
 if platform_name in ['win32', 'cygwin']:
     # the final link step needs stdc++ to succeed under mingw
     # FIXME: shouldn't g++ automatically link to stdc++?
     if use_vc:
-        system_libs = ['shlwapi', 'shell32', 'advapi32', 'zdll']
+        system_libs += ['ole32', 'shlwapi', 'shell32', 'advapi32', 'zdll']
     else:
-        system_libs = ['shlwapi', 'stdc++', 'z']
+        system_libs += ['shlwapi', 'stdc++', 'z']
 elif platform_name == 'cygwin' and env['X11']:
-    system_libs = ['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr', 'Xcursor',
-        'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 'resolv',
-        'pthread', 'z']
+    system_libs += ['GL',  'Xmu', 'Xi', 'Xrender', 'Xrandr',
+        'Xcursor', 'Xft', 'freetype', 'fontconfig', 'Xext', 'X11', 'SM', 'ICE', 
+        'resolv', 'pthread', 'z']
 else:
-    system_libs = ['z']
+    system_libs += ['z']
 
 libs = [
-    ('HAVE_ICONV', env['ICONV_LIB']),
     ('HAVE_LIBGDI32', 'gdi32'),
     ('HAVE_LIBAIKSAURUS', env['AIKSAURUS_LIB']),
     ('USE_ASPELL', aspell_lib),
@@ -1367,7 +1438,7 @@ env['CPPPATH'].remove(qt_inc_path)
 # for details
 #
 if platform_name == 'cygwin':
-    ld_script_path = '/usr/lib/qt3/mkspecs/cygwin-g++'
+    ld_script_path = '/tmp'
     ld_script = utils.installCygwinLDScript(ld_script_path)
     env.AppendUnique(LINKFLAGS = ['-Wl,--enable-runtime-pseudo-reloc',
         '-Wl,--script,%s' % ld_script, '-Wl,-s'])
@@ -1739,7 +1810,7 @@ if build_qt3:
     qt3 = qt3env.StaticLibrary(
         target = '$LOCALLIBPATH/qt3',
         source = ['$BUILDDIR/common/frontends/qt3/%s' % x for x in src_frontends_qt3_files] \
-            + qt3_moced_files + qt3_uiced_cc_files
+            + qt3_uiced_cc_files
     )
     Alias('qt3', qt3)
 
@@ -1775,7 +1846,6 @@ if build_qt4:
         '-DQT_CLEAN_NAMESPACE',
         '-DQT_GENUINE_STR',
         '-DQT_NO_STL',
-        '-DQT3_SUPPORT',
         '-DQT_NO_KEYWORDS',
         ]
     )
@@ -1787,7 +1857,7 @@ if build_qt4:
     # Compile resources
     #
     resources = [qt4env.Uic4(x.split('.')[0]) for x in \
-        src_frontends_qt4_ui_files]
+        ["$BUILDDIR/common/frontends/qt4/ui/%s" % x for x in src_frontends_qt4_ui_files]]
 
     #
     # moc qt4_moc_files, the moced files are included in the original files
@@ -2132,30 +2202,23 @@ if 'install' in targets:
     else:
         version_suffix = ''
     #
-    # install lyx
-    target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx%s' % version_suffix)
-    target = os.path.join(bin_dest_dir, target_name)
-    env.InstallAs(target, lyx)
-    Alias('install', target)
-    # install lyx as lyx-qt3
-    target_name = os.path.split(str(lyx[0]))[1].replace('lyx', 'lyx-%s%s' % (frontend, version_suffix))
-    target = os.path.join(bin_dest_dir, target_name)
-    env.InstallAs(target, lyx)
-    Alias('install', target)
-    #
-    # install tex2lyx
-    target_name = os.path.split(str(tex2lyx[0]))[1].replace('tex2lyx', 'tex2lyx%s' % version_suffix)
-    target = os.path.join(bin_dest_dir, target_name)
-    env.InstallAs(target, tex2lyx)
-    Alias('install', target)
-    #
-    # install lyxclient, may not exist
-    if client != None:
-        target_name = os.path.split(str(client[0]))[1].replace('client', 'client%s' % version_suffix)
+    # install lyx, if in release mode, try to strip the binary
+    if env.has_key('STRIP') and env['STRIP'] is not None and mode != 'debug':
+        # create a builder to strip and install
+        env['BUILDERS']['StripInstallAs'] = Builder(action='$STRIP $SOURCE -o $TARGET')
+
+    # install executables
+    for (name, obj) in (('lyx', lyx), ('tex2lyx', tex2lyx), ('client', client)):
+        if obj is None:
+            continue
+        target_name = os.path.split(str(obj[0]))[1].replace(name, '%s%s' % (name, version_suffix))
         target = os.path.join(bin_dest_dir, target_name)
-        env.InstallAs(target, client)
+        if env['BUILDERS'].has_key('StripInstallAs'):
+            env.StripInstallAs(target, obj)
+        else:
+            env.InstallAs(target, obj)
         Alias('install', target)
-    #
+
     # share/lyx
     dirs = []
     for (dir,files) in [
@@ -2175,14 +2238,27 @@ if 'install' in targets:
             ('lyx2lyx', lib_lyx2lyx_files)]:
         dirs.append(env.Install(os.path.join(share_dest_dir, dir),
             [env.subst('$TOP_SRCDIR/lib/%s/%s' % (dir, file)) for file in files]))
+    Alias('install', dirs)
     
+    if platform_name == 'cygwin':
+        # cygwin packaging requires a file /usr/share/doc/Cygwin/foot-vendor-suffix.README
+        Cygwin_README = os.path.join(dest_prefix_dir, 'doc', 'Cygwin', 
+            '%s%s.README' % (package, package_cygwin_version))
+        env.InstallAs(Cygwin_README,
+            os.path.join(env.subst('$TOP_SRCDIR'), 'README.cygwin'))
+        Alias('install', Cygwin_README)
+        # also a directory /usr/share/doc/lyx for README etc
+        Cygwin_Doc = os.path.join(dest_prefix_dir, 'doc', package)
+        env.Install(Cygwin_Doc, [os.path.join(env.subst('$TOP_SRCDIR'), x) for x in \
+            ['INSTALL', 'README', 'README.Cygwin', 'RELEASE-NOTES', 'COPYING', 'ANNOUNCE']])
+        Alias('install', Cygwin_Doc)
+
     # lyx1.4.x does not have lyx2lyx_version.py.in
     if os.path.isfile(env.subst('$TOP_SRCDIR/lib/lyx2lyx/lyx2lyx_version.py.in')):
         # subst and install this file
         env.substFile(share_dest_dir + '/lyx2lyx/lyx2lyx_version.py',
             '$TOP_SRCDIR/lib/lyx2lyx/lyx2lyx_version.py.in')
         Alias('install', share_dest_dir + '/lyx2lyx/lyx2lyx_version.py')
-    Alias('install', dirs)
     # man
     env.InstallAs(os.path.join(man_dest_dir, 'lyx' + version_suffix + '.1'),
         env.subst('$TOP_SRCDIR/lyx.man'))
@@ -2196,7 +2272,7 @@ if 'install' in targets:
     # ru.gmo ==> ru/LC_MESSAGES/lyxSUFFIX.mo
     for gmo in gmo_files:
         lan = os.path.split(str(gmo))[1].split('.')[0]
-        dest_file = os.path.join(locale_dest_dir, lan, 'LC_MESSAGES', 'lyx' + version_suffix + '.mo')
+        dest_file = os.path.join(locale_dest_dir, lan, 'LC_MESSAGES', 'lyx' + program_suffix + '.mo')
         env.InstallAs(dest_file, gmo)
         Alias('install', dest_file)