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