SConstruct 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import os
  2. import sys
  3. import rtconfig
  4. if os.getenv('RTT_ROOT'):
  5. RTT_ROOT = os.getenv('RTT_ROOT')
  6. else:
  7. RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
  8. sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
  9. try:
  10. from building import *
  11. except:
  12. print('Cannot found RT-Thread root directory, please check RTT_ROOT')
  13. print(RTT_ROOT)
  14. exit(-1)
  15. if os.getenv('EMBARC_BSP_ROOT'):
  16. EMBARC_BSP_ROOT = os.getenv('EMBARC_BSP_ROOT')
  17. else:
  18. EMBARC_BSP_ROOT = RTT_ROOT + '/bsp/synopsys/boards/packages/embARC_bsp-upstream'
  19. if not os.path.isdir(EMBARC_BSP_ROOT):
  20. print('Cannot found embarc_bsp root directory, please check EMBARC_BSP_ROOT')
  21. print(EMBARC_BSP_ROOT)
  22. exit(-1)
  23. SUPPORTED_BOARD_DIR = EMBARC_BSP_ROOT + '/board'
  24. SUPPORTED_BOARD = [d for d in os.listdir(SUPPORTED_BOARD_DIR) if os.path.isdir(os.path.join(SUPPORTED_BOARD_DIR,d))]
  25. print 'supported BOARD = ' + str(SUPPORTED_BOARD)
  26. AddOption('--BOARD',
  27. dest = 'BOARD',
  28. type='string',
  29. nargs=1,
  30. action = 'store',
  31. default = 'emsk',
  32. help = 'select board')
  33. AddOption('--BD_VER',
  34. dest = 'BD_VER',
  35. type='string',
  36. nargs=1,
  37. action = 'store',
  38. default = '23',
  39. help = 'select bd_ver')
  40. AddOption('--CUR_CORE',
  41. dest = 'CUR_CORE',
  42. type='string',
  43. nargs=1,
  44. action = 'store',
  45. default = 'arcem9d',
  46. help = 'select cur_core')
  47. AddOption('--TOOLCHAIN',
  48. dest = 'TOOLCHAIN',
  49. type='string',
  50. nargs=1,
  51. action = 'store',
  52. default = 'gnu',
  53. help = 'select toolchain')
  54. AddOption('--OLEVEL',
  55. dest = 'OLEVEL',
  56. type='string',
  57. nargs=1,
  58. action = 'store',
  59. default = 'O2',
  60. help = 'select optimize level')
  61. AddOption('--mdb',
  62. dest = 'mdb',
  63. action = 'store_true',
  64. default = False,
  65. help = 'use mdb to debug the elf')
  66. AddOption('--gdb',
  67. dest = 'gdb',
  68. action = 'store_true',
  69. default = False,
  70. help = 'use gdb to debug the elf')
  71. AddOption('--embarc_build',
  72. dest = 'embarc_build',
  73. action = 'store_true',
  74. default = False,
  75. help = 'to generate embarc_lib')
  76. AddOption('--embarc_clean',
  77. dest = 'embarc_clean',
  78. action = 'store_true',
  79. default = False,
  80. help = 'to clean embarc_lib')
  81. if GetOption('BOARD'):
  82. board = GetOption('BOARD')
  83. if board not in SUPPORTED_BOARD:
  84. print 'board %s not supported, available boards:' % board
  85. print SUPPORTED_BOARD
  86. exit(0)
  87. else:
  88. BOARD = board
  89. print 'get BOARD = [%s]' % board
  90. if BOARD == 'emsdp':
  91. SUPPORTED_BD_VER = ['rev2']
  92. else:
  93. SUPPORTED_BD_VER_DIR = SUPPORTED_BOARD_DIR + '/' + BOARD + '/configs'
  94. SUPPORTED_BD_VER = [d for d in os.listdir(SUPPORTED_BD_VER_DIR) if os.path.isdir(os.path.join(SUPPORTED_BD_VER_DIR,d))]
  95. print 'supported BD_VER = ' + str(SUPPORTED_BD_VER)
  96. if GetOption('BD_VER'):
  97. bd_ver = GetOption('BD_VER')
  98. if bd_ver not in SUPPORTED_BD_VER:
  99. print 'bd_ver %s not supported, available bd_ver:' % bd_ver
  100. print SUPPORTED_BD_VER
  101. exit(0)
  102. else:
  103. BD_VER = bd_ver
  104. print 'get BD_VER = [%s]' % BD_VER
  105. if BOARD == 'emsdp':
  106. SUPPORTED_CORE_DIR = SUPPORTED_BOARD_DIR + '/' + BOARD + '/rev2/configs'
  107. SUPPORTED_CORE = [d for d in os.listdir(SUPPORTED_CORE_DIR) if os.path.isdir(os.path.join(SUPPORTED_CORE_DIR,d))]
  108. else:
  109. SUPPORTED_CORE_DIR = SUPPORTED_BD_VER_DIR + '/' + BD_VER + '/tcf'
  110. SUPPORTED_CORE = [os.path.splitext(d)[0] for d in os.listdir(SUPPORTED_CORE_DIR)]
  111. print 'supported CUR_CORE = ' + str(SUPPORTED_CORE)
  112. if GetOption('CUR_CORE'):
  113. cur_core = GetOption('CUR_CORE')
  114. if cur_core not in SUPPORTED_CORE:
  115. print 'cur_core %s not supported, available cur_core:' % cur_core
  116. print SUPPORTED_CORE
  117. exit(0)
  118. else:
  119. CUR_CORE = cur_core
  120. print 'get CUR_CORE = [%s]' % CUR_CORE
  121. SUPPORTED_TOOLCHAIN = ['mw', 'gnu']
  122. print 'supported TOOLCHAIN = ' + str(SUPPORTED_TOOLCHAIN)
  123. if GetOption('TOOLCHAIN'):
  124. toolchain = GetOption('TOOLCHAIN')
  125. if toolchain not in SUPPORTED_TOOLCHAIN:
  126. print 'toolchain %s not supported, available toolchain:' % toolchain
  127. print SUPPORTED_TOOLCHAIN
  128. exit(0)
  129. else:
  130. TOOLCHAIN = toolchain
  131. print 'get TOOLCHAIN = [%s]' % TOOLCHAIN
  132. SUPPORTED_OLEVEL = ['O0', 'O2', 'Os']
  133. print 'supported OLEVEL = ' + str(SUPPORTED_OLEVEL)
  134. if GetOption('OLEVEL'):
  135. olevel = GetOption('OLEVEL')
  136. if olevel not in SUPPORTED_OLEVEL:
  137. print 'olevel %s not supported, available olevel:' % toolchain
  138. print SUPPORTED_OLEVEL
  139. exit(0)
  140. else:
  141. OLEVEL = olevel
  142. print 'get OLEVEL = [%s]' % olevel
  143. EMBARC_LIB_PATH = EMBARC_BSP_ROOT + '/obj_%s_%s/%s_%s'%(BOARD, BD_VER, TOOLCHAIN, CUR_CORE)
  144. # print 'EMBARC_LIB_PATH = %s'%EMBARC_LIB_PATH
  145. TARGET = 'rtthread_snps_embarc.elf'
  146. # print 'TARGET = %s'%TARGET
  147. # ip_ph_dir = EMBARC_BSP_ROOT + '/device/peripheral'
  148. # ip_ph_path = [os.path.join(ip_ph_dir,d) for d in os.listdir(ip_ph_dir) if os.path.isdir(os.path.join(ip_ph_dir,d))]
  149. if BOARD == 'emsdp':
  150. board_inc_path = [SUPPORTED_CORE_DIR, SUPPORTED_CORE_DIR + '/%s/include'%CUR_CORE]
  151. else:
  152. board_inc_path = [EMBARC_BSP_ROOT + '/board/%s/configs/%s'%(BOARD, BD_VER)]
  153. # print 'board_inc_path = %s' % board_inc_path
  154. # print 'ip_dw_path = %s' % ip_dw_path
  155. # print 'ip_ss_path = %s' % ip_ss_path
  156. # print 'ip_ph_path = %s' % ip_ph_path
  157. EMBARC_CPPPATH = [ EMBARC_BSP_ROOT,
  158. EMBARC_BSP_ROOT + '/include',
  159. EMBARC_BSP_ROOT + '/board',
  160. EMBARC_LIB_PATH + '/embARC_generated',
  161. ] + board_inc_path
  162. #print "EMBARC_CPPPATH: %s"%EMBARC_CPPPATH
  163. if TOOLCHAIN == 'mw':
  164. EXEC_PATH = 'C:/ARC/MetaWare/arc/bin'
  165. MAKE = 'gmake'
  166. PREFIX = ''
  167. CC = 'ccac'
  168. CXX = 'ccac'
  169. AS = 'ccac'
  170. AR = 'arac'
  171. LINK = 'ccac'
  172. TARGET_EXT = 'elf'
  173. SIZE = 'sizeac'
  174. OBJDUMP = 'elfdumpac'
  175. OBJCPY = 'elf2bin'
  176. DBG = 'mdb'
  177. OPT_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/ccac.arg '
  178. MDB_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/mdb.arg '
  179. COMMON_COMPILE_OPT = ' -Hnoccm -Hnosdata -Wincompatible-pointer-types -Hnocopyr -Hpurge -fdata-sections -g -%s '%(OLEVEL)
  180. COMMON_DEFINES = ' -DBOARD_%s -D__MW__ -DEMBARC_TCF_GENERATED ' % BOARD.upper()
  181. CFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -Hnocplus '
  182. CXXFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES
  183. AFLAGS = ' -c' + OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -Hasmcpp -I%s -I%s/embARC_generated -I%s/include '%(EMBARC_BSP_ROOT, EMBARC_LIB_PATH, EMBARC_BSP_ROOT)
  184. LINKER_SCRIPT_FILE = RTT_ROOT + '/bsp/synopsys/boards/linker_template_mw.ld'
  185. LINK_SCRIPT = EMBARC_LIB_PATH + '/linker_mw.ldf'
  186. LFLAGS = ' -Hhostlink ' + OPT_ARG_FILE + ' -Hnocopyr -Hnosdata -Hnocrt -Hldopt=-Coutput=rtthread_snps_embarc.map -Hldopt=-Csections -Hldopt=-Ccrossfunc -Hldopt=-Csize -zstdout %s' % LINK_SCRIPT
  187. elif TOOLCHAIN == 'gnu':
  188. EXEC_PATH = 'C:/arc_gnu/bin'
  189. MAKE = 'make'
  190. PREFIX = 'arc-elf32-'
  191. CC = PREFIX + 'gcc'
  192. CXX = PREFIX + 'g++'
  193. AS = PREFIX + 'gcc'
  194. AR = PREFIX + 'ar'
  195. LINK = PREFIX + 'gcc'
  196. TARGET_EXT = 'elf'
  197. SIZE = PREFIX + 'size'
  198. OBJDUMP = PREFIX + 'objdump'
  199. OBJCPY = PREFIX + 'objcopy'
  200. DBG = PREFIX + 'gdb'
  201. OPT_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/gcc.arg '
  202. MDB_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/mdb.arg '
  203. COMMON_COMPILE_OPT = ' -ffunction-sections -fdata-sections -mno-sdata -g -%s '%(OLEVEL)
  204. COMMON_DEFINES = ' -DBOARD_%s -D__GNU__ -DEMBARC_TCF_GENERATED ' % BOARD.upper()
  205. CFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -std=gnu99 '
  206. CXXFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES
  207. AFLAGS = ' -c ' + OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -x assembler-with-cpp -I%s -I%s/embARC_generated -I%s/include '%(EMBARC_BSP_ROOT, EMBARC_LIB_PATH, EMBARC_BSP_ROOT)
  208. LINKER_SCRIPT_FILE = RTT_ROOT + '/bsp/synopsys/boards/linker_template_gnu.ld'
  209. LINK_SCRIPT = EMBARC_LIB_PATH + '/linker_gnu.ldf'
  210. LFLAGS = ' --specs=nsim.specs ' + OPT_ARG_FILE + ' -mno-sdata -nostartfiles -Wl,--gc-sections,-Map=rtthread_snps_embarc.map,-cref,-u,system_vectors -T %s ' % LINK_SCRIPT
  211. OPENOCD_SCRIPT_ROOT = EXEC_PATH + '/../share/openocd/scripts'
  212. OPENOCD_CFG_FILE = OPENOCD_SCRIPT_ROOT + '/board/snps_em_sk_v2.2.cfg'
  213. OPENOCD_OPTIONS = '-s %s -f %s' % (OPENOCD_SCRIPT_ROOT, OPENOCD_CFG_FILE)
  214. DBG_HW_FLAGS = ''' -ex "target remote | openocd --pipe %s" -ex "load" ''' % OPENOCD_OPTIONS
  215. else :
  216. print 'TOOLCHAIN %s is not supported, available toolchain:' % TOOLCHAIN
  217. print SUPPORTED_TOOLCHAIN
  218. exit(-1)
  219. env = Environment(ENV = os.environ, tools = ['mingw'],
  220. AS = AS, ASFLAGS = AFLAGS,
  221. CC = CC, CCFLAGS = CFLAGS,
  222. AR = AR, ARFLAGS = '-rc',
  223. LINK = LINK, LINKFLAGS = LFLAGS,
  224. LIBS = ['embarc'], LIBPATH = EMBARC_LIB_PATH,
  225. CPPPATH = EMBARC_CPPPATH
  226. )
  227. env.PrependENVPath('PATH', EXEC_PATH)
  228. Export('RTT_ROOT')
  229. Export('rtconfig')
  230. embarc_cd_cmd = ' cd %s '%EMBARC_BSP_ROOT
  231. embarc_make_cmd = ' %s -f options/options.mk BOARD=%s BD_VER=%s CUR_CORE=%s TOOLCHAIN=%s V=1 OLEVEL=%s LINKER_SCRIPT_FILE=%s embarc_lib '%(MAKE,BOARD, BD_VER, CUR_CORE, TOOLCHAIN, OLEVEL, LINKER_SCRIPT_FILE)
  232. embarc_clean_cmd = ' %s -f options/options.mk distclean '%MAKE
  233. if GetOption('embarc_build'):
  234. print 'os.system: ' + embarc_cd_cmd + ' && ' + embarc_make_cmd
  235. os.system(embarc_cd_cmd + ' && ' + embarc_make_cmd)
  236. exit(0)
  237. if GetOption('embarc_clean'):
  238. os.system(embarc_cd_cmd + ' && ' + embarc_clean_cmd)
  239. exit(0)
  240. if GetOption('gdb'):
  241. if os.path.isfile(TARGET):
  242. os.system(DBG + DBG_HW_FLAGS + TARGET)
  243. else:
  244. print TARGET + 'not exist, please build first!!'
  245. exit(0)
  246. if GetOption('mdb'):
  247. if os.path.isfile(TARGET):
  248. startup_path = EMBARC_BSP_ROOT + '/arc/startup'
  249. if BOARD == 'nsim':
  250. os.system('mdb -source_path=%s -nooptions -nogoifmain -toggle=include_local_symbols=1 -nsim -off=binary_stdin -off=binary_stdout \
  251. -on=load_at_paddr -on=reset_upon_restart -off=flush_pipe -off=cr_for_more -OKN %s '%(startup_path, MDB_ARG_FILE) + rtconfig.TARGET)
  252. else:
  253. os.system('mdb -source_path=%s -nooptions -nogoifmain -toggle=include_local_symbols=1 -hard -digilent '%startup_path + rtconfig.TARGET)
  254. else:
  255. print TARGET + 'not exist, please build first!!'
  256. exit(0)
  257. # os.system(embarc_cd_cmd + ' && ' + embarc_make_cmd)
  258. # prepare building environment
  259. objs = PrepareBuilding(env, RTT_ROOT)
  260. # if the linker script changed, relink the target
  261. Depends(TARGET, LINK_SCRIPT)
  262. # make a building
  263. DoBuilding(TARGET, objs)