building.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. import os
  2. import sys
  3. import string
  4. from SCons.Script import *
  5. from utils import _make_path_relative
  6. BuildOptions = {}
  7. Projects = []
  8. Rtt_Root = ''
  9. Env = None
  10. class Win32Spawn:
  11. def spawn(self, sh, escape, cmd, args, env):
  12. import subprocess
  13. newargs = string.join(args[1:], ' ')
  14. cmdline = cmd + " " + newargs
  15. startupinfo = subprocess.STARTUPINFO()
  16. proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
  17. stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False)
  18. data, err = proc.communicate()
  19. rv = proc.wait()
  20. if data:
  21. print data
  22. if err:
  23. print err
  24. if rv:
  25. return rv
  26. return 0
  27. def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []):
  28. import SCons.cpp
  29. import rtconfig
  30. global BuildOptions
  31. global Projects
  32. global Env
  33. global Rtt_Root
  34. Env = env
  35. Rtt_Root = root_directory
  36. # add compability with Keil MDK 4.6 which changes the directory of armcc.exe
  37. if rtconfig.PLATFORM == 'armcc':
  38. if not os.path.isfile(os.path.join(rtconfig.EXEC_PATH, 'armcc.exe')):
  39. if rtconfig.EXEC_PATH.find('bin40') > 0:
  40. rtconfig.EXEC_PATH = rtconfig.EXEC_PATH.replace('bin40', 'armcc/bin')
  41. Env['LINKFLAGS']=Env['LINKFLAGS'].replace('RV31', 'armcc')
  42. # reset AR command flags
  43. env['ARCOM'] = '$AR --create $TARGET $SOURCES'
  44. env['LIBPREFIX'] = ''
  45. env['LIBSUFFIX'] = '.lib'
  46. env['LIBLINKPREFIX'] = ''
  47. env['LIBLINKSUFFIX'] = '.lib'
  48. env['LIBDIRPREFIX'] = '--userlibpath '
  49. # patch for win32 spawn
  50. if env['PLATFORM'] == 'win32' and rtconfig.PLATFORM == 'gcc':
  51. win32_spawn = Win32Spawn()
  52. win32_spawn.env = env
  53. env['SPAWN'] = win32_spawn.spawn
  54. if env['PLATFORM'] == 'win32':
  55. os.environ['PATH'] = rtconfig.EXEC_PATH + ";" + os.environ['PATH']
  56. else:
  57. os.environ['PATH'] = rtconfig.EXEC_PATH + ":" + os.environ['PATH']
  58. # add program path
  59. env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
  60. # add library build action
  61. act = SCons.Action.Action(BuildLibInstallAction, 'Install compiled library... $TARGET')
  62. bld = Builder(action = act)
  63. Env.Append(BUILDERS = {'BuildLib': bld})
  64. # parse rtconfig.h to get used component
  65. PreProcessor = SCons.cpp.PreProcessor()
  66. f = file('rtconfig.h', 'r')
  67. contents = f.read()
  68. f.close()
  69. PreProcessor.process_contents(contents)
  70. BuildOptions = PreProcessor.cpp_namespace
  71. # add copy option
  72. AddOption('--copy',
  73. dest='copy',
  74. action='store_true',
  75. default=False,
  76. help='copy rt-thread directory to local.')
  77. AddOption('--copy-header',
  78. dest='copy-header',
  79. action='store_true',
  80. default=False,
  81. help='copy header of rt-thread directory to local.')
  82. AddOption('--cscope',
  83. dest='cscope',
  84. action='store_true',
  85. default=False,
  86. help='Build Cscope cross reference database. Requires cscope installed.')
  87. AddOption('--clang-analyzer',
  88. dest='clang-analyzer',
  89. action='store_true',
  90. default=False,
  91. help='Perform static analyze with Clang-analyzer. '+\
  92. 'Requires Clang installed.\n'+\
  93. 'It is recommended to use with scan-build like this:\n'+\
  94. '`scan-build scons --clang-analyzer`\n'+\
  95. 'If things goes well, scan-build will instruct you to invoke scan-view.')
  96. if GetOption('clang-analyzer'):
  97. # perform what scan-build does
  98. env.Replace(
  99. CC = 'ccc-analyzer',
  100. CXX = 'c++-analyzer',
  101. # skip as and link
  102. LINK = 'true',
  103. AS = 'true',)
  104. env["ENV"].update(x for x in os.environ.items() if x[0].startswith("CCC_"))
  105. # only check, don't compile. ccc-analyzer use CCC_CC as the CC.
  106. # fsyntax-only will give us some additional warning messages
  107. env['ENV']['CCC_CC'] = 'clang'
  108. env.Append(CFLAGS=['-fsyntax-only', '-Wall', '-Wno-invalid-source-encoding'])
  109. env['ENV']['CCC_CXX'] = 'clang++'
  110. env.Append(CXXFLAGS=['-fsyntax-only', '-Wall', '-Wno-invalid-source-encoding'])
  111. # remove the POST_ACTION as it will cause meaningless errors(file not
  112. # found or something like that).
  113. rtconfig.POST_ACTION = ''
  114. # add build library option
  115. AddOption('--buildlib',
  116. dest='buildlib',
  117. type='string',
  118. help='building library of a component')
  119. AddOption('--cleanlib',
  120. dest='cleanlib',
  121. action='store_true',
  122. default=False,
  123. help='clean up the library by --buildlib')
  124. # add target option
  125. AddOption('--target',
  126. dest='target',
  127. type='string',
  128. help='set target project: mdk/iar/vs')
  129. #{target_name:(CROSS_TOOL, PLATFORM)}
  130. tgt_dict = {'mdk':('keil', 'armcc'),
  131. 'mdk4':('keil', 'armcc'),
  132. 'iar':('iar', 'iar'),
  133. 'vs':('msvc', 'cl'),
  134. 'vs2012':('msvc', 'cl'),
  135. 'cb':('keil', 'armcc')}
  136. tgt_name = GetOption('target')
  137. if tgt_name:
  138. # --target will change the toolchain settings which clang-analyzer is
  139. # depend on
  140. if GetOption('clang-analyzer'):
  141. print '--clang-analyzer cannot be used with --target'
  142. sys.exit(1)
  143. SetOption('no_exec', 1)
  144. try:
  145. rtconfig.CROSS_TOOL, rtconfig.PLATFORM = tgt_dict[tgt_name]
  146. except KeyError:
  147. print 'Unknow target: %s. Avaible targets: %s' % \
  148. (tgt_name, ', '.join(tgt_dict.keys()))
  149. sys.exit(1)
  150. elif (GetDepend('RT_USING_NEWLIB') == False and GetDepend('RT_USING_NOLIBC') == False) \
  151. and rtconfig.PLATFORM == 'gcc':
  152. AddDepend('RT_USING_MINILIBC')
  153. # add comstr option
  154. AddOption('--verbose',
  155. dest='verbose',
  156. action='store_true',
  157. default=False,
  158. help='print verbose information during build')
  159. if not GetOption('verbose'):
  160. # override the default verbose command string
  161. env.Replace(
  162. ARCOMSTR = 'AR $TARGET',
  163. ASCOMSTR = 'AS $TARGET',
  164. ASPPCOMSTR = 'AS $TARGET',
  165. CCCOMSTR = 'CC $TARGET',
  166. CXXCOMSTR = 'CXX $TARGET',
  167. LINKCOMSTR = 'LINK $TARGET'
  168. )
  169. # board build script
  170. objs = SConscript('SConscript', variant_dir='build', duplicate=0)
  171. Repository(Rtt_Root)
  172. # include kernel
  173. objs.extend(SConscript(Rtt_Root + '/src/SConscript', variant_dir='build/src', duplicate=0))
  174. # include libcpu
  175. if not has_libcpu:
  176. objs.extend(SConscript(Rtt_Root + '/libcpu/SConscript', variant_dir='build/libcpu', duplicate=0))
  177. # include components
  178. objs.extend(SConscript(Rtt_Root + '/components/SConscript',
  179. variant_dir='build/components',
  180. duplicate=0,
  181. exports='remove_components'))
  182. return objs
  183. def PrepareModuleBuilding(env, root_directory):
  184. import SCons.cpp
  185. import rtconfig
  186. global BuildOptions
  187. global Projects
  188. global Env
  189. global Rtt_Root
  190. Env = env
  191. Rtt_Root = root_directory
  192. # add program path
  193. env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
  194. def GetConfigValue(name):
  195. assert type(name) == str, 'GetConfigValue: only string parameter is valid'
  196. try:
  197. return BuildOptions[name]
  198. except:
  199. return ''
  200. def GetDepend(depend):
  201. building = True
  202. if type(depend) == type('str'):
  203. if not BuildOptions.has_key(depend) or BuildOptions[depend] == 0:
  204. building = False
  205. elif BuildOptions[depend] != '':
  206. return BuildOptions[depend]
  207. return building
  208. # for list type depend
  209. for item in depend:
  210. if item != '':
  211. if not BuildOptions.has_key(item) or BuildOptions[item] == 0:
  212. building = False
  213. return building
  214. def AddDepend(option):
  215. BuildOptions[option] = 1
  216. def MergeGroup(src_group, group):
  217. src_group['src'] = src_group['src'] + group['src']
  218. if group.has_key('CCFLAGS'):
  219. if src_group.has_key('CCFLAGS'):
  220. src_group['CCFLAGS'] = src_group['CCFLAGS'] + group['CCFLAGS']
  221. else:
  222. src_group['CCFLAGS'] = group['CCFLAGS']
  223. if group.has_key('CPPPATH'):
  224. if src_group.has_key('CPPPATH'):
  225. src_group['CPPPATH'] = src_group['CPPPATH'] + group['CPPPATH']
  226. else:
  227. src_group['CPPPATH'] = group['CPPPATH']
  228. if group.has_key('CPPDEFINES'):
  229. if src_group.has_key('CPPDEFINES'):
  230. src_group['CPPDEFINES'] = src_group['CPPDEFINES'] + group['CPPDEFINES']
  231. else:
  232. src_group['CPPDEFINES'] = group['CPPDEFINES']
  233. if group.has_key('LINKFLAGS'):
  234. if src_group.has_key('LINKFLAGS'):
  235. src_group['LINKFLAGS'] = src_group['LINKFLAGS'] + group['LINKFLAGS']
  236. else:
  237. src_group['LINKFLAGS'] = group['LINKFLAGS']
  238. if group.has_key('LIBS'):
  239. if src_group.has_key('LIBS'):
  240. src_group['LIBS'] = src_group['LIBS'] + group['LIBS']
  241. else:
  242. src_group['LIBS'] = group['LIBS']
  243. if group.has_key('LIBPATH'):
  244. if src_group.has_key('LIBPATH'):
  245. src_group['LIBPATH'] = src_group['LIBPATH'] + group['LIBPATH']
  246. else:
  247. src_group['LIBPATH'] = group['LIBPATH']
  248. if src_group.has_key('LIBS'):
  249. print src_group['LIBS']
  250. if src_group.has_key('LIBS'):
  251. print src_group['LIBPATH']
  252. def DefineGroup(name, src, depend, **parameters):
  253. global Env
  254. if not GetDepend(depend):
  255. return []
  256. # find exist group and get path of group
  257. group_path = ''
  258. for g in Projects:
  259. if g['name'] == name:
  260. group_path = g['path']
  261. if group_path == '':
  262. group_path = GetCurrentDir()
  263. group = parameters
  264. group['name'] = name
  265. group['path'] = group_path
  266. if type(src) == type(['src1']):
  267. group['src'] = File(src)
  268. else:
  269. group['src'] = src
  270. if group.has_key('CCFLAGS'):
  271. Env.Append(CCFLAGS = group['CCFLAGS'])
  272. if group.has_key('CPPPATH'):
  273. Env.Append(CPPPATH = group['CPPPATH'])
  274. if group.has_key('CPPDEFINES'):
  275. Env.Append(CPPDEFINES = group['CPPDEFINES'])
  276. if group.has_key('LINKFLAGS'):
  277. Env.Append(LINKFLAGS = group['LINKFLAGS'])
  278. # check whether to clean up library
  279. if GetOption('cleanlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
  280. if group['src'] != []:
  281. print 'Remove library:', GroupLibFullName(name, Env)
  282. do_rm_file(os.path.join(group['path'], GroupLibFullName(name, Env)))
  283. # check whether exist group library
  284. if not GetOption('buildlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
  285. group['src'] = []
  286. if group.has_key('LIBS'): group['LIBS'] = group['LIBS'] + [GroupLibName(name, Env)]
  287. else : group['LIBS'] = [GroupLibName(name, Env)]
  288. if group.has_key('LIBPATH'): group['LIBPATH'] = group['LIBPATH'] + [GetCurrentDir()]
  289. else : group['LIBPATH'] = [GetCurrentDir()]
  290. if group.has_key('LIBS'):
  291. Env.Append(LIBS = group['LIBS'])
  292. if group.has_key('LIBPATH'):
  293. Env.Append(LIBPATH = group['LIBPATH'])
  294. objs = Env.Object(group['src'])
  295. if group.has_key('LIBRARY'):
  296. objs = Env.Library(name, objs)
  297. # merge group
  298. for g in Projects:
  299. if g['name'] == name:
  300. # merge to this group
  301. MergeGroup(g, group)
  302. return objs
  303. # add a new group
  304. Projects.append(group)
  305. return objs
  306. def GetCurrentDir():
  307. conscript = File('SConscript')
  308. fn = conscript.rfile()
  309. name = fn.name
  310. path = os.path.dirname(fn.abspath)
  311. return path
  312. PREBUILDING = []
  313. def RegisterPreBuildingAction(act):
  314. global PREBUILDING
  315. assert callable(act), 'Could only register callable objects. %s received' % repr(act)
  316. PREBUILDING.append(act)
  317. def PreBuilding():
  318. global PREBUILDING
  319. for a in PREBUILDING:
  320. a()
  321. def GroupLibName(name, env):
  322. import rtconfig
  323. if rtconfig.PLATFORM == 'armcc':
  324. return name + '_rvds'
  325. elif rtconfig.PLATFORM == 'gcc':
  326. return name + '_gcc'
  327. return name
  328. def GroupLibFullName(name, env):
  329. return env['LIBPREFIX'] + GroupLibName(name, env) + env['LIBSUFFIX']
  330. def BuildLibInstallAction(target, source, env):
  331. lib_name = GetOption('buildlib')
  332. for Group in Projects:
  333. if Group['name'] == lib_name:
  334. lib_name = GroupLibFullName(Group['name'], env)
  335. dst_name = os.path.join(Group['path'], lib_name)
  336. print 'Copy %s => %s' % (lib_name, dst_name)
  337. do_copy_file(lib_name, dst_name)
  338. break
  339. def DoBuilding(target, objects):
  340. program = None
  341. # check whether special buildlib option
  342. lib_name = GetOption('buildlib')
  343. if lib_name:
  344. # build library with special component
  345. for Group in Projects:
  346. if Group['name'] == lib_name:
  347. lib_name = GroupLibName(Group['name'], Env)
  348. objects = Env.Object(Group['src'])
  349. program = Env.Library(lib_name, objects)
  350. # add library copy action
  351. Env.BuildLib(lib_name, program)
  352. break
  353. else:
  354. # merge the repeated items in the Env
  355. if Env.has_key('CPPPATH') : Env['CPPPATH'] = list(set(Env['CPPPATH']))
  356. if Env.has_key('CPPDEFINES'): Env['CPPDEFINES'] = list(set(Env['CPPDEFINES']))
  357. if Env.has_key('LIBPATH') : Env['LIBPATH'] = list(set(Env['LIBPATH']))
  358. if Env.has_key('LIBS') : Env['LIBS'] = list(set(Env['LIBS']))
  359. program = Env.Program(target, objects)
  360. EndBuilding(target, program)
  361. def EndBuilding(target, program = None):
  362. import rtconfig
  363. from keil import MDKProject
  364. from keil import MDK4Project
  365. from iar import IARProject
  366. from vs import VSProject
  367. from vs2012 import VS2012Project
  368. from codeblocks import CBProject
  369. Env.AddPostAction(target, rtconfig.POST_ACTION)
  370. if GetOption('target') == 'mdk':
  371. template = os.path.isfile('template.Uv2')
  372. if template:
  373. MDKProject('project.Uv2', Projects)
  374. else:
  375. template = os.path.isfile('template.uvproj')
  376. if template:
  377. MDK4Project('project.uvproj', Projects)
  378. else:
  379. print 'No template project file found.'
  380. if GetOption('target') == 'mdk4':
  381. MDK4Project('project.uvproj', Projects)
  382. if GetOption('target') == 'iar':
  383. IARProject('project.ewp', Projects)
  384. if GetOption('target') == 'vs':
  385. VSProject('project.vcproj', Projects, program)
  386. if GetOption('target') == 'vs2012':
  387. VS2012Project('project.vcxproj', Projects, program)
  388. if GetOption('target') == 'cb':
  389. CBProject('project.cbp', Projects, program)
  390. if GetOption('copy') and program != None:
  391. MakeCopy(program)
  392. if GetOption('copy-header') and program != None:
  393. MakeCopyHeader(program)
  394. if GetOption('cscope'):
  395. from cscope import CscopeDatabase
  396. CscopeDatabase(Projects)
  397. def SrcRemove(src, remove):
  398. if type(src[0]) == type('str'):
  399. for item in src:
  400. if os.path.basename(item) in remove:
  401. src.remove(item)
  402. return
  403. for item in src:
  404. if os.path.basename(item.rstr()) in remove:
  405. src.remove(item)
  406. def GetVersion():
  407. import SCons.cpp
  408. import string
  409. rtdef = os.path.join(Rtt_Root, 'include', 'rtdef.h')
  410. # parse rtdef.h to get RT-Thread version
  411. prepcessor = SCons.cpp.PreProcessor()
  412. f = file(rtdef, 'r')
  413. contents = f.read()
  414. f.close()
  415. prepcessor.process_contents(contents)
  416. def_ns = prepcessor.cpp_namespace
  417. version = int(filter(lambda ch: ch in '0123456789.', def_ns['RT_VERSION']))
  418. subversion = int(filter(lambda ch: ch in '0123456789.', def_ns['RT_SUBVERSION']))
  419. if def_ns.has_key('RT_REVISION'):
  420. revision = int(filter(lambda ch: ch in '0123456789.', def_ns['RT_REVISION']))
  421. return '%d.%d.%d' % (version, subversion, revision)
  422. return '0.%d.%d' % (version, subversion)
  423. def GlobSubDir(sub_dir, ext_name):
  424. import os
  425. import glob
  426. def glob_source(sub_dir, ext_name):
  427. list = os.listdir(sub_dir)
  428. src = glob.glob(os.path.join(sub_dir, ext_name))
  429. for item in list:
  430. full_subdir = os.path.join(sub_dir, item)
  431. if os.path.isdir(full_subdir):
  432. src += glob_source(full_subdir, ext_name)
  433. return src
  434. dst = []
  435. src = glob_source(sub_dir, ext_name)
  436. for item in src:
  437. dst.append(os.path.relpath(item, sub_dir))
  438. return dst
  439. def file_path_exist(path, *args):
  440. return os.path.exists(os.path.join(path, *args))
  441. def do_rm_file(src):
  442. if os.path.exists(src):
  443. os.unlink(src)
  444. def do_copy_file(src, dst):
  445. import shutil
  446. # check source file
  447. if not os.path.exists(src):
  448. return
  449. path = os.path.dirname(dst)
  450. # mkdir if path not exist
  451. if not os.path.exists(path):
  452. os.makedirs(path)
  453. shutil.copy2(src, dst)
  454. def do_copy_folder(src_dir, dst_dir):
  455. import shutil
  456. # check source directory
  457. if not os.path.exists(src_dir):
  458. return
  459. if os.path.exists(dst_dir):
  460. shutil.rmtree(dst_dir)
  461. shutil.copytree(src_dir, dst_dir)
  462. source_ext = ["c", "h", "s", "S", "cpp", "xpm"]
  463. source_list = []
  464. def walk_children(child):
  465. global source_list
  466. global source_ext
  467. # print child
  468. full_path = child.rfile().abspath
  469. file_type = full_path.rsplit('.',1)[1]
  470. #print file_type
  471. if file_type in source_ext:
  472. if full_path not in source_list:
  473. source_list.append(full_path)
  474. children = child.all_children()
  475. if children != []:
  476. for item in children:
  477. walk_children(item)
  478. def MakeCopy(program):
  479. global source_list
  480. global Rtt_Root
  481. global Env
  482. target_path = os.path.join(Dir('#').abspath, 'rt-thread')
  483. if Env['PLATFORM'] == 'win32':
  484. RTT_ROOT = Rtt_Root.lower()
  485. else:
  486. RTT_ROOT = Rtt_Root
  487. if target_path.startswith(RTT_ROOT):
  488. return
  489. for item in program:
  490. walk_children(item)
  491. source_list.sort()
  492. # filte source file in RT-Thread
  493. target_list = []
  494. for src in source_list:
  495. if Env['PLATFORM'] == 'win32':
  496. src = src.lower()
  497. if src.startswith(RTT_ROOT):
  498. target_list.append(src)
  499. source_list = target_list
  500. # get source path
  501. src_dir = []
  502. for src in source_list:
  503. src = src.replace(RTT_ROOT, '')
  504. if src[0] == os.sep or src[0] == '/':
  505. src = src[1:]
  506. path = os.path.dirname(src)
  507. sub_path = path.split(os.sep)
  508. full_path = RTT_ROOT
  509. for item in sub_path:
  510. full_path = os.path.join(full_path, item)
  511. if full_path not in src_dir:
  512. src_dir.append(full_path)
  513. for item in src_dir:
  514. source_list.append(os.path.join(item, 'SConscript'))
  515. for src in source_list:
  516. dst = src.replace(RTT_ROOT, '')
  517. if dst[0] == os.sep or dst[0] == '/':
  518. dst = dst[1:]
  519. print '=> ', dst
  520. dst = os.path.join(target_path, dst)
  521. do_copy_file(src, dst)
  522. # copy tools directory
  523. print "=> tools"
  524. do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools"))
  525. do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
  526. do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING'))
  527. def MakeCopyHeader(program):
  528. global source_ext
  529. source_ext = []
  530. source_ext = ["h", "xpm"]
  531. global source_list
  532. global Rtt_Root
  533. global Env
  534. target_path = os.path.join(Dir('#').abspath, 'rt-thread')
  535. if Env['PLATFORM'] == 'win32':
  536. RTT_ROOT = Rtt_Root.lower()
  537. else:
  538. RTT_ROOT = Rtt_Root
  539. if target_path.startswith(RTT_ROOT):
  540. return
  541. for item in program:
  542. walk_children(item)
  543. source_list.sort()
  544. # filte source file in RT-Thread
  545. target_list = []
  546. for src in source_list:
  547. if Env['PLATFORM'] == 'win32':
  548. src = src.lower()
  549. if src.startswith(RTT_ROOT):
  550. target_list.append(src)
  551. source_list = target_list
  552. for src in source_list:
  553. dst = src.replace(RTT_ROOT, '')
  554. if dst[0] == os.sep or dst[0] == '/':
  555. dst = dst[1:]
  556. print '=> ', dst
  557. dst = os.path.join(target_path, dst)
  558. do_copy_file(src, dst)
  559. # copy tools directory
  560. print "=> tools"
  561. do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools"))
  562. do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
  563. do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING'))