summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarmink <[email protected]>2018-06-23 10:07:48 +0800
committerarmink <[email protected]>2018-06-23 12:04:17 +0800
commitdbe8e60fcc55f3376e0a43d8c04ffda0461f79e3 (patch)
tree3ba9ae935307ea260faba0a88fa13cdebabb4c1c
parentb7f7d6e6b246d4f1460ecb87413dd5786cea7a74 (diff)
[tools] Change the generate cconfig.h code position for fix the 'scons --target=cc' problem.
-rw-r--r--tools/building.py276
1 files changed, 128 insertions, 148 deletions
diff --git a/tools/building.py b/tools/building.py
index df21a31319..8fa1f96331 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -112,37 +112,33 @@ class Win32Spawn:
return proc.wait()
-# auto fix the 'RTT_CC' and 'RTT_EXEC_PATH'
-# when using 'scons --target=cc' the 'RTT_CC' will set to 'cc'
-# it will fix the the 'rtconfig.EXEC_PATH' when get it failed.
-# NOTE: this function will changed your env. Please backup the env before used it.
-def AutoFixRttCCAndExecPath():
+# generate cconfig.h file
+def GenCconfigFile(env, BuildOptions):
import rtconfig
- target_option = None
+
+ if rtconfig.PLATFORM == 'gcc':
+ contents = ''
+ if not os.path.isfile('cconfig.h'):
+ import gcc
+ gcc.GenerateGCCConfig(rtconfig)
- # get --target=cc option
- if len(sys.argv) > 1:
- option = sys.argv[1].split('=')
- if len(option) > 1 and option[0] == '--target':
- target_option = option[1]
+ # try again
+ if os.path.isfile('cconfig.h'):
+ f = file('cconfig.h', 'r')
+ if f:
+ contents = f.read()
+ f.close();
- # force change the 'RTT_CC' when using 'scons --target=cc'
- if target_option:
- if target_option == 'mdk' or target_option == 'mdk4' or target_option == 'mdk5':
- os.environ['RTT_CC'] = 'keil'
- elif target_option == 'iar':
- os.environ['RTT_CC'] = 'iar'
+ prep = PatchedPreProcessor()
+ prep.process_contents(contents)
+ options = prep.cpp_namespace
- # auto change the 'RTT_EXEC_PATH' when 'rtconfig.EXEC_PATH' get failed
- reload(rtconfig)
- if not os.path.exists(rtconfig.EXEC_PATH):
- if os.environ['RTT_EXEC_PATH']:
- # del the 'RTT_EXEC_PATH' and using the 'EXEC_PATH' setting on rtconfig.py
- del os.environ['RTT_EXEC_PATH']
- reload(rtconfig)
+ BuildOptions.update(options)
+
+ # add HAVE_CCONFIG_H definition
+ env.AppendUnique(CPPDEFINES = ['HAVE_CCONFIG_H'])
def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []):
- import SCons.cpp
import rtconfig
global BuildOptions
@@ -150,6 +146,64 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
global Env
global Rtt_Root
+ # ===== Add option to SCons =====
+ AddOption('--copy',
+ dest = 'copy',
+ action = 'store_true',
+ default = False,
+ help = 'copy rt-thread directory to local.')
+ AddOption('--copy-header',
+ dest = 'copy-header',
+ action = 'store_true',
+ default = False,
+ help = 'copy header of rt-thread directory to local.')
+ AddOption('--dist',
+ dest = 'make-dist',
+ action = 'store_true',
+ default = False,
+ help = 'make distribution')
+ AddOption('--cscope',
+ dest = 'cscope',
+ action = 'store_true',
+ default = False,
+ help = 'Build Cscope cross reference database. Requires cscope installed.')
+ AddOption('--clang-analyzer',
+ dest = 'clang-analyzer',
+ action = 'store_true',
+ default = False,
+ help = 'Perform static analyze with Clang-analyzer. ' + \
+ 'Requires Clang installed.\n' + \
+ 'It is recommended to use with scan-build like this:\n' + \
+ '`scan-build scons --clang-analyzer`\n' + \
+ 'If things goes well, scan-build will instruct you to invoke scan-view.')
+ AddOption('--buildlib',
+ dest = 'buildlib',
+ type = 'string',
+ help = 'building library of a component')
+ AddOption('--cleanlib',
+ dest = 'cleanlib',
+ action = 'store_true',
+ default = False,
+ help = 'clean up the library by --buildlib')
+ AddOption('--target',
+ dest = 'target',
+ type = 'string',
+ help = 'set target project: mdk/mdk4/mdk5/iar/vs/vsc/ua/cdk')
+ AddOption('--genconfig',
+ dest = 'genconfig',
+ action = 'store_true',
+ default = False,
+ help = 'Generate .config from rtconfig.h')
+ AddOption('--useconfig',
+ dest = 'useconfig',
+ type = 'string',
+ help = 'make rtconfig.h from config file.')
+ AddOption('--verbose',
+ dest = 'verbose',
+ action = 'store_true',
+ default = False,
+ help = 'print verbose information during build')
+
Env = env
Rtt_Root = os.path.abspath(root_directory)
# set RTT_ROOT in ENV
@@ -159,22 +213,60 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
sys.path = sys.path + [os.path.join(Rtt_Root, 'tools')]
- # auto fix the 'RTT_CC' and 'RTT_EXEC_PATH'
- AutoFixRttCCAndExecPath()
+ # {target_name:(CROSS_TOOL, PLATFORM)}
+ tgt_dict = {'mdk':('keil', 'armcc'),
+ 'mdk4':('keil', 'armcc'),
+ 'mdk5':('keil', 'armcc'),
+ 'iar':('iar', 'iar'),
+ 'vs':('msvc', 'cl'),
+ 'vs2012':('msvc', 'cl'),
+ 'vsc' : ('gcc', 'gcc'),
+ 'cb':('keil', 'armcc'),
+ 'ua':('gcc', 'gcc'),
+ 'cdk':('gcc', 'gcc')}
+ tgt_name = GetOption('target')
+
+ if tgt_name:
+ # --target will change the toolchain settings which clang-analyzer is
+ # depend on
+ if GetOption('clang-analyzer'):
+ print '--clang-analyzer cannot be used with --target'
+ sys.exit(1)
+
+ SetOption('no_exec', 1)
+ try:
+ rtconfig.CROSS_TOOL, rtconfig.PLATFORM = tgt_dict[tgt_name]
+ # replace the 'RTT_CC' to 'CROSS_TOOL'
+ os.environ['RTT_CC'] = rtconfig.CROSS_TOOL
+ reload(rtconfig)
+ except KeyError:
+ print 'Unknow target: %s. Avaible targets: %s' % \
+ (tgt_name, ', '.join(tgt_dict.keys()))
+ sys.exit(1)
+ elif (GetDepend('RT_USING_NEWLIB') == False and GetDepend('RT_USING_NOLIBC') == False) \
+ and rtconfig.PLATFORM == 'gcc':
+ AddDepend('RT_USING_MINILIBC')
+
+ # auto change the 'RTT_EXEC_PATH' when 'rtconfig.EXEC_PATH' get failed
+ if not os.path.exists(rtconfig.EXEC_PATH):
+ if os.environ['RTT_EXEC_PATH']:
+ # del the 'RTT_EXEC_PATH' and using the 'EXEC_PATH' setting on rtconfig.py
+ del os.environ['RTT_EXEC_PATH']
+ reload(rtconfig)
# add compability with Keil MDK 4.6 which changes the directory of armcc.exe
if rtconfig.PLATFORM == 'armcc':
if not os.path.isfile(os.path.join(rtconfig.EXEC_PATH, 'armcc.exe')):
if rtconfig.EXEC_PATH.find('bin40') > 0:
rtconfig.EXEC_PATH = rtconfig.EXEC_PATH.replace('bin40', 'armcc/bin')
- Env['LINKFLAGS']=Env['LINKFLAGS'].replace('RV31', 'armcc')
+ Env['LINKFLAGS'] = Env['LINKFLAGS'].replace('RV31', 'armcc')
# reset AR command flags
env['ARCOM'] = '$AR --create $TARGET $SOURCES'
- env['LIBPREFIX'] = ''
- env['LIBSUFFIX'] = '.lib'
+ env['LIBPREFIX'] = ''
+ env['LIBSUFFIX'] = '.lib'
env['LIBLINKPREFIX'] = ''
- env['LIBLINKSUFFIX'] = '.lib'
+ env['LIBLINKSUFFIX'] = '.lib'
env['LIBDIRPREFIX'] = '--userlibpath '
# patch for win32 spawn
@@ -206,62 +298,6 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
PreProcessor.process_contents(contents)
BuildOptions = PreProcessor.cpp_namespace
- if rtconfig.PLATFORM == 'gcc':
- contents = ''
- if not os.path.isfile('cconfig.h'):
- import gcc
- gcc.GenerateGCCConfig(rtconfig)
-
- # try again
- if os.path.isfile('cconfig.h'):
- f = file('cconfig.h', 'r')
- if f:
- contents = f.read()
- f.close();
-
- prep = PatchedPreProcessor()
- prep.process_contents(contents)
- options = prep.cpp_namespace
-
- BuildOptions.update(options)
-
- # add HAVE_CCONFIG_H definition
- env.AppendUnique(CPPDEFINES = ['HAVE_CCONFIG_H'])
-
- if str(env['LINKFLAGS']).find('nano.specs') != -1:
- env.AppendUnique(CPPDEFINES = ['_REENT_SMALL'])
-
- # add copy option
- AddOption('--copy',
- dest='copy',
- action='store_true',
- default=False,
- help='copy rt-thread directory to local.')
- AddOption('--copy-header',
- dest='copy-header',
- action='store_true',
- default=False,
- help='copy header of rt-thread directory to local.')
- AddOption('--dist',
- dest = 'make-dist',
- action = 'store_true',
- default=False,
- help = 'make distribution')
- AddOption('--cscope',
- dest='cscope',
- action='store_true',
- default=False,
- help='Build Cscope cross reference database. Requires cscope installed.')
- AddOption('--clang-analyzer',
- dest='clang-analyzer',
- action='store_true',
- default=False,
- help='Perform static analyze with Clang-analyzer. '+\
- 'Requires Clang installed.\n'+\
- 'It is recommended to use with scan-build like this:\n'+\
- '`scan-build scons --clang-analyzer`\n'+\
- 'If things goes well, scan-build will instruct you to invoke scan-view.')
-
if GetOption('clang-analyzer'):
# perform what scan-build does
env.Replace(
@@ -281,59 +317,13 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
# found or something like that).
rtconfig.POST_ACTION = ''
- # add build library option
- AddOption('--buildlib',
- dest='buildlib',
- type='string',
- help='building library of a component')
- AddOption('--cleanlib',
- dest='cleanlib',
- action='store_true',
- default=False,
- help='clean up the library by --buildlib')
-
- # add target option
- AddOption('--target',
- dest='target',
- type='string',
- help='set target project: mdk/mdk4/mdk5/iar/vs/vsc/ua/cdk')
+ # generate cconfig.h file
+ GenCconfigFile(env, BuildOptions)
- #{target_name:(CROSS_TOOL, PLATFORM)}
- tgt_dict = {'mdk':('keil', 'armcc'),
- 'mdk4':('keil', 'armcc'),
- 'mdk5':('keil', 'armcc'),
- 'iar':('iar', 'iar'),
- 'vs':('msvc', 'cl'),
- 'vs2012':('msvc', 'cl'),
- 'vsc' : ('gcc', 'gcc'),
- 'cb':('keil', 'armcc'),
- 'ua':('gcc', 'gcc'),
- 'cdk':('gcc', 'gcc')}
- tgt_name = GetOption('target')
-
- if tgt_name:
- # --target will change the toolchain settings which clang-analyzer is
- # depend on
- if GetOption('clang-analyzer'):
- print '--clang-analyzer cannot be used with --target'
- sys.exit(1)
+ # auto append '_REENT_SMALL' when using newlib 'nano.specs' option
+ if rtconfig.PLATFORM == 'gcc' and str(env['LINKFLAGS']).find('nano.specs') != -1:
+ env.AppendUnique(CPPDEFINES = ['_REENT_SMALL'])
- SetOption('no_exec', 1)
- try:
- rtconfig.CROSS_TOOL, rtconfig.PLATFORM = tgt_dict[tgt_name]
- except KeyError:
- print 'Unknow target: %s. Avaible targets: %s' % \
- (tgt_name, ', '.join(tgt_dict.keys()))
- sys.exit(1)
- elif (GetDepend('RT_USING_NEWLIB') == False and GetDepend('RT_USING_NOLIBC') == False) \
- and rtconfig.PLATFORM == 'gcc':
- AddDepend('RT_USING_MINILIBC')
-
- AddOption('--genconfig',
- dest = 'genconfig',
- action = 'store_true',
- default = False,
- help = 'Generate .config from rtconfig.h')
if GetOption('genconfig'):
from genconf import genconfig
genconfig()
@@ -350,22 +340,12 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
menuconfig(Rtt_Root)
exit(0)
- AddOption('--useconfig',
- dest = 'useconfig',
- type='string',
- help = 'make rtconfig.h from config file.')
configfn = GetOption('useconfig')
if configfn:
from menuconfig import mk_rtconfig
mk_rtconfig(configfn)
exit(0)
- # add comstr option
- AddOption('--verbose',
- dest='verbose',
- action='store_true',
- default=False,
- help='print verbose information during build')
if not GetOption('verbose'):
# override the default verbose command string