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

# Build definitions for OTBN software
#
# OTBN software is built with a separate toolchain, which is called as an
# external target from Meson. All functionality to call the external toolchain
# is encapsulated in this build file; users only need to care about two
# dictionaries.
#
# To use an OTBN application in device software, use the sw_otbn dictionary.
# For example, to add a dependency to an embeddable version of the barrett384
# OTBN application, add the following variable to the list of dependencies:
# sw_otbn['barrett384']['rv32embed_dependency']
#
# The otbn_sw dictionary has the following structure:
# otbn_sw = {
#   APPNAME: {
#     'elf': OTBN_ELF_FILE,
#     'rv32embed_lib': RV32_LIBRARY,
#     'rv32embed_dependency': DEPENDENCY_ON_RV32_LIBRARY,
# }}
#
# To add another OTBN application to the list of build targets, add it to
# the sw_otbn_sources dictionary. The existing definitions should be a good
# example of how to do that.
# Structure:
# sw_otbn_sources = { appname: files(source1, source2, ), ... }
#
# Note that application names must be unique across subdirectories.
# The directory structure below sw/otbn is not preserved, all build output is
# in sw/otbn. (Preserving the subdirectories seems to be impossible with
# custom_target() not accepting paths but only file names for its `output` key.)

# All OTBN software is added to this dictionary and then built in one go.
sw_otbn_sources = {}

# All subdirectories add the objects they want to build to the sw_otbn_sources
# dictionary.
subdir('code-snippets')
subdir('crypto')

prog_otbn_build = meson.source_root() / 'util/otbn_build.py'

otbn_build_command = [
  prog_env,
  'OTBN_AS=@0@'.format(prog_otbn_as),
  'OTBN_LD=@0@'.format(prog_otbn_ld),
  'RV32_TOOL_OBJCOPY=@0@'.format(prog_objcopy.path()),
  'RV32_TOOL_AS=@0@'.format(prog_as.path()),
  'RV32_TOOL_LD=@0@'.format(prog_ld.path()),
  prog_python,
  prog_otbn_build,
  '--out-dir',
  '@OUTDIR@',
  '@INPUT@',
]
otbn_build_depend_files = [
  prog_otbn_as,
  prog_otbn_ld,
  prog_objcopy.path(),
  prog_as.path(),
  prog_ld.path(),
  prog_otbn_build,
]

# Note on variable naming below: Variables in meson are global, we hence prefix
# all variables with sw_otbn as "our namespace". Variables which are meant to be
# local to this file are prefixed with `sw_otbn__`.

sw_otbn = {}
foreach sw_otbn__app_name, sw_otbn__app_sources : sw_otbn_sources
  # Output files generated by the otbn_build.py script.
  sw_otbn__app_output_files = [
    sw_otbn__app_name + '.rv32embed.o',
    sw_otbn__app_name + '.elf',
  ]

  # Target calling otbn_build.py
  sw_otbn__target = custom_target(
    'sw_otbn_codesnippets_apps_' + sw_otbn__app_name + '_target',
    input: sw_otbn__app_sources,
    output: sw_otbn__app_output_files,
    command: otbn_build_command,
    depend_files: [otbn_build_depend_files,],
  )

  # A library containing the OTBN application in a form embeddable into device
  # (Ibex) software (the *.rv32embed.o file).
  sw_otbn__embedded_lib = static_library(
    sw_otbn__app_name,
    [sw_otbn__target[0]] # == sw_otbn__app_output_files[0], i.e. *.rv32embed.o
  )

  # A dependency on the application as embeddable library, to be used if
  # device (Ibex) software wants to include an OTBN application in its binary.
  sw_otbn__dependency = declare_dependency(
    link_with: sw_otbn__embedded_lib,
  )

  sw_otbn += {
    sw_otbn__app_name: {
      'elf': sw_otbn__target[1],
      'rv32embed_lib': sw_otbn__embedded_lib,
      'rv32embed_dependency': sw_otbn__dependency,
    }
  }

  custom_target(
    'sw_otbn_app_export_' + sw_otbn__app_name,
    command: export_target_command,
    depend_files: [export_target_depend_files,],
    input: [sw_otbn__target[1]],
    output: 'sw_otbn_app_export_' + sw_otbn__app_name,
    build_always_stale: true,
    build_by_default: true,
  )

endforeach
