# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Meson RISCV toolchain configuration.
#
# NOTE: If you're using a toolchain since version 20200602-1, it is likely that
#       you are using the meson toolchain configuration within the toolchain
#       install, rather than this file. This file remains mostly for legacy
#       reasons, and will eventually be removed.

[binaries]
c = '/tools/riscv/bin/riscv32-unknown-elf-gcc'
cpp = '/tools/riscv/bin/riscv32-unknown-elf-g++'
ar = '/tools/riscv/bin/riscv32-unknown-elf-ar'
ld = '/tools/riscv/bin/riscv32-unknown-elf-ld'
objdump = '/tools/riscv/bin/riscv32-unknown-elf-objdump'
objcopy = '/tools/riscv/bin/riscv32-unknown-elf-objcopy'
strip = '/tools/riscv/bin/riscv32-unknown-elf-strip'
as = '/tools/riscv/bin/riscv32-unknown-elf-as'

[properties]
has_function_printf = false
c_args = [
  '-mabi=ilp32',
  '-march=rv32imc',
  '-mcmodel=medany']

[build_machine]
system = 'linux'
cpu_family = 'x86'
endian = 'little'

[host_machine]
system = 'bare metal'
cpu_family = 'riscv32'
cpu = 'ibex'
endian = 'little'
