|  | # 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, | 
|  | ) |