import os import sys import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: from building import * except: print('Cannot found RT-Thread root directory, please check RTT_ROOT') print(RTT_ROOT) exit(-1) if os.getenv('EMBARC_BSP_ROOT'): EMBARC_BSP_ROOT = os.getenv('EMBARC_BSP_ROOT') else: EMBARC_BSP_ROOT = RTT_ROOT + '/bsp/synopsys/boards/packages/embARC_bsp-upstream' if not os.path.isdir(EMBARC_BSP_ROOT): print('Cannot found embarc_bsp root directory, please check EMBARC_BSP_ROOT') print(EMBARC_BSP_ROOT) exit(-1) SUPPORTED_BOARD_DIR = EMBARC_BSP_ROOT + '/board' SUPPORTED_BOARD = [d for d in os.listdir(SUPPORTED_BOARD_DIR) if os.path.isdir(os.path.join(SUPPORTED_BOARD_DIR,d))] print('supported BOARD = ' + str(SUPPORTED_BOARD)) AddOption('--BOARD', dest = 'BOARD', type='string', nargs=1, action = 'store', default = 'emsk', help = 'select board') AddOption('--BD_VER', dest = 'BD_VER', type='string', nargs=1, action = 'store', default = '23', help = 'select bd_ver') AddOption('--CUR_CORE', dest = 'CUR_CORE', type='string', nargs=1, action = 'store', default = 'arcem9d', help = 'select cur_core') AddOption('--TOOLCHAIN', dest = 'TOOLCHAIN', type='string', nargs=1, action = 'store', default = 'gnu', help = 'select toolchain') AddOption('--OLEVEL', dest = 'OLEVEL', type='string', nargs=1, action = 'store', default = 'O2', help = 'select optimize level') AddOption('--mdb', dest = 'mdb', action = 'store_true', default = False, help = 'use mdb to debug the elf') AddOption('--gdb', dest = 'gdb', action = 'store_true', default = False, help = 'use gdb to debug the elf') AddOption('--embarc_build', dest = 'embarc_build', action = 'store_true', default = False, help = 'to generate embarc_lib') AddOption('--embarc_clean', dest = 'embarc_clean', action = 'store_true', default = False, help = 'to clean embarc_lib') if GetOption('BOARD'): board = GetOption('BOARD') if board not in SUPPORTED_BOARD: print('board %s not supported, available boards:' % board) print(SUPPORTED_BOARD) exit(0) else: BOARD = board print('get BOARD = [%s]' % board) if BOARD == 'emsdp': SUPPORTED_BD_VER = ['rev2'] else: SUPPORTED_BD_VER_DIR = SUPPORTED_BOARD_DIR + '/' + BOARD + '/configs' 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))] print('supported BD_VER = ' + str(SUPPORTED_BD_VER)) if GetOption('BD_VER'): bd_ver = GetOption('BD_VER') if bd_ver not in SUPPORTED_BD_VER: print('bd_ver %s not supported, available bd_ver:' % bd_ver) print(SUPPORTED_BD_VER) exit(0) else: BD_VER = bd_ver print('get BD_VER = [%s]' % BD_VER) if BOARD == 'emsdp': SUPPORTED_CORE_DIR = SUPPORTED_BOARD_DIR + '/' + BOARD + '/rev2/configs' SUPPORTED_CORE = [d for d in os.listdir(SUPPORTED_CORE_DIR) if os.path.isdir(os.path.join(SUPPORTED_CORE_DIR,d))] else: SUPPORTED_CORE_DIR = SUPPORTED_BD_VER_DIR + '/' + BD_VER + '/tcf' SUPPORTED_CORE = [os.path.splitext(d)[0] for d in os.listdir(SUPPORTED_CORE_DIR)] print('supported CUR_CORE = ' + str(SUPPORTED_CORE)) if GetOption('CUR_CORE'): cur_core = GetOption('CUR_CORE') if cur_core not in SUPPORTED_CORE: print('cur_core %s not supported, available cur_core:' % cur_core) print(SUPPORTED_CORE) exit(0) else: CUR_CORE = cur_core print('get CUR_CORE = [%s]' % CUR_CORE) SUPPORTED_TOOLCHAIN = ['mw', 'gnu'] print('supported TOOLCHAIN = ' + str(SUPPORTED_TOOLCHAIN)) if GetOption('TOOLCHAIN'): toolchain = GetOption('TOOLCHAIN') if toolchain not in SUPPORTED_TOOLCHAIN: print('toolchain %s not supported, available toolchain:' % toolchain) print(SUPPORTED_TOOLCHAIN) exit(0) else: TOOLCHAIN = toolchain print('get TOOLCHAIN = [%s]' % TOOLCHAIN) SUPPORTED_OLEVEL = ['O0', 'O2', 'Os'] print('supported OLEVEL = ' + str(SUPPORTED_OLEVEL)) if GetOption('OLEVEL'): olevel = GetOption('OLEVEL') if olevel not in SUPPORTED_OLEVEL: print('olevel %s not supported, available olevel:' % toolchain) print(SUPPORTED_OLEVEL) exit(0) else: OLEVEL = olevel print('get OLEVEL = [%s]' % olevel) EMBARC_LIB_PATH = EMBARC_BSP_ROOT + '/obj_%s_%s/%s_%s'%(BOARD, BD_VER, TOOLCHAIN, CUR_CORE) # print('EMBARC_LIB_PATH = %s'%EMBARC_LIB_PATH) TARGET = 'rtthread_snps_embarc.elf' # print('TARGET = %s'%TARGET) # ip_ph_dir = EMBARC_BSP_ROOT + '/device/peripheral' # 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))] if BOARD == 'emsdp': board_inc_path = [SUPPORTED_CORE_DIR, SUPPORTED_CORE_DIR + '/%s/include'%CUR_CORE] else: board_inc_path = [EMBARC_BSP_ROOT + '/board/%s/configs/%s'%(BOARD, BD_VER)] # print('board_inc_path = %s' % board_inc_path) # print('ip_dw_path = %s' % ip_dw_path) # print('ip_ss_path = %s' % ip_ss_path) # print('ip_ph_path = %s' % ip_ph_path) EMBARC_CPPPATH = [ EMBARC_BSP_ROOT, EMBARC_BSP_ROOT + '/include', EMBARC_BSP_ROOT + '/board', EMBARC_LIB_PATH + '/embARC_generated', ] + board_inc_path #print("EMBARC_CPPPATH: %s"%EMBARC_CPPPATH) if TOOLCHAIN == 'mw': EXEC_PATH = 'C:/ARC/MetaWare/arc/bin' MAKE = 'gmake' PREFIX = '' CC = 'ccac' CXX = 'ccac' AS = 'ccac' AR = 'arac' LINK = 'ccac' TARGET_EXT = 'elf' SIZE = 'sizeac' OBJDUMP = 'elfdumpac' OBJCPY = 'elf2bin' DBG = 'mdb' OPT_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/ccac.arg ' MDB_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/mdb.arg ' COMMON_COMPILE_OPT = ' -Hnoccm -Hnosdata -Wincompatible-pointer-types -Hnocopyr -Hpurge -fdata-sections -g -%s '%(OLEVEL) COMMON_DEFINES = ' -DBOARD_%s -D__MW__ -DEMBARC_TCF_GENERATED ' % BOARD.upper() CFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -Hnocplus ' CXXFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES 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) LINKER_SCRIPT_FILE = RTT_ROOT + '/bsp/synopsys/boards/linker_template_mw.ld' LINK_SCRIPT = EMBARC_LIB_PATH + '/linker_mw.ldf' LFLAGS = ' -Hhostlink ' + OPT_ARG_FILE + ' -Hnocopyr -Hnosdata -Hnocrt -Hldopt=-Coutput=rtthread_snps_embarc.map -Hldopt=-Csections -Hldopt=-Ccrossfunc -Hldopt=-Csize -zstdout %s' % LINK_SCRIPT elif TOOLCHAIN == 'gnu': EXEC_PATH = 'C:/arc_gnu/bin' MAKE = 'make' PREFIX = 'arc-elf32-' CC = PREFIX + 'gcc' CXX = PREFIX + 'g++' AS = PREFIX + 'gcc' AR = PREFIX + 'ar' LINK = PREFIX + 'gcc' TARGET_EXT = 'elf' SIZE = PREFIX + 'size' OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy' DBG = PREFIX + 'gdb' OPT_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/gcc.arg ' MDB_ARG_FILE = ' @' + EMBARC_LIB_PATH + '/embARC_generated/mdb.arg ' COMMON_COMPILE_OPT = ' -ffunction-sections -fdata-sections -mno-sdata -g -%s '%(OLEVEL) COMMON_DEFINES = ' -DBOARD_%s -D__GNU__ -DEMBARC_TCF_GENERATED ' % BOARD.upper() CFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES + ' -std=gnu99 ' CXXFLAGS = OPT_ARG_FILE + COMMON_COMPILE_OPT + COMMON_DEFINES 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) LINKER_SCRIPT_FILE = RTT_ROOT + '/bsp/synopsys/boards/linker_template_gnu.ld' LINK_SCRIPT = EMBARC_LIB_PATH + '/linker_gnu.ldf' 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 OPENOCD_SCRIPT_ROOT = EXEC_PATH + '/../share/openocd/scripts' OPENOCD_CFG_FILE = OPENOCD_SCRIPT_ROOT + '/board/snps_em_sk_v2.2.cfg' OPENOCD_OPTIONS = '-s %s -f %s' % (OPENOCD_SCRIPT_ROOT, OPENOCD_CFG_FILE) DBG_HW_FLAGS = ''' -ex "target remote | openocd --pipe %s" -ex "load" ''' % OPENOCD_OPTIONS else : print('TOOLCHAIN %s is not supported, available toolchain:' % TOOLCHAIN) print(SUPPORTED_TOOLCHAIN) exit(-1) env = Environment(ENV = os.environ, tools = ['mingw'], AS = AS, ASFLAGS = AFLAGS, CC = CC, CFLAGS = CFLAGS, AR = AR, ARFLAGS = '-rc', LINK = LINK, LINKFLAGS = LFLAGS, LIBS = ['embarc'], LIBPATH = EMBARC_LIB_PATH, CPPPATH = EMBARC_CPPPATH ) env.PrependENVPath('PATH', EXEC_PATH) Export('RTT_ROOT') Export('rtconfig') embarc_cd_cmd = ' cd %s '%EMBARC_BSP_ROOT 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) embarc_clean_cmd = ' %s -f options/options.mk distclean '%MAKE if GetOption('embarc_build'): print('os.system: ' + embarc_cd_cmd + ' && ' + embarc_make_cmd) os.system(embarc_cd_cmd + ' && ' + embarc_make_cmd) exit(0) if GetOption('embarc_clean'): os.system(embarc_cd_cmd + ' && ' + embarc_clean_cmd) exit(0) if GetOption('gdb'): if os.path.isfile(TARGET): os.system(DBG + DBG_HW_FLAGS + TARGET) else: print(TARGET + 'not exist, please build first!!') exit(0) if GetOption('mdb'): if os.path.isfile(TARGET): startup_path = EMBARC_BSP_ROOT + '/arc/startup' if BOARD == 'nsim': os.system('mdb -source_path=%s -nooptions -nogoifmain -toggle=include_local_symbols=1 -nsim -off=binary_stdin -off=binary_stdout \ -on=load_at_paddr -on=reset_upon_restart -off=flush_pipe -off=cr_for_more -OKN %s '%(startup_path, MDB_ARG_FILE) + rtconfig.TARGET) else: os.system('mdb -source_path=%s -nooptions -nogoifmain -toggle=include_local_symbols=1 -hard -digilent '%startup_path + rtconfig.TARGET) else: print(TARGET + 'not exist, please build first!!') exit(0) # os.system(embarc_cd_cmd + ' && ' + embarc_make_cmd) # prepare building environment objs = PrepareBuilding(env, RTT_ROOT) # if the linker script changed, relink the target Depends(TARGET, LINK_SCRIPT) # make a building DoBuilding(TARGET, objs)