diff --git a/cross/ccrx.txt b/cross/ccrx.txt new file mode 100644 index 000000000..5474bb0ae --- /dev/null +++ b/cross/ccrx.txt @@ -0,0 +1,20 @@ +# This file assumes that path to the Renesas CC-RX toolchain is added +# to the environment(PATH) variable, so that Meson can find +# ccrx and rlink while building. +[binaries] +c = 'ccrx' +cpp = 'ccrx' +ar = 'rlink' +strip = 'rlink' + +[properties] +# The '--cpu' option with the appropriate target type should be mentioned +# to cross compile c/c++ code with ccrx,. +c_args = ['--cpu=rx600'] +cpp_args = ['--cpu=rx600'] + +[host_machine] +system = 'bare metal' # Update with your system name - bare metal/OS. +cpu_family = 'rx' +cpu = 'rx600' +endian = 'little' diff --git a/docs/markdown/Reference-tables.md b/docs/markdown/Reference-tables.md index 72dce4b4d..d3bf3d29e 100644 --- a/docs/markdown/Reference-tables.md +++ b/docs/markdown/Reference-tables.md @@ -5,26 +5,27 @@ These are return values of the `get_id` (Compiler family) and `get_argument_syntax` (Argument syntax) method in a compiler object. -| Value | Compiler family | Argument syntax | -| ----- | ---------------- | -------------------------------| -| gcc | The GNU Compiler Collection | gcc | -| clang | The Clang compiler | gcc | -| msvc | Microsoft Visual Studio | msvc | -| intel | Intel compiler | msvc on windows, otherwise gcc | -| llvm | LLVM-based compiler (Swift, D) | | -| mono | Xamarin C# compiler | | -| dmd | D lang reference compiler | | -| rustc | Rust compiler | | -| valac | Vala compiler | | -| pathscale | The Pathscale Fortran compiler | | -| pgi | The Portland Fortran compiler | | -| sun | Sun Fortran compiler | | -| g95 | The G95 Fortran compiler | | -| open64 | The Open64 Fortran Compiler | | -| nagfor | The NAG Fortran compiler | | -| lcc | Elbrus C/C++/Fortran Compiler | | -| arm | ARM compiler | | -| armclang | ARMCLANG compiler | | +| Value | Compiler family | Argument syntax | +| ----- | --------------- | --------------- | +| gcc | The GNU Compiler Collection | gcc | +| clang | The Clang compiler | gcc | +| msvc | Microsoft Visual Studio | msvc | +| intel | Intel compiler | msvc on windows, otherwise gcc | +| llvm | LLVM-based compiler (Swift, D) | | +| mono | Xamarin C# compiler | | +| dmd | D lang reference compiler | | +| rustc | Rust compiler | | +| valac | Vala compiler | | +| pathscale | The Pathscale Fortran compiler | | +| pgi | The Portland Fortran compiler | | +| sun | Sun Fortran compiler | | +| g95 | The G95 Fortran compiler | | +| open64 | The Open64 Fortran Compiler | | +| nagfor | The NAG Fortran compiler | | +| lcc | Elbrus C/C++/Fortran Compiler | | +| arm | ARM compiler | | +| armclang | ARMCLANG compiler | | +| ccrx | Renesas RX Family C/C++ compiler | | ## Script environment variables @@ -62,6 +63,7 @@ set in the cross file. | sparc | 32 bit SPARC | | sparc64 | SPARC v9 processor | | s390x | IBM zSystem s390x | +| rx | Renesas RX 32 bit MCU | Any cpu family not listed in the above list is not guaranteed to remain stable in future releases. diff --git a/docs/markdown/snippets/ccrx_toolchain_support.md b/docs/markdown/snippets/ccrx_toolchain_support.md new file mode 100644 index 000000000..6bf7e5b78 --- /dev/null +++ b/docs/markdown/snippets/ccrx_toolchain_support.md @@ -0,0 +1,16 @@ +## CC-RX compiler for C and CPP + +Cross-compilation is now supported for Renesas RX targets with the CC-RX compiler. + +The environment path should be set properly for the CC-RX compiler executables. +The `-cpu` option with the appropriate value should be mentioned in the cross-file as shown in the snippet below. + +```ini +[properties] +c_args = ['-cpu=rx600'] +cpp_args = ['-cpu=rx600'] +``` + +The default extension of the executable output is `.abs`. +Other target specific arguments to the compiler and linker will need to be added explicitly from the cross-file(`c_args`/`c_link_args`/`cpp_args`/`cpp_link_args`) or some other way. +Refer to the CC-RX User's manual for additional compiler and linker options. \ No newline at end of file diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 8bb49c05e..814b6bb0e 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1347,12 +1347,14 @@ class Executable(BuildTarget): if (for_windows(is_cross, environment) or for_cygwin(is_cross, environment) or 'cs' in self.compilers): self.suffix = 'exe' + elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('arm') or + 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('arm')): + self.suffix = 'axf' + elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('ccrx') or + 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('ccrx')): + self.suffix = 'abs' else: - if ('c' in self.compilers and self.compilers['c'].get_id().startswith('arm') or - 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('arm')): - self.suffix = 'axf' - else: - self.suffix = '' + self.suffix = '' self.filename = self.name if self.suffix: self.filename += '.' + self.suffix diff --git a/mesonbuild/compilers/__init__.py b/mesonbuild/compilers/__init__.py index 7050b0c3d..31b7b897b 100644 --- a/mesonbuild/compilers/__init__.py +++ b/mesonbuild/compilers/__init__.py @@ -78,6 +78,9 @@ __all__ = [ 'PathScaleFortranCompiler', 'PGIFortranCompiler', 'RustCompiler', + 'CcrxCCompiler', + 'CcrxCompiler', + 'CcrxCPPCompiler', 'SunFortranCompiler', 'SwiftCompiler', 'ValaCompiler', @@ -110,6 +113,7 @@ from .compilers import ( CompilerArgs, GnuCompiler, IntelCompiler, + CcrxCompiler, ) from .c import ( CCompiler, @@ -120,6 +124,7 @@ from .c import ( GnuCCompiler, ElbrusCCompiler, IntelCCompiler, + CcrxCCompiler, VisualStudioCCompiler, ) from .cpp import ( @@ -131,6 +136,7 @@ from .cpp import ( GnuCPPCompiler, ElbrusCPPCompiler, IntelCPPCompiler, + CcrxCPPCompiler, VisualStudioCPPCompiler, ) from .cs import MonoCompiler, VisualStudioCsCompiler diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 35c71df8b..b57001a93 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -46,6 +46,7 @@ from .compilers import ( ElbrusCompiler, IntelCompiler, RunResult, + CcrxCompiler, ) gnu_compiler_internal_libs = ('m', 'c', 'pthread', 'dl', 'rt') @@ -1584,3 +1585,45 @@ class ArmCCompiler(ArmCompiler, CCompiler): if std.value != 'none': args.append('--' + std.value) return args + +class CcrxCCompiler(CcrxCompiler, CCompiler): + def __init__(self, exelist, version, compiler_type, is_cross, exe_wrapper=None, **kwargs): + CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs) + CcrxCompiler.__init__(self, compiler_type) + + # Override CCompiler.get_always_args + def get_always_args(self): + return ['-nologo'] + + def get_options(self): + opts = CCompiler.get_options(self) + opts.update({'c_std': coredata.UserComboOption('c_std', 'C language standard to use', + ['none', 'c89', 'c99'], + 'none')}) + return opts + + def get_option_compile_args(self, options): + args = [] + std = options['c_std'] + if std.value == 'c89': + args.append('-lang=c') + elif std.value == 'c99': + args.append('-lang=c99') + return args + + def get_compile_only_args(self): + return [] + + def get_no_optimization_args(self): + return ['-optimize=0'] + + def get_output_args(self, target): + return ['-output=obj=%s' % target] + + def get_linker_output_args(self, outputname): + return ['-output=%s' % outputname] + + def get_include_args(self, path, is_system): + if path == '': + path = '.' + return ['-include=' + path] diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index a038abf91..514aa3866 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -147,6 +147,14 @@ arm_buildtype_args = {'plain': [], 'custom': [], } +ccrx_buildtype_args = {'plain': [], + 'debug': [], + 'debugoptimized': [], + 'release': [], + 'minsize': [], + 'custom': [], + } + msvc_buildtype_args = {'plain': [], 'debug': ["/ZI", "/Ob0", "/Od", "/RTC1"], 'debugoptimized': ["/Zi", "/Ob1"], @@ -179,6 +187,14 @@ arm_buildtype_linker_args = {'plain': [], 'custom': [], } +ccrx_buildtype_linker_args = {'plain': [], + 'debug': [], + 'debugoptimized': [], + 'release': [], + 'minsize': [], + 'custom': [], + } + msvc_buildtype_linker_args = {'plain': [], 'debug': [], 'debugoptimized': [], @@ -295,6 +311,14 @@ gnu_optimization_args = {'0': [], 's': ['-Os'], } +ccrx_optimization_args = {'0': ['-optimize=0'], + 'g': ['-optimize=0'], + '1': ['-optimize=1'], + '2': ['-optimize=2'], + '3': ['-optimize=max'], + 's': ['-optimize=2', '-size'] + } + msvc_optimization_args = {'0': [], 'g': ['/O0'], '1': ['/O1'], @@ -309,6 +333,9 @@ clike_debug_args = {False: [], msvc_debug_args = {False: [], True: []} # Fixme! +ccrx_debug_args = {False: [], + True: ['-debug']} + base_options = {'b_pch': coredata.UserBooleanOption('b_pch', 'Use precompiled headers', True), 'b_lto': coredata.UserBooleanOption('b_lto', 'Use link time optimization', False), 'b_sanitize': coredata.UserComboOption('b_sanitize', @@ -1244,6 +1271,8 @@ class CompilerType(enum.Enum): ARM_WIN = 30 + CCRX_WIN = 40 + @property def is_standard_compiler(self): return self.name in ('GCC_STANDARD', 'CLANG_STANDARD', 'ICC_STANDARD') @@ -1254,7 +1283,7 @@ class CompilerType(enum.Enum): @property def is_windows_compiler(self): - return self.name in ('GCC_MINGW', 'GCC_CYGWIN', 'CLANG_MINGW', 'ICC_WIN', 'ARM_WIN') + return self.name in ('GCC_MINGW', 'GCC_CYGWIN', 'CLANG_MINGW', 'ICC_WIN', 'ARM_WIN', 'CCRX_WIN') def get_macos_dylib_install_name(prefix, shlib_name, suffix, soversion): @@ -1804,3 +1833,94 @@ class ArmCompiler: def get_debug_args(self, is_debug): return clike_debug_args[is_debug] + +class CcrxCompiler: + def __init__(self, compiler_type): + if not self.is_cross: + raise EnvironmentException('ccrx supports only cross-compilation.') + # Check whether 'rlink.exe' is available in path + self.linker_exe = 'rlink.exe' + args = '--version' + try: + p, stdo, stderr = Popen_safe(self.linker_exe, args) + except OSError as e: + err_msg = 'Unknown linker\nRunning "{0}" gave \n"{1}"'.format(' '.join([self.linker_exe] + [args]), e) + raise EnvironmentException(err_msg) + self.id = 'ccrx' + self.compiler_type = compiler_type + # Assembly + self.can_compile_suffixes.update('s') + default_warn_args = [] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + [], + '3': default_warn_args + []} + + def can_linker_accept_rsp(self): + return False + + def get_pic_args(self): + # PIC support is not enabled by default for CCRX, + # if users want to use it, they need to add the required arguments explicitly + return [] + + def get_buildtype_args(self, buildtype): + return ccrx_buildtype_args[buildtype] + + def get_buildtype_linker_args(self, buildtype): + return ccrx_buildtype_linker_args[buildtype] + + # Override CCompiler.get_std_shared_lib_link_args + def get_std_shared_lib_link_args(self): + return [] + + def get_pch_suffix(self): + return 'pch' + + def get_pch_use_args(self, pch_dir, header): + return [] + + # Override CCompiler.get_dependency_gen_args + def get_dependency_gen_args(self, outtarget, outfile): + return [] + + # Override CCompiler.build_rpath_args + def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): + return [] + + def thread_flags(self, env): + return [] + + def thread_link_flags(self, env): + return [] + + def get_linker_exelist(self): + return [self.linker_exe] + + def get_coverage_args(self): + return [] + + def get_coverage_link_args(self): + return [] + + def get_optimization_args(self, optimization_level): + return ccrx_optimization_args[optimization_level] + + def get_debug_args(self, is_debug): + return ccrx_debug_args[is_debug] + + @classmethod + def unix_args_to_native(cls, args): + result = [] + for i in args: + if i.startswith('-D'): + i = '-define=' + i[2:] + if i.startswith('-I'): + i = '-include=' + i[2:] + if i.startswith('-Wl,-rpath='): + continue + elif i == '--print-search-dirs': + continue + elif i.startswith('-L'): + continue + result.append(i) + return result diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py index 65a1033a6..e6f58038b 100644 --- a/mesonbuild/compilers/cpp.py +++ b/mesonbuild/compilers/cpp.py @@ -30,6 +30,7 @@ from .compilers import ( IntelCompiler, ArmCompiler, ArmclangCompiler, + CcrxCompiler, ) from .c_function_attributes import CXX_FUNC_ATTRIBUTES @@ -412,3 +413,31 @@ class ArmCPPCompiler(ArmCompiler, CPPCompiler): def get_compiler_check_args(self): return [] + + +class CcrxCPPCompiler(CcrxCompiler, CPPCompiler): + def __init__(self, exelist, version, compiler_type, is_cross, exe_wrap=None, **kwargs): + CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, **kwargs) + CcrxCompiler.__init__(self, compiler_type) + + # Override CCompiler.get_always_args + def get_always_args(self): + return ['-nologo', '-lang=cpp'] + + def get_option_compile_args(self, options): + return [] + + def get_compile_only_args(self): + return [] + + def get_output_args(self, target): + return ['-output=obj=%s' % target] + + def get_linker_output_args(self, outputname): + return ['-output=%s' % outputname] + + def get_option_link_args(self, options): + return [] + + def get_compiler_check_args(self): + return [] diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 8891b5c78..f45f91bf1 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -15,7 +15,7 @@ import configparser, os, platform, re, sys, shlex, shutil, subprocess from . import coredata -from .linkers import ArLinker, ArmarLinker, VisualStudioLinker, DLinker +from .linkers import ArLinker, ArmarLinker, VisualStudioLinker, DLinker, CcrxLinker from . import mesonlib from .mesonlib import MesonException, EnvironmentException, PerMachine, Popen_safe from . import mlog @@ -61,6 +61,8 @@ from .compilers import ( PathScaleFortranCompiler, PGIFortranCompiler, RustCompiler, + CcrxCCompiler, + CcrxCPPCompiler, SunFortranCompiler, ValaCompiler, VisualStudioCCompiler, @@ -82,6 +84,7 @@ known_cpu_families = ( 'ppc64', 'riscv32', 'riscv64', + 'rx', 's390x', 'sparc', 'sparc64', @@ -563,6 +566,8 @@ class Environment: arg = '/?' elif 'armcc' in compiler[0]: arg = '--vsn' + elif 'ccrx' in compiler[0]: + arg = '-v' else: arg = '--version' try: @@ -570,8 +575,12 @@ class Environment: except OSError as e: popen_exceptions[' '.join(compiler + [arg])] = e continue - version = search_version(out) + + if 'ccrx' in compiler[0]: + out = err + full_version = out.split('\n', 1)[0] + version = search_version(out) guess_gcc_or_lcc = False if 'Free Software Foundation' in out: @@ -659,6 +668,11 @@ class Environment: compiler_type = CompilerType.ARM_WIN cls = ArmCCompiler if lang == 'c' else ArmCPPCompiler return cls(ccache + compiler, version, compiler_type, is_cross, exe_wrap, full_version=full_version) + if 'RX Family' in out: + compiler_type = CompilerType.CCRX_WIN + cls = CcrxCCompiler if lang == 'c' else CcrxCPPCompiler + return cls(ccache + compiler, version, compiler_type, is_cross, exe_wrap, full_version=full_version) + self._handle_exceptions(popen_exceptions, compilers) def detect_c_compiler(self, want_cross): @@ -955,6 +969,8 @@ class Environment: return DLinker(linker, compiler.arch) if 'GDC' in out and ' based on D ' in out: return DLinker(linker, compiler.arch) + if err.startswith('Renesas') and ('rlink' in linker or 'rlink.exe' in linker): + return CcrxLinker(linker) if p.returncode == 0: return ArLinker(linker) if p.returncode == 1 and err.startswith('usage'): # OSX diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py index 66586e474..543251462 100644 --- a/mesonbuild/linkers.py +++ b/mesonbuild/linkers.py @@ -192,3 +192,54 @@ class DLinker(StaticLinker): def get_link_debugfile_args(self, targetfile): return [] + +class CcrxLinker(StaticLinker): + + def __init__(self, exelist): + self.exelist = exelist + self.id = 'rlink' + pc, stdo = Popen_safe(self.exelist + ['-h'])[0:2] + self.std_args = [] + + def can_linker_accept_rsp(self): + return False + + def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath): + return [] + + def get_exelist(self): + return self.exelist[:] + + def get_std_link_args(self): + return self.std_args + + def get_output_args(self, target): + return ['-output=%s' % target] + + def get_buildtype_linker_args(self, buildtype): + return [] + + def get_linker_always_args(self): + return ['-nologo', '-form=library'] + + def get_coverage_link_args(self): + return [] + + def get_always_args(self): + return [] + + def thread_link_flags(self, env): + return [] + + def openmp_flags(self): + return [] + + def get_option_link_args(self, options): + return [] + + @classmethod + def unix_args_to_native(cls, args): + return args[:] + + def get_link_debugfile_args(self, targetfile): + return []