# 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.

[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'

[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'
