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