mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 13:18:28 +00:00
Scons: check for unused/misspelled command line option, allow rebuild=yes/no/all/none.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14449 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e1a5cb74a8
commit
f37a03ece9
@ -116,7 +116,7 @@ Convenience options:
|
|||||||
* rebuild=target1,target2... By default, scons will exam all components
|
* rebuild=target1,target2... By default, scons will exam all components
|
||||||
when you build lyx. You can free scons from some hard work and save
|
when you build lyx. You can free scons from some hard work and save
|
||||||
yourself some time by telling scons to rebuild only specified
|
yourself some time by telling scons to rebuild only specified
|
||||||
component(s).
|
component(s). rebuild=no, none, yes or all can be used as well.
|
||||||
* log_file: a log file of executed commands, default to scons_lyx.log
|
* log_file: a log file of executed commands, default to scons_lyx.log
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,7 +187,10 @@ opts.AddOptions(
|
|||||||
#
|
#
|
||||||
PathOption('extra_lib_path1', 'Extra library path', None),
|
PathOption('extra_lib_path1', 'Extra library path', None),
|
||||||
# rebuild only specifed, comma separated targets
|
# 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
|
# can be set to a non-existing directory
|
||||||
('prefix', 'install architecture-independent files in PREFIX', default_prefix),
|
('prefix', 'install architecture-independent files in PREFIX', default_prefix),
|
||||||
# build directory, will use $mode if not set
|
# build directory, will use $mode if not set
|
||||||
@ -220,6 +223,9 @@ opts.AddOptions(
|
|||||||
('LINKFLAGS', 'replace default $LINKFLAGS', None),
|
('LINKFLAGS', 'replace default $LINKFLAGS', None),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# allowed options
|
||||||
|
all_options = [x.key for x in opts.options]
|
||||||
|
|
||||||
# copied from SCons/Options/BoolOption.py
|
# copied from SCons/Options/BoolOption.py
|
||||||
# We need to use them before a boolean ARGUMENTS option is available
|
# We need to use them before a boolean ARGUMENTS option is available
|
||||||
# in env as bool.
|
# in env as bool.
|
||||||
@ -268,10 +274,15 @@ if (not ARGUMENTS.has_key('load_option') or \
|
|||||||
print " ** fast_start is disabled because of the change of option", arg
|
print " ** fast_start is disabled because of the change of option", arg
|
||||||
print
|
print
|
||||||
fast_start = False
|
fast_start = False
|
||||||
# and we do not cache some options
|
# and we do not cache some options (dest_dir is obsolete)
|
||||||
for arg in ['fast_start', 'load_option']:
|
for arg in ['fast_start', 'load_option', 'dest_dir']:
|
||||||
if opt_cache.has_key(arg):
|
if opt_cache.has_key(arg):
|
||||||
opt_cache.pop(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
|
# now, if load_option=opt1,opt2 or -opt1,opt2
|
||||||
if ARGUMENTS.has_key('load_option') and \
|
if ARGUMENTS.has_key('load_option') and \
|
||||||
ARGUMENTS['load_option'] not in true_strings + false_strings:
|
ARGUMENTS['load_option'] not in true_strings + false_strings:
|
||||||
@ -293,6 +304,16 @@ if (not ARGUMENTS.has_key('load_option') or \
|
|||||||
print "Restoring cached option %s=%s" % (key, ARGUMENTS[key])
|
print "Restoring cached option %s=%s" % (key, ARGUMENTS[key])
|
||||||
print
|
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
|
# save arguments
|
||||||
env_cache['arg_cache'] = ARGUMENTS
|
env_cache['arg_cache'] = ARGUMENTS
|
||||||
|
|
||||||
@ -1447,6 +1468,12 @@ print "Building all targets recursively"
|
|||||||
|
|
||||||
if env.has_key('rebuild'):
|
if env.has_key('rebuild'):
|
||||||
rebuild_targets = env['rebuild'].split(',')
|
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:
|
else:
|
||||||
rebuild_targets = None
|
rebuild_targets = None
|
||||||
|
|
||||||
@ -1454,6 +1481,10 @@ def libExists(libname):
|
|||||||
''' Check whether or not lib $LOCALLIBNAME/libname already exists'''
|
''' Check whether or not lib $LOCALLIBNAME/libname already exists'''
|
||||||
return os.path.isfile(File(env.subst('$LOCALLIBPATH/${LIBPREFIX}%s$LIBSUFFIX'%libname)).abspath)
|
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
|
targets = BUILD_TARGETS
|
||||||
# msvc need to pass full target name, so I have to look for path/lyx etc
|
# 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] \
|
build_lyx = targets == [] or True in ['lyx' in x for x in targets] \
|
||||||
@ -1479,8 +1510,8 @@ build_msvs_projects = use_vc and 'msvs_projects' in targets
|
|||||||
|
|
||||||
|
|
||||||
# now, if rebuild_targets is specified, do not rebuild some targets
|
# now, if rebuild_targets is specified, do not rebuild some targets
|
||||||
rebuild_targets = rebuild_targets
|
if rebuild_targets is not None:
|
||||||
if rebuild_targets:
|
#
|
||||||
def ifBuildLib(name, libname, old_value):
|
def ifBuildLib(name, libname, old_value):
|
||||||
# explicitly asked to rebuild
|
# explicitly asked to rebuild
|
||||||
if name in rebuild_targets:
|
if name in rebuild_targets:
|
||||||
@ -1503,6 +1534,19 @@ if rebuild_targets:
|
|||||||
build_qt2 = ifBuildLib('qt2', 'qt2', build_qt2)
|
build_qt2 = ifBuildLib('qt2', 'qt2', build_qt2)
|
||||||
build_qt3 = ifBuildLib('qt3', 'qt3', build_qt3)
|
build_qt3 = ifBuildLib('qt3', 'qt3', build_qt3)
|
||||||
build_qt4 = ifBuildLib('qt4', 'qt4', build_qt4)
|
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)
|
# sync frontend and frontend (maybe build qt4 with frontend=qt3)
|
||||||
if build_qt2:
|
if build_qt2:
|
||||||
@ -2020,6 +2064,12 @@ if build_client:
|
|||||||
else:
|
else:
|
||||||
client = None
|
client = None
|
||||||
Alias('client', client)
|
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:
|
if build_tex2lyx:
|
||||||
@ -2049,6 +2099,9 @@ if build_tex2lyx:
|
|||||||
Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
|
Alias('tex2lyx', env.Command(os.path.join('$BUILDDIR', os.path.split(str(tex2lyx[0]))[1]),
|
||||||
tex2lyx, [Copy('$TARGET', '$SOURCE')]))
|
tex2lyx, [Copy('$TARGET', '$SOURCE')]))
|
||||||
Alias('tex2lyx', tex2lyx)
|
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:
|
if build_lyxbase:
|
||||||
@ -2121,6 +2174,9 @@ if build_lyx:
|
|||||||
Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
|
Alias('lyx', env.Command(os.path.join('$BUILDDIR', target_name), lyx,
|
||||||
[Copy('$TARGET', '$SOURCE')]))
|
[Copy('$TARGET', '$SOURCE')]))
|
||||||
Alias('lyx', lyx)
|
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:
|
if build_msvs_projects:
|
||||||
|
Loading…
Reference in New Issue
Block a user