123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- 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, CCFLAGS = 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)
|