# 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')
# some global settings
#
package_version = '1.5.0svn'
+package_cygwin_version = '1.5.0svn-1'
boost_version = '1_33_1'
devel_version = True
# 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')
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:
# 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')
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')
'CheckCXXGlobalCstd' : utils.checkCXXGlobalCstd,
'CheckLC_MESSAGES' : utils.checkLC_MESSAGES,
'CheckIconvConst' : utils.checkIconvConst,
+ 'CheckSizeOfWChar' : utils.checkSizeOfWChar,
}
)
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':
# 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]
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 \
'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)
#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
# 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,
],
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 = [
'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.'
'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),
"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 */
# 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]
('uintmax_t', 'HAVE_STDINT_H_WITH_UINTMAX', '#include <stdint.h>'),
],
libs = [
- (('iconv', 'libiconv'), 'HAVE_ICONV', 'ICONV_LIB'),
('c', 'HAVE_LIBC'),
],
custom_tests = [
(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>'),
"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]
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
# 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
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),
# 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'])
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)
'-DQT_CLEAN_NAMESPACE',
'-DQT_GENUINE_STR',
'-DQT_NO_STL',
- '-DQT3_SUPPORT',
'-DQT_NO_KEYWORDS',
]
)
# 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
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 [
('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'))
# 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)