mirror of
https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_RTL8710BX_ALIOS_SDK.git
synced 2024-12-04 19:40:27 +00:00
229 lines
7.8 KiB
Python
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)
|