| # | |
| # Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) | |
| # | |
| # SPDX-License-Identifier: BSD-2-Clause | |
| # | |
| set(CapDLToolDirectory ${CMAKE_CURRENT_LIST_DIR}) | |
| include(make) | |
| include(debug) | |
| # Build and install capDL-tool | |
| # Path of installed tool will be returned in program_path | |
| # This assumes that there are no other dependencies. | |
| function(CapDLToolInstall target program_path) | |
| # Require the parse-capDL tool | |
| create_depfile_by_find( | |
| depfile_commands | |
| "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/parse-capDL" | |
| "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/parse-capDL.d" | |
| "${CapDLToolDirectory}/" | |
| ) | |
| include(memoize) | |
| # memoize this installation rule which will save the resulting artifact in a cache and reuse it across builds. | |
| # This will rebuild from source if the git directory has changes or has a changed commit hash. | |
| memoize_add_custom_command( | |
| capDL-tool | |
| "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/" | |
| "${CapDLToolDirectory}" | |
| "" | |
| "parse-capDL" | |
| OUTPUT | |
| "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/parse-capDL" | |
| WORKING_DIRECTORY | |
| ${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/ | |
| ${depfile_commands} | |
| COMMAND | |
| cp | |
| -a | |
| ${CapDLToolDirectory}/* | |
| . | |
| COMMAND | |
| ${CMAKE_COMMAND} | |
| -E | |
| env | |
| make | |
| ${USES_TERMINAL_DEBUG} | |
| ) | |
| add_custom_target(${target} DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/parse-capDL") | |
| set(${program_path} "${CMAKE_CURRENT_BINARY_DIR}/capDL-tool/parse-capDL" PARENT_SCOPE) | |
| endfunction() | |
| # Create target for creating capdl C file from cdl spec | |
| # target: Name of target to Create | |
| # output: Output name of C file | |
| # static_alloc: whether the spec has been statically allocated | |
| # object_sizes: object_sizes file | |
| # input: Input name of capdl spec | |
| # capdl_tool: Path to capdl parse tool | |
| # MAX_IRQS: Named argument for size of IRQ array (Deprecated) | |
| # DEPENDS: Any target or file dependencies that the parse command depends on | |
| function(CapDLToolCFileGen target output static_alloc object_sizes input capdl_tool) | |
| cmake_parse_arguments(PARSE_ARGV 6 CAPDL "" "MAX_IRQS" "DEPENDS") | |
| if(NOT "${CAPDL_UNPARSED_ARGUMENTS}" STREQUAL "") | |
| message(FATAL_ERROR "Unknown arguments to CapDLToolCFileGen") | |
| endif() | |
| if(static_alloc) | |
| set(alloc_type_opt "--code-static-alloc") | |
| set(object_sizes_opt "") | |
| else() | |
| set(alloc_type_opt "--code-dynamic-alloc") | |
| set(object_sizes_opt "--object-sizes=${object_sizes}") | |
| endif() | |
| if(NOT "${CAPDL_MAX_IRQS}" STREQUAL "") | |
| message(WARNING "MAX_IRQS option to CapDLToolCFileGen is no longer used by the tool") | |
| endif() | |
| # Invoke the parse-capDL tool to turn the CDL spec into a C spec | |
| add_custom_command( | |
| OUTPUT ${output} | |
| COMMAND | |
| ${capdl_tool} | |
| --code | |
| ${output} ${alloc_type_opt} ${object_sizes_opt} "${input}" | |
| DEPENDS "${input}" "${object_sizes}" ${CAPDL_DEPENDS} | |
| ) | |
| add_custom_target(${target} DEPENDS ${output} ${object_sizes}) | |
| endfunction() |