rt-thread/bsp/synopsys/boards/SConstruct

326 lines
11 KiB
Python

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)