Ai-Thinker-Open_RTL8710BX_A.../Living_SDK/site_scons/toolchain.py
2020-06-18 22:04:32 +08:00

229 lines
7.8 KiB
Python

import os
import sys
class tool_chain:
def __init__(self, config, tools_path=''):
self.config = config
self.tools_path = tools_path
self.binary_raw = os.path.join(self.config.out_dir, 'binary', self.config.app + '@' + self.config.board)
@staticmethod
def __get_os():
os = ''
if sys.platform.startswith('linux'):
os = 'Linux64' if sys.maxsize > 2**32 else 'Linux32'
elif sys.platform.startswith('darwin'):
os = 'OSX'
elif sys.platform.startswith('win'):
os = 'Win32'
else:
print('%s encrypt unsupported...' % sys.platform)
return os
def __tools_path(self):
tools_chain_root = os.path.join(self.config.project_path, 'build/compiler')
path = ''
if not self.tools_path:
if self.prefix == 'arm-none-eabi-':
path = os.path.join(tools_chain_root, 'gcc-arm-none-eabi', self.__get_os(), 'bin')
elif self.prefix == 'xtensa-esp32-elf-':
path = os.path.join(tools_chain_root, 'gcc-xtensa-esp32', self.__get_os(), 'bin')
elif self.prefix == 'xtensa-lx106-elf-':
path = os.path.join(self.config.project_path, 'gcc-xtensa-lx106', self.__get_os(), 'bin')
elif self.prefix == 'csky-abiv2-elf-':
path = os.path.join(tools_chain_root, 'gcc-csky-abiv2', self.__get_os(), 'bin')
else:
print("tool chain is not support")
if os.path.isdir(path):
self.tools_path = path
elif os.getenv('TOOLCHAIN_PATH'):
self.tools_path = os.getenv('TOOLCHAIN_PATH')
def tools_name_config(self):
self.__tools_path()
self.config.aos_env['CC'] = os.path.join(self.tools_path, self.prefix + self.cc)
self.config.aos_env['CXX'] = os.path.join(self.tools_path, self.prefix + self.cxx)
self.config.aos_env['AS'] = os.path.join(self.tools_path, self.prefix + self.ass)
self.config.aos_env['AR'] = os.path.join(self.tools_path, self.prefix + self.ar)
self.config.aos_env['LD'] = os.path.join(self.tools_path, self.prefix + self.ld)
self.config.aos_env['OBJDUMP'] = os.path.join(self.tools_path, self.prefix + self.objdump)
self.config.aos_env['OBJCOPY'] = os.path.join(self.tools_path, self.prefix + self.objcopy)
self.config.aos_env['STRIP'] = os.path.join(self.tools_path, self.prefix + self.strip)
self.config.aos_env['NM'] = os.path.join(self.tools_path, self.prefix + self.nm)
self.config.aos_env['READELF'] = os.path.join(self.tools_path, self.prefix + self.readelf)
self.config.aos_env['RANLIBCOM'] = ''
for tool, name in self.extend_name_dict.items():
self.config.aos_env[tool] = os.path.join(self.tools_path, self.prefix + name)
def tools_flag_config(self):
self.config.aos_env.Append(CPPFLAGS=self.cppflags)
self.config.aos_env.Append(CFLAGS=self.cflags)
self.config.aos_env.Append(CXXFLAGS=self.cxxflags)
self.config.aos_env.Append(CXXFLAGS=self.cxxflags)
self.config.aos_env.Append(ASFLAGS=self.asflags)
self.config.aos_env.Append(LINKFLAGS=self.ldflags)
self.config.aos_env.Replace(ARFLAGS=self.arflags)
for flag, value in self.extend_flag_dict.items():
self.config.aos_env.Append(flag=value)
def tools_config(self):
self.tools_name_config()
self.tools_flag_config()
def extend_tool_name(self, tool, name):
self.extend_name_dict[tool] = name
def extend_tool_flag(self, key, value):
self.extend_flag_dict[key] = value
def set_tools_path(self, tools_path):
self.tools_path = tools_path if os.path.isabs(tools_path) else os.path.abspath(tools_path)
def set_prefix(self, prefix):
self.prefix = prefix
def set_cc(self, cc):
self.cc = cc
def set_cxx(self, cxx):
self.cxx = cxx
def set_as(self, ass):
self.ass = ass
def set_ar(self, ar):
self.ar = ar
def set_ld(self, ld):
self.ld = ld
def set_objdump(self, objcump):
self.objdump = objcump
def set_objcopy(self, objcopy):
self.objcopy = objcopy
def set_strip(self, strip):
self.strip = strip
def set_nm(self, nm):
self.nm = nm
def set_readelf(self, readelf):
self.readelf = readelf
def set_cflags(self, cflags):
self.cflags = cflags
def set_cxxflags(self, cxxflags):
self.cxxflags = cxxflags
def set_cppflags(self, cppflags):
self.cppflags = cppflags
def set_asflags(self, asflags):
self.asflags = asflags
def set_ldflags(self, ldflags):
self.ldflags = ldflags
def set_linkcom(self, linkcom):
self.linkcom = linkcom
class gcc_tool_chain(tool_chain):
def __init__(self, config, tools_path=''):
tool_chain.__init__(self, config, tools_path)
self.linkcom=''
board_name = config.board
self.prefix = ''
self.cppflags = ''
self.linkcom = '$LINK -o $TARGET -Wl,-Map,$MAPFILE -Wl,--start-group $LIBS -Wl,--end-group -Wl,--no-whole-archive -Wl,--gc-sections -Wl,--cref $LDFLAGS $LINKFLAGS'
self.cc = 'gcc'
self.cxx = 'g++'
self.ass = 'gcc'
self.ar = 'ar'
self.ld = 'ld'
self.objdump = 'objdump'
self.objcopy = 'objcopy'
self.strip = 'strip'
self.nm = 'nm'
self.readelf = 'readelf'
self.extend_name_dict = {}
self.cflags = '-Wfatal-errors -ggdb -Os -fsigned-char -ffunction-sections -fdata-sections -fno-common -std=gnu11'
self.cxxflags = ''
self.asflags = '-c'
self.ldflags = ''
self.arflags = 'rc'
self.extend_flag_dict = {}
self.binary = self.binary_raw + '.elf'
env = self.config.aos_env
env['MAPFILE'] = self.binary_raw + '.map'
class iar_tool_chain(tool_chain):
def __init__(self, config, tools_path=''):
tool_chain.__init__(self, config, tools_path)
self.prefix = ''
self.cc = 'iccarm'
self.cxx = 'iccarm'
self.ass = 'iasmarm'
self.ar = 'iarchive'
self.ld = 'ilinkarm'
self.objdump = 'ielfdumparm'
self.objcopy = 'ielftool'
self.strip = 'ielftool'
self.extend_name_dict = {}
self.cflags = '-e --dlib_config=full -D_TIMESPEC_DEFINED --silent --only_stdout --no_warnings --diag_warning=Pe167,Pe144,Pe513'
self.cxxflags = ''
self.cppflags = ''
self.asflags = ''
self.ldflags = ''
self.arflags = '--create'
self.extend_flag_dict = {}
self.nm = ''
self.readelf = ''
self.binary = self.binary_raw + '.iarElf'
class armcc_tool_chain(tool_chain):
def __init__(self,config,tools_path=''):
tool_chain.__init__(self,config,tools_path)
self.prefix = ''
self.cc = 'armcc'
self.cxx = 'armcc'
self.ass = 'armasm'
self.ar = 'armar'
self.ld = 'armlink'
self.objdump = 'fromelf'
self.objcopy = 'fromelf'
self.strip = 'fromelf'
self.extend_name_dict = {}
self.cflags = '--c90 --gnu --library_type=microlib -W'
self.cxxflags = ''
self.cppflags = ''
self.asflags = '--library_type=microlib'
self.ldflags = ''
self.arflags = '-rcs'
self.extend_flag_dict = {}
self.nm = ''
self.readelf = ''
self.binary = self.binary_raw + '.axf'
def create_tool_chain(config):
compiler = config.compiler
if compiler == 'gcc':
return gcc_tool_chain(config)
elif compiler == 'iar':
return iar_tool_chain(config)
elif compiler == 'armcc':
return armcc_tool_chain(config)
else:
print("%s is not support new, please contact aos build engineer." % compiler)
exit(-1)