blob: 1e9beefdb89596b5d6d6e7ef8c80220ed89329c7 [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
cargo = find_program('cargo', required: false, disabler: true)
target = 'riscv32imc-unknown-none-elf'
build_type = 'release'
build_dir = meson.current_build_dir()
tock_board_dir = meson.current_source_dir() / 'boards/opentitan'
toolchain_file = tock_board_dir / 'rust-toolchain'
manifest_path = tock_board_dir / 'Cargo.toml'
# Used to choose local or upstream Tock OS dependencies.
tock_deps_path = meson.current_source_dir() / 'tock'
tock_deps_manifest = tock_deps_path / 'Cargo.toml'
# CARGO FLAGS:
# These flags will only apply to the final binary, and won't get propogated
# to the dependency crate builds.
cargo_flags_array = [
'manifest-path=' + manifest_path,
'target-dir=' + build_dir,
'target=' + target,
build_type,
]
cargo_flags = ''
foreach flag : cargo_flags_array
cargo_flags += '--' + flag + ' '
endforeach
# RUSTFLAGS:
# These flags will apply to all the dependencies, as well as the final
# binary. Linker and linker flavor amongst other things can be passed through
# these flags.
rust_flags = '-C link-arg=-Tlayout.ld ' + \
'-C linker=rust-lld ' + \
'-C linker-flavor=ld.lld ' + \
'-C relocation-model=dynamic-no-pic ' + \
'-C link-arg=-zmax-page-size=512'
# The cargo invocation script.
cargo_invoke_cmd = meson.source_root() / 'util/invoke_cargo.sh'
if tock_local
run_command('ln', '-s', '-f', tock_deps_path / 'Cargo_local.toml', tock_deps_manifest)
else
run_command('ln', '-s', '-f', tock_deps_path / 'Cargo_remote.toml', tock_deps_manifest)
endif
tock_raw = custom_target(
'tock_raw',
command: [
cargo_invoke_cmd,
cargo,
cargo_flags,
rust_flags,
toolchain_file,
meson.source_root(),
meson.build_root(),
],
depend_files: [
cargo_invoke_cmd,
manifest_path,
toolchain_file,
],
output: target,
console: true,
build_always_stale: true,
build_by_default: false,
)
tock_elf = custom_target(
'tock_elf',
command: ['cp', '@INPUT@' / build_type / 'opentitan', '@OUTPUT@'],
depends: tock_raw,
input: tock_raw,
output: 'opentitan.elf',
build_always_stale: true,
build_by_default: false,
)
tock_bin = custom_target(
'tock_bin',
command: [
prog_objcopy,
# Remove .apps section to dramatically reduce binary size.
'--remove-section', '.apps',
'-O', 'binary',
'@INPUT@',
'@OUTPUT@'
],
input: tock_elf,
output: 'opentitan.bin',
build_always_stale: true,
build_by_default: false,
)
custom_target(
'tock_export',
command: export_target_command,
depend_files: [export_target_depend_files,],
input: [tock_elf, tock_bin],
output: 'tock',
build_always_stale: true,
build_by_default: false,
)