mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-27 14:29:21 +00:00
Scons: improved option handling
* add option: optimization (=-O3 etc) * add load_option=opt1,opt2 or load_option=-opt1,opt2: selectively load options * CCFLAGS etc will replace default values, but not hardcoded ones. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14107 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
fcdbd2357d
commit
aa460e9217
@ -9,67 +9,8 @@
|
|||||||
# Full author contact details are available in file CREDITS.
|
# Full author contact details are available in file CREDITS.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# This is a scons based building system for lyx, you can use it as follows:
|
# This is a scons based building system for lyx, please refer
|
||||||
#
|
# to INSTALL.scons for detailed instructions.
|
||||||
# $ cd development/scons
|
|
||||||
# $ scons [options] [targets]
|
|
||||||
# or:
|
|
||||||
# $ scons -f development/scons/SConstruct [options] [targets]
|
|
||||||
# and:
|
|
||||||
# $ scons [prefix=.] install
|
|
||||||
#
|
|
||||||
# Where:
|
|
||||||
# * targets can be one or more of lyx, tex2lyx, client, po, install.
|
|
||||||
# default to lyx, you can use 'scons all' to build all targets except
|
|
||||||
# for install
|
|
||||||
# * options: use scons -h for details about options, the most important
|
|
||||||
# one is frontend=qt2|qt3|qt4.
|
|
||||||
# - qt2 is used by lyx1.4.x
|
|
||||||
# - qt3 is used by default on linux, cygwin and mac
|
|
||||||
# - qt4 is used by default on win32/mingw
|
|
||||||
#
|
|
||||||
# File layouts (Important):
|
|
||||||
# * Unless you specify builddir=dir, building will happen
|
|
||||||
# in $BUILDDIR = $mode, which can be debug or release
|
|
||||||
# * $BUILDDIR has subdirectories
|
|
||||||
# libs: all intermediate libraries
|
|
||||||
# boost: boost libraries, if boost=included is used
|
|
||||||
# qt3/4: frontend-specific objects
|
|
||||||
# * executables will be copied to $BUILDDIR/
|
|
||||||
#
|
|
||||||
# Hints:
|
|
||||||
# * scons fast_start=yes
|
|
||||||
# If env.cache exists, bypass all tests and use existing src/config.h
|
|
||||||
#
|
|
||||||
# * scons --config=force
|
|
||||||
# force re-configuration (use scons -H for details)
|
|
||||||
#
|
|
||||||
# * check config.log to see why config has failed
|
|
||||||
#
|
|
||||||
# * use extra_inc_path, extra_lib_path, qt_dir, qt_inc_path
|
|
||||||
# qt_lib_path to help locate qt and other libraries.
|
|
||||||
# There are also extra_inc_path1, extra_lib_path1 if you need to spacify
|
|
||||||
# more than one extra paths.
|
|
||||||
#
|
|
||||||
# * executed commands will be logged in scons_lyx.log. You can use logfile=
|
|
||||||
# option to save log to another file.
|
|
||||||
#
|
|
||||||
# Notes:
|
|
||||||
#
|
|
||||||
# * scons dist etc may be added later. Interested contributors can follow
|
|
||||||
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/AccumulateBuilder
|
|
||||||
# or
|
|
||||||
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/DistTarBuilder
|
|
||||||
# Please also see the commented out code in scons_utils.py
|
|
||||||
#
|
|
||||||
# * NSIS support can be found here.
|
|
||||||
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/NsisSconsTool
|
|
||||||
#
|
|
||||||
# * rpm support?
|
|
||||||
# http://www.scons.org/cgi-sys/cgiwrap/scons/moin.cgi/RpmHonchoTemp
|
|
||||||
#
|
|
||||||
# However, I decide to wait since scons seems to be standardizing these
|
|
||||||
# features.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
import os, sys, copy, cPickle, glob
|
import os, sys, copy, cPickle, glob
|
||||||
@ -98,6 +39,7 @@ else:
|
|||||||
TOP_SRC_DIR = '.'
|
TOP_SRC_DIR = '.'
|
||||||
SCONS_DIR = 'development/scons'
|
SCONS_DIR = 'development/scons'
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# Global definitions
|
# Global definitions
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
@ -132,83 +74,35 @@ env_cache_file = 'env.cache'
|
|||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
platform_name = 'win32'
|
platform_name = 'win32'
|
||||||
default_frontend = 'qt4'
|
default_frontend = 'qt4'
|
||||||
# boost and gettext are unlikely to be installed already
|
|
||||||
default_boost_opt = 'included'
|
|
||||||
default_gettext_opt = 'included'
|
|
||||||
default_pch_opt = False
|
|
||||||
default_with_x = False
|
default_with_x = False
|
||||||
spell_checker = 'auto'
|
|
||||||
# boost_posix indicates to boost which API to use (posix or windows).
|
|
||||||
# If not specified, boost tries to figure out by itself, but it may fail.
|
|
||||||
boost_posix = False
|
|
||||||
packaging_method = 'windows'
|
packaging_method = 'windows'
|
||||||
default_prefix = 'c:/program files/lyx'
|
|
||||||
share_dir = 'Resources'
|
|
||||||
man_dir = 'Resources/man/man1'
|
|
||||||
locale_dir = 'Resources/locale'
|
|
||||||
elif os.name == 'posix' and sys.platform != 'cygwin':
|
elif os.name == 'posix' and sys.platform != 'cygwin':
|
||||||
platform_name = sys.platform
|
platform_name = sys.platform
|
||||||
default_frontend = 'qt3'
|
default_frontend = 'qt3'
|
||||||
# try to use system boost/gettext libraries
|
|
||||||
default_boost_opt = 'auto'
|
|
||||||
default_gettext_opt = 'auto'
|
|
||||||
default_pch_opt = False
|
|
||||||
default_with_x = True
|
default_with_x = True
|
||||||
boost_posix = True
|
|
||||||
packaging_method = 'posix'
|
packaging_method = 'posix'
|
||||||
default_prefix = '/usr/local/'
|
|
||||||
share_dir = 'share/lyx'
|
|
||||||
man_dir = 'man/man1'
|
|
||||||
locale_dir = 'share/locale'
|
|
||||||
elif os.name == 'posix' and sys.platform == 'cygwin':
|
elif os.name == 'posix' and sys.platform == 'cygwin':
|
||||||
platform_name = 'cygwin'
|
platform_name = 'cygwin'
|
||||||
default_frontend = 'qt3'
|
default_frontend = 'qt3'
|
||||||
# force the use of cygwin/boost/gettext
|
|
||||||
default_boost_opt = 'system'
|
|
||||||
default_gettext_opt = 'system'
|
|
||||||
default_pch_opt = False
|
|
||||||
default_with_x = True
|
default_with_x = True
|
||||||
boost_posix = True
|
|
||||||
packaging_method = 'posix'
|
packaging_method = 'posix'
|
||||||
default_prefix = '/usr/local/'
|
|
||||||
share_dir = 'share/lyx'
|
|
||||||
man_dir = 'man/man1'
|
|
||||||
locale_dir = 'share/locale'
|
|
||||||
elif os.name == 'darwin':
|
elif os.name == 'darwin':
|
||||||
platform_name = 'mac'
|
platform_name = 'mac'
|
||||||
default_frontend = 'qt3'
|
default_frontend = 'qt3'
|
||||||
# to be safe
|
|
||||||
default_boost_opt = 'included'
|
|
||||||
default_gettext_opt = 'included'
|
|
||||||
default_pch_opt = False
|
|
||||||
default_with_x = False
|
default_with_x = False
|
||||||
boost_posix = True
|
|
||||||
packaging_method = 'mac'
|
packaging_method = 'mac'
|
||||||
# FIXME: where to install?
|
else: # unsupported system, assume posix behavior
|
||||||
default_prefix = '/usr/local/'
|
|
||||||
share_dir = 'Resources'
|
|
||||||
man_dir = 'Resources/man/man1'
|
|
||||||
locale_dir = 'Resources/locale'
|
|
||||||
else: # unsupported system
|
|
||||||
platform_name = 'others'
|
platform_name = 'others'
|
||||||
default_frontend = 'qt3'
|
default_frontend = 'qt3'
|
||||||
# to be safe
|
|
||||||
default_boost_opt = 'included'
|
|
||||||
default_gettext_opt = 'included'
|
|
||||||
default_pch_opt = False
|
|
||||||
default_with_x = True
|
default_with_x = True
|
||||||
boost_posix = False
|
|
||||||
packaging_method = 'posix'
|
packaging_method = 'posix'
|
||||||
default_prefix = '/usr/local/'
|
|
||||||
share_dir = 'share/lyx'
|
|
||||||
man_dir = 'man/man1'
|
|
||||||
locale_dir = 'share/locale'
|
|
||||||
|
|
||||||
|
|
||||||
#---------------------------------------------------------
|
#---------------------------------------------------------
|
||||||
# Handling options
|
# Handling options
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
# You can set perminant default values in config.py
|
||||||
if os.path.isfile('config.py'):
|
if os.path.isfile('config.py'):
|
||||||
print "Getting options from config.py..."
|
print "Getting options from config.py..."
|
||||||
print open('config.py').read()
|
print open('config.py').read()
|
||||||
@ -224,17 +118,15 @@ opts.AddOptions(
|
|||||||
# boost libraries
|
# boost libraries
|
||||||
EnumOption('boost',
|
EnumOption('boost',
|
||||||
'Use included, system boost library, or try sytem boost first.',
|
'Use included, system boost library, or try sytem boost first.',
|
||||||
default_boost_opt,
|
'auto', allowed_values = (
|
||||||
allowed_values = (
|
|
||||||
'auto', # detect boost, if not found, use included
|
'auto', # detect boost, if not found, use included
|
||||||
'included', # always use included boost
|
'included', # always use included boost
|
||||||
'system', # always use system boost, fail if can not find
|
'system', # always use system boost, fail if can not find
|
||||||
) ),
|
) ),
|
||||||
# FIXME: not implemented yet.
|
#
|
||||||
EnumOption('gettext',
|
EnumOption('gettext',
|
||||||
'Use included, system gettext library, or try sytem gettext first',
|
'Use included, system gettext library, or try sytem gettext first',
|
||||||
default_gettext_opt,
|
'auto', allowed_values = (
|
||||||
allowed_values = (
|
|
||||||
'auto', # detect gettext, if not found, use included
|
'auto', # detect gettext, if not found, use included
|
||||||
'included', # always use included gettext
|
'included', # always use included gettext
|
||||||
'system', # always use system gettext, fail if can not find
|
'system', # always use system gettext, fail if can not find
|
||||||
@ -244,14 +136,13 @@ opts.AddOptions(
|
|||||||
allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
|
allowed_values = ('aspell', 'pspell', 'ispell', 'auto') ),
|
||||||
#
|
#
|
||||||
BoolOption('fast_start', 'Whether or not use cached tests and keep current config.h', True),
|
BoolOption('fast_start', 'Whether or not use cached tests and keep current config.h', True),
|
||||||
#
|
|
||||||
BoolOption('load_option', 'load option from previous scons run', True),
|
|
||||||
# FIXME: I do not know how pch is working. Ignore this option now.
|
# FIXME: I do not know how pch is working. Ignore this option now.
|
||||||
BoolOption('pch', '(NA) Whether or not use pch', default_pch_opt),
|
BoolOption('pch', '(NA) Whether or not use pch', None),
|
||||||
# enable assertion, (config.h has ENABLE_ASSERTIOS
|
# enable assertion, (config.h has ENABLE_ASSERTIOS
|
||||||
BoolOption('assertions', 'Use assertions', True),
|
BoolOption('assertions', 'Use assertions', True),
|
||||||
# enable warning, (config.h has WITH_WARNINGS)
|
# enable warning, (config.h has WITH_WARNINGS)
|
||||||
BoolOption('warnings', 'Use warnings', True),
|
# default to False since MSVC does not have #warning
|
||||||
|
BoolOption('warnings', 'Use warnings', False),
|
||||||
# enable glib, (config.h has _GLIBCXX_CONCEPT_CHECKS)
|
# enable glib, (config.h has _GLIBCXX_CONCEPT_CHECKS)
|
||||||
BoolOption('concept_checks', 'Enable concept checks', True),
|
BoolOption('concept_checks', 'Enable concept checks', True),
|
||||||
#
|
#
|
||||||
@ -263,6 +154,7 @@ opts.AddOptions(
|
|||||||
# using x11?
|
# using x11?
|
||||||
BoolOption('X11', 'Use x11 windows system', default_with_x),
|
BoolOption('X11', 'Use x11 windows system', default_with_x),
|
||||||
# use MS VC++ to build lyx
|
# use MS VC++ to build lyx
|
||||||
|
# FIXME: detect mavc automatically (check for cl.exe)
|
||||||
BoolOption('use_vc', 'Use MS VC++ to build lyx', False),
|
BoolOption('use_vc', 'Use MS VC++ to build lyx', False),
|
||||||
#
|
#
|
||||||
PathOption('qt_dir', 'Path to qt directory', None),
|
PathOption('qt_dir', 'Path to qt directory', None),
|
||||||
@ -290,26 +182,40 @@ opts.AddOptions(
|
|||||||
('dest_dir', 'install to dest_dir', None),
|
('dest_dir', 'install to dest_dir', None),
|
||||||
# version suffix
|
# version suffix
|
||||||
('version_suffix', 'install lyx as lyx-suffix', ''),
|
('version_suffix', 'install lyx as lyx-suffix', ''),
|
||||||
|
# how to load options
|
||||||
|
('load_option', '''load option from previous scons run. option can be
|
||||||
|
yes (default): load all options
|
||||||
|
no: do not load any option
|
||||||
|
opt1,opt2: load specified options
|
||||||
|
-opt1,opt2: load all options other than specified ones''', 'yes'),
|
||||||
|
#
|
||||||
|
('optimization', 'optimization CCFLAGS option.', None),
|
||||||
#
|
#
|
||||||
PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', None),
|
PathOption('exec_prefix', 'install architecture-independent executable files in PREFIX', None),
|
||||||
# log file
|
# log file
|
||||||
('logfile', 'save commands (not outputs) to logfile', default_log_file),
|
('logfile', 'save commands (not outputs) to logfile', default_log_file),
|
||||||
# Path to aiksaurus
|
# environment variable can be set as options.
|
||||||
PathOption('aiksaurus_path', 'Path to aiksaurus library', None),
|
('CC', 'replace default $CC', None),
|
||||||
# environment variable can be set as options. (DO NOT set defaults)
|
('LINK', 'replace default $LINK', None),
|
||||||
('CC', '$CC', None),
|
('CPP', 'replace default $CPP', None),
|
||||||
('LINK', '$LINK', None),
|
('CXX', 'replace default $CXX', None),
|
||||||
('CPP', '$CPP', None),
|
('CXXCPP', 'replace default $CXXCPP', None),
|
||||||
('CXX', '$CXX', None),
|
('CCFLAGS', 'replace default $CCFLAGS', None),
|
||||||
('CXXCPP', '$CXXCPP', None),
|
('CPPFLAGS', 'replace default $CPPFLAGS', None),
|
||||||
('CCFLAGS', '$CCFLAGS', None),
|
('LUBKFLAGS', 'replace default $LINKFLAGS', None),
|
||||||
('CPPFLAGS', '$CPPFLAGS', None),
|
|
||||||
('LDFLAGS', '$LDFLAGS', None),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# copied from SCons/Options/BoolOption.py
|
||||||
|
true_strings = ('y', 'yes', 'true', 't', '1', 'on' , 'all' )
|
||||||
|
false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none')
|
||||||
|
|
||||||
# whether or not use current config.h, and cached tests
|
# whether or not use current config.h, and cached tests
|
||||||
|
# note that env is not defined yet, so we have to use ARGUMENTS
|
||||||
|
# and raw values of 'yes', 'no' etc.
|
||||||
|
#
|
||||||
|
# if fast_start=yes (default), load variables from env_cache_file
|
||||||
if (not ARGUMENTS.has_key('fast_start') or \
|
if (not ARGUMENTS.has_key('fast_start') or \
|
||||||
ARGUMENTS['fast_start'] in ['y', 'yes', 't', 'true', '1', 'all']) \
|
ARGUMENTS['fast_start'] in true_strings) \
|
||||||
and os.path.isfile(env_cache_file):
|
and os.path.isfile(env_cache_file):
|
||||||
fast_start = True
|
fast_start = True
|
||||||
cache_file = open(env_cache_file)
|
cache_file = open(env_cache_file)
|
||||||
@ -323,8 +229,12 @@ else:
|
|||||||
fast_start = False
|
fast_start = False
|
||||||
env_cache = {}
|
env_cache = {}
|
||||||
|
|
||||||
|
# if load_option=yes (default), load saved comand line options
|
||||||
|
#
|
||||||
|
# This option can take values yes/no/opt1,opt2/-opt1,opt2
|
||||||
|
# and tries to be clever in choosing options to load
|
||||||
if (not ARGUMENTS.has_key('load_option') or \
|
if (not ARGUMENTS.has_key('load_option') or \
|
||||||
ARGUMENTS['load_option'] in ['y', 'yes', 't', 'true', '1', 'all']) \
|
ARGUMENTS['load_option'] not in false_strings) \
|
||||||
and os.path.isfile(env_cache_file):
|
and os.path.isfile(env_cache_file):
|
||||||
cache_file = open(env_cache_file)
|
cache_file = open(env_cache_file)
|
||||||
opt_cache = cPickle.load(cache_file)['arg_cache']
|
opt_cache = cPickle.load(cache_file)['arg_cache']
|
||||||
@ -347,6 +257,21 @@ if (not ARGUMENTS.has_key('load_option') or \
|
|||||||
for arg in ['fast_start', 'load_option']:
|
for arg in ['fast_start', 'load_option']:
|
||||||
if opt_cache.has_key(arg):
|
if opt_cache.has_key(arg):
|
||||||
opt_cache.pop(arg)
|
opt_cache.pop(arg)
|
||||||
|
# now, if load_option=opt1,opt2
|
||||||
|
if ARGUMENTS.has_key('load_option') and \
|
||||||
|
ARGUMENTS['load_option'] not in true_strings + false_strings:
|
||||||
|
# if -opt1,opt2 is specified, do not load these options
|
||||||
|
if ARGUMENTS['load_option'][0] == '-':
|
||||||
|
for arg in ARGUMENTS['load_option'][1:].split(','):
|
||||||
|
if opt_cache.has_key(arg):
|
||||||
|
opt_cache.pop(arg)
|
||||||
|
# if opt1,opt2 is specified, only load specified options
|
||||||
|
else:
|
||||||
|
args = ARGUMENTS['load_option'].split(',')
|
||||||
|
for arg in opt_cache.keys():
|
||||||
|
if arg not in args:
|
||||||
|
opt_cache.pop(arg)
|
||||||
|
# now restore options as if entered from command line
|
||||||
for key in opt_cache.keys():
|
for key in opt_cache.keys():
|
||||||
if not ARGUMENTS.has_key(key):
|
if not ARGUMENTS.has_key(key):
|
||||||
ARGUMENTS[key] = opt_cache[key]
|
ARGUMENTS[key] = opt_cache[key]
|
||||||
@ -361,23 +286,24 @@ env_cache['arg_cache'] = ARGUMENTS
|
|||||||
# Setting up environment
|
# Setting up environment
|
||||||
#---------------------------------------------------------
|
#---------------------------------------------------------
|
||||||
|
|
||||||
# I do not really like ENV=os.environ, but you may
|
# I do not really like ENV=os.environ, but you may add it
|
||||||
# add it here if you experience some environment related problem
|
# here if you experience some environment related problem
|
||||||
env = Environment(options = opts)
|
env = Environment(options = opts)
|
||||||
|
|
||||||
# Determine the frontend to use, which may be loaded
|
# Determine the frontend to use, which may be loaded
|
||||||
# from option cache
|
# from option cache
|
||||||
frontend = env.get('frontend', default_frontend)
|
frontend = env.get('frontend', default_frontend)
|
||||||
# make sure the key exists
|
# make sure the key exists (when using default_frontend)
|
||||||
env['frontend'] = frontend
|
env['frontend'] = frontend
|
||||||
|
# FIXME: will remove after lyx change file extension to .cpp
|
||||||
env['LYX_EXT'] = lyx_ext
|
env['LYX_EXT'] = lyx_ext
|
||||||
#
|
#
|
||||||
use_X11 = env.get('X11', default_with_x)
|
use_X11 = env.get('X11', default_with_x)
|
||||||
|
# FIXME: determine the use of vc automatically
|
||||||
use_vc = env.get('use_vc', False)
|
use_vc = env.get('use_vc', False)
|
||||||
# use it only once for s scons-bug, will remove it later.
|
# FIXME: use it only once for s scons-bug, will remove it later.
|
||||||
env['USE_VC'] = use_vc
|
env['USE_VC'] = use_vc
|
||||||
|
|
||||||
|
|
||||||
# set individual variables since I do not really like ENV = os.environ
|
# set individual variables since I do not really like ENV = os.environ
|
||||||
env['ENV']['PATH'] = os.environ.get('PATH')
|
env['ENV']['PATH'] = os.environ.get('PATH')
|
||||||
env['ENV']['HOME'] = os.environ.get('HOME')
|
env['ENV']['HOME'] = os.environ.get('HOME')
|
||||||
@ -390,11 +316,24 @@ if use_vc:
|
|||||||
else:
|
else:
|
||||||
env['TOP_SRC_DIR'] = TOP_SRC_DIR
|
env['TOP_SRC_DIR'] = TOP_SRC_DIR
|
||||||
env['SCONS_DIR'] = SCONS_DIR
|
env['SCONS_DIR'] = SCONS_DIR
|
||||||
|
|
||||||
|
# determine share_dir etc
|
||||||
|
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/'
|
||||||
|
|
||||||
# install to default_prefix by default
|
# install to default_prefix by default
|
||||||
env['PREFIX'] = env.get('prefix', default_prefix)
|
env['PREFIX'] = env.get('prefix', default_prefix)
|
||||||
# program suffix
|
# program suffix: can be yes, or a string
|
||||||
if env.has_key('version_suffix'):
|
if env.has_key('version_suffix'):
|
||||||
if env['version_suffix'] in ['y', 'yes', 't', 'true', '1', 'all']:
|
if env['version_suffix'] in true_strings:
|
||||||
env['PROGRAM_SUFFIX'] = PACKAGE_VERSION
|
env['PROGRAM_SUFFIX'] = PACKAGE_VERSION
|
||||||
else:
|
else:
|
||||||
env['PROGRAM_SUFFIX'] = env['version_suffix']
|
env['PROGRAM_SUFFIX'] = env['version_suffix']
|
||||||
@ -422,53 +361,7 @@ else:
|
|||||||
env['MAN_DEST_DIR'] = os.path.join(env['DEST_DIR'], man_dir)
|
env['MAN_DEST_DIR'] = os.path.join(env['DEST_DIR'], man_dir)
|
||||||
env['LOCALE_DEST_DIR'] = os.path.join(env['DEST_DIR'], locale_dir)
|
env['LOCALE_DEST_DIR'] = os.path.join(env['DEST_DIR'], locale_dir)
|
||||||
|
|
||||||
#
|
|
||||||
# this is a bit out of place (after auto-configration) but
|
|
||||||
# it is required to do the tests. Since Tool('mingw') will
|
|
||||||
# reset CCFLAGS etc, this should be done before getEnvVariable
|
|
||||||
if platform_name == 'win32' and not use_vc:
|
|
||||||
env.Tool('mingw')
|
|
||||||
env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
|
|
||||||
elif use_vc:
|
|
||||||
env.Tool('msvc')
|
|
||||||
env.Tool('mslink')
|
|
||||||
|
|
||||||
|
|
||||||
# speed up source file processing
|
|
||||||
#env['CPPSUFFIXES'] = ['.C', '.cc', '.cpp']
|
|
||||||
#env['CXXSUFFIX'] = ['.C']
|
|
||||||
|
|
||||||
def getEnvVariable(env, name):
|
|
||||||
# first try command line argument (override environment settings)
|
|
||||||
if ARGUMENTS.has_key(name) and ARGUMENTS[name].strip() != '':
|
|
||||||
# multiple options may be passed like "-02 -g"
|
|
||||||
env[name] = ARGUMENTS[name].split()
|
|
||||||
# it does not seem necessary, but it is safer to change ['a'] back to 'a'
|
|
||||||
if len(env[name]) == 1:
|
|
||||||
env[name] = env[name][0]
|
|
||||||
# then use environment default
|
|
||||||
elif os.environ.has_key(name) and os.environ[name].strip() != '':
|
|
||||||
print "Acquiring varaible %s from system environment: %s" % (name, env[name])
|
|
||||||
env[name] = os.environ[name].split()
|
|
||||||
if len(env[name]) == 1:
|
|
||||||
env[name] = env[name][0]
|
|
||||||
# finally, env['CC'] etc is set to the default values of Options.
|
|
||||||
# and env['CPP'] etc does not exist
|
|
||||||
|
|
||||||
getEnvVariable(env, 'CC')
|
|
||||||
getEnvVariable(env, 'LINK')
|
|
||||||
getEnvVariable(env, 'CPP')
|
|
||||||
getEnvVariable(env, 'CXX')
|
|
||||||
getEnvVariable(env, 'CXXCPP')
|
|
||||||
getEnvVariable(env, 'CCFLAGS')
|
|
||||||
getEnvVariable(env, 'CXXFLAGS')
|
|
||||||
getEnvVariable(env, 'CPPFLAGS')
|
|
||||||
getEnvVariable(env, 'LDFLAGS')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
|
# frontend, mode, BUILDDIR and LOCALLIBPATH=BUILDDIR/libs
|
||||||
#
|
|
||||||
env['mode'] = env.get('mode', default_build_mode)
|
env['mode'] = env.get('mode', default_build_mode)
|
||||||
# lyx will be built to $build/build_dir so it is possible
|
# lyx will be built to $build/build_dir so it is possible
|
||||||
# to build multiple build_dirs using the same source
|
# to build multiple build_dirs using the same source
|
||||||
@ -486,9 +379,109 @@ env['LOCALLIBPATH'] = '$BUILDDIR/libs'
|
|||||||
env['MSVSPATH'] = '.'
|
env['MSVSPATH'] = '.'
|
||||||
env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
|
env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------
|
||||||
|
# Setting building environment (Tools, compiler flags etc)
|
||||||
|
#---------------------------------------------------------
|
||||||
|
|
||||||
|
# Since Tool('mingw') will reset CCFLAGS etc, this should be
|
||||||
|
# done before getEnvVariable
|
||||||
|
if platform_name == 'win32' and not use_vc:
|
||||||
|
env.Tool('mingw')
|
||||||
|
# FIXME: set this as option?
|
||||||
|
env.AppendUnique(CPPPATH = ['#c:/MinGW/include'])
|
||||||
|
elif use_vc:
|
||||||
|
env.Tool('msvc')
|
||||||
|
env.Tool('mslink')
|
||||||
|
|
||||||
|
# we differentiate between hard-coded options and default options
|
||||||
|
# hard-coded options are required and will always be there
|
||||||
|
# default options can be replaced by enviromental variables or command line options
|
||||||
|
CCFLAGS_required = []
|
||||||
|
LINKFLAGS_required = []
|
||||||
|
CCFLAGS_default = []
|
||||||
|
|
||||||
|
# under windows, scons is confused by .C/.c and uses gcc instead of
|
||||||
|
# g++. I am forcing the use of g++ here. This is expected to change
|
||||||
|
# after lyx renames all .C files to .cpp
|
||||||
#
|
#
|
||||||
# QTDIR, QT_LIB_PATH, QT_INC_PATH
|
# Note that this step has to be after env.Tool('mingw') step
|
||||||
|
# since env.Tool('mingw') will set env['CC'] etc.
|
||||||
#
|
#
|
||||||
|
# save the old c compiler and CCFLAGS (used by libintl)
|
||||||
|
env['C_COMPILER'] = env.subst('$CC')
|
||||||
|
env['C_CCFLAGS'] = env.subst('$CCFLAGS').split()
|
||||||
|
# if we use ms vc, the commands are fine (cl.exe and link.exe)
|
||||||
|
if not use_vc:
|
||||||
|
if env.has_key('CXX') and env['CXX']:
|
||||||
|
env['CC'] = env.subst('$CXX')
|
||||||
|
env['LINK'] = env.subst('$CXX')
|
||||||
|
else:
|
||||||
|
env['CC'] = 'g++'
|
||||||
|
env['LINK'] = 'g++'
|
||||||
|
else:
|
||||||
|
# /TP treat all source code as C++
|
||||||
|
# C4819: The file contains a character that cannot be represented
|
||||||
|
# in the current code page (number)
|
||||||
|
# C4996: foo was decleared deprecated
|
||||||
|
CCFLAGS_required.extend(['/TP', '/EHsc'])
|
||||||
|
CCFLAGS_default.extend(['/wd4819', '/wd4996'])
|
||||||
|
env.Append(C_CCFLAGS=['/Dinline#', '/D__attribute__(x)#', '/Duintmax_t=UINT_MAX'])
|
||||||
|
|
||||||
|
# for debug/release mode
|
||||||
|
if env.has_key('optimization') and env['optimization'] is not None:
|
||||||
|
# if user supplies optimization flags, use it anyway
|
||||||
|
CCFLAGS_required.extend(env['optimization'].split())
|
||||||
|
# and do not use default
|
||||||
|
set_default_optimization_flags = False
|
||||||
|
else:
|
||||||
|
set_default_optimization_flags = True
|
||||||
|
|
||||||
|
if env['mode'] == 'debug':
|
||||||
|
if use_vc:
|
||||||
|
CCFLAGS_required.append('/Zi')
|
||||||
|
LINKFLAGS_required.extend(['/debug', '/map'])
|
||||||
|
else:
|
||||||
|
CCFLAGS_required.append('-g')
|
||||||
|
CCFLAGS_default.append('-Wall')
|
||||||
|
elif env['mode'] == 'release' and set_default_optimization_flags:
|
||||||
|
if use_vc:
|
||||||
|
CCFLAGS_default.append('/O2')
|
||||||
|
else:
|
||||||
|
CCFLAGS_default.append('-O2')
|
||||||
|
|
||||||
|
# Now, set the variables as follows:
|
||||||
|
# 1. if command line option exists: replace default
|
||||||
|
# 2. then if s envronment variable exists: replace default
|
||||||
|
# 3. set variable to required + default
|
||||||
|
def setEnvVariable(env, name, required=[], default=[]):
|
||||||
|
# first try command line argument (override environment settings)
|
||||||
|
if ARGUMENTS.has_key(name):
|
||||||
|
# multiple options may be passed like "-02 -g"
|
||||||
|
default = ARGUMENTS[name].split()
|
||||||
|
# then use environment default
|
||||||
|
elif os.environ.has_key(name):
|
||||||
|
print "Acquiring varaible %s from system environment: %s" % (name, env[name])
|
||||||
|
default = os.environ[name].split()
|
||||||
|
# set variable
|
||||||
|
if required != [] or default != []:
|
||||||
|
env[name] = required + default
|
||||||
|
|
||||||
|
setEnvVariable(env, 'CC')
|
||||||
|
setEnvVariable(env, 'LINK')
|
||||||
|
setEnvVariable(env, 'CPP')
|
||||||
|
setEnvVariable(env, 'CXX')
|
||||||
|
setEnvVariable(env, 'CXXCPP')
|
||||||
|
setEnvVariable(env, 'CCFLAGS', CCFLAGS_required, CCFLAGS_default)
|
||||||
|
setEnvVariable(env, 'CXXFLAGS')
|
||||||
|
setEnvVariable(env, 'CPPFLAGS')
|
||||||
|
setEnvVariable(env, 'LINKFLAGS', LINKFLAGS_required)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------
|
||||||
|
# Frontend related variables (QTDIR etc)
|
||||||
|
#---------------------------------------------------------
|
||||||
|
|
||||||
if env.has_key('qt_dir') and env['qt_dir']:
|
if env.has_key('qt_dir') and env['qt_dir']:
|
||||||
env['QTDIR'] = env['qt_dir']
|
env['QTDIR'] = env['qt_dir']
|
||||||
# add path to the qt tools
|
# add path to the qt tools
|
||||||
@ -531,35 +524,6 @@ if env.has_key('extra_bin_path') and env['extra_bin_path']:
|
|||||||
# maybe only one of them is needed
|
# maybe only one of them is needed
|
||||||
os.environ['PATH'] += os.pathsep + env['extra_bin_path']
|
os.environ['PATH'] += os.pathsep + env['extra_bin_path']
|
||||||
env['ENV']['PATH'] += os.pathsep + env['extra_bin_path']
|
env['ENV']['PATH'] += os.pathsep + env['extra_bin_path']
|
||||||
if env.has_key('aiksaurus_path') and env['aiksaurus_path']:
|
|
||||||
env.AppendUnique(LIBPATH = [env['aiksaurus_path']])
|
|
||||||
|
|
||||||
|
|
||||||
# under windows, scons is confused by .C/.c and uses gcc instead of
|
|
||||||
# g++. I am forcing the use of g++ here. This is expected to change
|
|
||||||
# after lyx renames all .C files to .cpp
|
|
||||||
#
|
|
||||||
# Note that this step has to be after env.Tool('mingw') step
|
|
||||||
# since env.Tool('mingw') will set env['CC'] etc.
|
|
||||||
#
|
|
||||||
# save the old c compiler and CCFLAGS (used by libintl)
|
|
||||||
env['C_COMPILER'] = env.subst('$CC')
|
|
||||||
env['C_CCFLAGS'] = env.subst('$CCFLAGS').split()
|
|
||||||
# if we use ms vc, the commands are fine (cl.exe and link.exe)
|
|
||||||
if not use_vc:
|
|
||||||
if env.has_key('CXX') and env['CXX']:
|
|
||||||
env['CC'] = env.subst('$CXX')
|
|
||||||
env['LINK'] = env.subst('$CXX')
|
|
||||||
else:
|
|
||||||
env['CC'] = 'g++'
|
|
||||||
env['LINK'] = 'g++'
|
|
||||||
else:
|
|
||||||
# /TP treat all source code as C++
|
|
||||||
# C4819: The file contains a character that cannot be represented
|
|
||||||
# in the current code page (number)
|
|
||||||
# C4996: foo was decleared deprecated
|
|
||||||
env.Append(CCFLAGS=['/TP', '/EHsc', '/wd4819', '/wd4996'])
|
|
||||||
env.Append(C_CCFLAGS=['/Dinline#', '/D__attribute__(x)#', '/Duintmax_t=UINT_MAX'])
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
@ -1132,7 +1096,9 @@ int count()
|
|||||||
utils.addToConfig('#define USE_MACOSX_PACKAGING 1')
|
utils.addToConfig('#define USE_MACOSX_PACKAGING 1')
|
||||||
|
|
||||||
# BOOST_POSIX
|
# BOOST_POSIX
|
||||||
if boost_posix:
|
# boost_posix indicates to boost which API to use (posix or windows).
|
||||||
|
# If not specified, boost tries to figure out by itself, but it may fail.
|
||||||
|
if os.name != 'nt':
|
||||||
utils.addToConfig('#define BOOST_POSIX 1')
|
utils.addToConfig('#define BOOST_POSIX 1')
|
||||||
else:
|
else:
|
||||||
utils.addToConfig('/* #undef BOOST_POSIX */')
|
utils.addToConfig('/* #undef BOOST_POSIX */')
|
||||||
@ -1246,21 +1212,6 @@ for lib in libs:
|
|||||||
env['CPPPATH'].remove(env['QT_INC_PATH'])
|
env['CPPPATH'].remove(env['QT_INC_PATH'])
|
||||||
env['CPPPATH'] += ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src']
|
env['CPPPATH'] += ['$TOP_SRC_DIR/boost', '$TOP_SRC_DIR/src']
|
||||||
|
|
||||||
# add appropriate compiling options (-DNDEBUG etc)
|
|
||||||
# for debug/release mode
|
|
||||||
# /Zi: debug info
|
|
||||||
if ARGUMENTS.get('mode', default_build_mode) == 'debug':
|
|
||||||
if use_vc:
|
|
||||||
env.AppendUnique(CCFLAGS = ['/Zi'])
|
|
||||||
env.AppendUnique(LINKFLAGS = ['/debug', '/map'])
|
|
||||||
else:
|
|
||||||
env.AppendUnique(CCFLAGS = ['-Wall', '-g'])
|
|
||||||
else:
|
|
||||||
if use_vc:
|
|
||||||
env.AppendUnique(CCFLAGS = ['/O2'])
|
|
||||||
else:
|
|
||||||
env.AppendUnique(CCFLAGS = ['-Wall', '-O2'])
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Customized builders
|
# Customized builders
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user