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

#####################################################################
#
# THIS IS A TEMPORARY SOLUTION
#
# Eventually, the software team is going to have a Meson-based flow
# for building OTBN software. When that exists, this code will go
# away.
#
#####################################################################

# A make fragment for assembling and linking the code snippets. This is
# included by ./Makefile, but can be included in other Makefiles too.
#
# The following variables must be set:
#
#    variable                      | description
#  --------------------------------+----------------------------------------
#    otbn-code-snippets-obj-dir    | Output directory for built objects
#    otbn-code-snippets-bin-dir    | Output directory for built binaries
#    otbn-code-snippets-util-dir   | Path to directory containing OTBN tooling
#
# The following variables may be set:
#
#    variable                      | description
#  --------------------------------+----------------------------------------
#    otbn-code-snippets-as         | Path to otbn-as (defaults to util dir)
#    otbn-code-snippets-ld         | Path to otbn-ld (defaults to util dir)
#
# The ugly "otbn-code-snippets-" prefix on variable names is so that this file
# can be included in other Makefiles without breaking anything.

ifndef otbn-code-snippets-obj-dir
$(error otbn-code-snippets-obj-dir not set.)
endif
ifndef otbn-code-snippets-bin-dir
$(error otbn-code-snippets-bin-dir not set.)
endif
ifndef otbn-code-snippets-util-dir
$(error otbn-code-snippets-util-dir not set.)
endif

# Default values for optional variables
otbn-code-snippets-as ?= $(otbn-code-snippets-util-dir)/otbn-as
otbn-code-snippets-ld ?= $(otbn-code-snippets-util-dir)/otbn-ld

# Get the list of all assembly files in this directory. Strip away directory
# and extension to get basenames (used for objects and binaries).
otbn-code-snippets-path      := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
otbn-code-snippets-asm-paths := $(wildcard $(otbn-code-snippets-path)*.s)
otbn-code-snippets-asm-basenames := $(notdir $(otbn-code-snippets-asm-paths))
otbn-code-snippets-basenames     := $(otbn-code-snippets-asm-basenames:.s=)

$(sort $(otbn-code-snippets-obj-dir) $(otbn-code-snippets-bin-dir)):
	mkdir -p $@

# Calculate lists of object and ELF files
otbn-code-snippets-objects := \
  $(foreach b,$(otbn-code-snippets-basenames),\
            $(otbn-code-snippets-obj-dir)/$(b).o)
otbn-code-snippets-elfs := \
  $(foreach b,$(otbn-code-snippets-basenames),\
            $(otbn-code-snippets-bin-dir)/$(b).elf)

# Define rules for assembling the source code to make objects
$(otbn-code-snippets-objects): \
  $(otbn-code-snippets-obj-dir)/%.o: \
  $(otbn-code-snippets-path)%.s $(otbn-code-snippets-as) \
   | $(otbn-code-snippets-obj-dir)
	$(otbn-code-snippets-as) -o $@ $<

# Define rules for linking objects to make ELFs
$(otbn-code-snippets-elfs): \
  $(otbn-code-snippets-bin-dir)/%.elf: \
  $(otbn-code-snippets-obj-dir)/%.o $(otbn-code-snippets-ld) \
   | $(otbn-code-snippets-bin-dir)
	$(otbn-code-snippets-ld) -o $@ $(otbn-ldflags) $< $(otbn-libs)

#
# Define any file-specific flags or dependencies
#

# rsa_1024_dec_test depends on modexp, defined in modexp.s
$(otbn-code-snippets-bin-dir)/rsa_1024_dec_test.elf: \
  $(otbn-code-snippets-obj-dir)/modexp.o
$(otbn-code-snippets-bin-dir)/rsa_1024_dec_test.elf: \
  otbn-libs += $(otbn-code-snippets-obj-dir)/modexp.o

# rsa_1024_enc_test depends on modexp_65537, defined in modexp.s
$(otbn-code-snippets-bin-dir)/rsa_1024_enc_test.elf: \
  $(otbn-code-snippets-obj-dir)/modexp.o
$(otbn-code-snippets-bin-dir)/rsa_1024_enc_test.elf: \
  otbn-libs += $(otbn-code-snippets-obj-dir)/modexp.o
