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