| #---------------------------------------------------------------------------- |
| # Copyright (c) 2021-2022 Arm Limited. All rights reserved. |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| #---------------------------------------------------------------------------- |
| |
| ############################################################################## |
| # Helper function to provide user option and corresponding default value |
| ############################################################################## |
| function(USER_OPTION name description default type) |
| |
| if (${type} STREQUAL PATH_OR_FILE) |
| |
| if (DEFINED ${name}) |
| get_filename_component(ABSPATH "${${name}}" ABSOLUTE BASE_DIR ${CMAKE_SOURCE_DIR}) |
| |
| get_path_type(${${name}} PATH_TYPE) |
| else() |
| get_filename_component(ABSPATH "${default}" ABSOLUTE BASE_DIR ${CMAKE_SOURCE_DIR}) |
| |
| get_path_type(${default} PATH_TYPE) |
| endif() |
| |
| if (NOT EXISTS ${ABSPATH}) |
| message(FATAL_ERROR |
| "Invalid directory or file path. Description: ${description}; Path: ${ABSPATH}") |
| endif() |
| |
| # Set the default type if path is not a dir or file path (or undefined) |
| if (NOT ${PATH_TYPE} STREQUAL PATH AND NOT ${PATH_TYPE} STREQUAL FILEPATH) |
| message(FATAL_ERROR "Invalid ${name}. It should be a dir or file path.") |
| endif() |
| set(type ${PATH_TYPE}) |
| endif() |
| |
| if (NOT DEFINED ${name}) |
| set(${name} ${default} CACHE ${type} ${description}) |
| endif() |
| |
| # if it is a path |
| if (${type} STREQUAL PATH) |
| |
| # Get the absolute path, relative to the cmake root |
| get_filename_component(ABSPATH "${${name}}" ABSOLUTE BASE_DIR ${CMAKE_SOURCE_DIR}) |
| |
| # check that this is a directory |
| if (NOT IS_DIRECTORY ${ABSPATH}) |
| message(FATAL_ERROR |
| "Invalid directory path. Description: ${description}; Path: ${ABSPATH}") |
| endif() |
| |
| set(${name} ${ABSPATH} CACHE ${type} ${description} FORCE) |
| |
| # if this is a file path |
| elseif(${type} STREQUAL FILEPATH) |
| |
| # Get the absolute path, relative to the cmake root |
| get_filename_component(ABSPATH "${${name}}" ABSOLUTE BASE_DIR ${CMAKE_SOURCE_DIR}) |
| |
| # check that the file exists: |
| if (NOT EXISTS ${ABSPATH}) |
| message(FATAL_ERROR |
| "Invalid file path. Description: ${description}; Path: ${ABSPATH}") |
| endif() |
| |
| set(${name} ${ABSPATH} CACHE ${type} ${description} FORCE) |
| |
| endif() |
| |
| message(STATUS "User option ${name} is set to ${${name}}") |
| LIST(APPEND USER_OPTIONS ${name}) |
| set(USER_OPTIONS ${USER_OPTIONS} CACHE INTERNAL "") |
| |
| endfunction() |
| |
| |
| # Function to check if a variable is defined, and throw |
| # an error if it is not. |
| function(assert_defined var_name) |
| if (NOT DEFINED ${var_name}) |
| message(FATAL_ERROR "ERROR: ${var_name} is undefined!") |
| endif() |
| endfunction() |
| |
| # Function to get the path type for a variable |
| # Args: |
| # path_var[in]: path variable for which the cmake path type is requested |
| # cmake_path_type[out]: CMake path type. Set to FILEPATH when it is a file |
| # or PATH when it points to a directory. If the path |
| # is invalid, this remains empty. |
| function(get_path_type path_var cmake_path_type) |
| # Validate path - get absolute value |
| get_filename_component(ABSPATH "${path_var}" ABSOLUTE |
| BASE_DIR ${CMAKE_SOURCE_DIR}) |
| |
| if (DEFINED path_var) |
| if (IS_DIRECTORY ${ABSPATH}) |
| set(${cmake_path_type} PATH PARENT_SCOPE) |
| message(STATUS "Variable of PATH type") |
| elseif(EXISTS ${ABSPATH}) |
| set(${cmake_path_type} FILEPATH PARENT_SCOPE) |
| else() |
| set(${cmake_path_type} "" PARENT_SCOPE) |
| endif() |
| else() |
| set(${cmake_path_type} UNINITIALIZED PARENT_SCOPE) |
| endif() |
| |
| endfunction() |
| |
| # Function to print all the user options added using the function `USER_OPTION` |
| function(print_useroptions) |
| message(STATUS "--------------------------------------------------------------------------------------------------") |
| message(STATUS "Defined build user options:") |
| message(STATUS "") |
| foreach(opt ${USER_OPTIONS}) |
| message(STATUS " ${opt}=${${opt}}") |
| endforeach() |
| message(STATUS "--------------------------------------------------------------------------------------------------") |
| endfunction() |
| |
| function (SUBDIRLIST result curdir) |
| file(GLOB children RELATIVE ${curdir} ${curdir}/*) |
| set(dirlist "") |
| foreach(child ${children}) |
| if(IS_DIRECTORY ${curdir}/${child}) |
| LIST(APPEND dirlist ${child}) |
| endif() |
| endforeach() |
| set(${result} ${dirlist} PARENT_SCOPE) |
| endfunction() |
| |
| function(to_py_bool cmake_bool py_bool) |
| if(${${cmake_bool}}) |
| set(${py_bool} True PARENT_SCOPE) |
| else() |
| set(${py_bool} False PARENT_SCOPE) |
| endif() |
| endfunction() |
| |
| # Function to download a files from the Arm Model Zoo |
| # Arguments: |
| # model_zoo_version: hash of the Arm Model Zoo commit to use |
| # file_sub_path: subpath within the model zoo repository |
| # download_path: location where this file is to be downloaded (path including filename) |
| function(download_file_from_modelzoo model_zoo_version file_sub_path download_path) |
| |
| set(MODEL_ZOO_REPO "https://github.com/ARM-software/ML-zoo/raw") |
| |
| string(JOIN "/" FILE_URL |
| ${MODEL_ZOO_REPO} ${model_zoo_version} ${file_sub_path}) |
| |
| message(STATUS "Downloading ${FILE_URL} to ${download_path}...") |
| |
| file(DOWNLOAD ${FILE_URL} ${download_path} |
| STATUS DOWNLOAD_STATE) |
| list(GET DOWNLOAD_STATE 0 RET_VAL) |
| |
| if(${RET_VAL}) |
| list(GET DOWNLOAD_STATE 1 RET_MSG) |
| message(FATAL_ERROR "Download failed with error code: ${RET_VAL}; " |
| "Error message: ${RET_MSG}") |
| endif() |
| |
| endfunction() |
| |
| function(add_platform_build_configuration) |
| |
| set(oneValueArgs TARGET_PLATFORM) |
| cmake_parse_arguments(PARSED "" "${oneValueArgs}" "" ${ARGN} ) |
| message(STATUS "Searching for ${PARSED_TARGET_PLATFORM} build configuration") |
| list(APPEND PLATFORM_BUILD_CONFIG_DIRS ${CMAKE_SCRIPTS_DIR}/platforms) |
| |
| FIND_PATH(PLATFORM_BUILD_CONFIG |
| NAMES build_configuration.cmake |
| PATH_SUFFIXES ${PARSED_TARGET_PLATFORM} |
| PATHS ${PLATFORM_BUILD_CONFIG_DIRS} |
| ) |
| |
| message(STATUS "Found build configuration: ${PLATFORM_BUILD_CONFIG}") |
| include(${PLATFORM_BUILD_CONFIG}/build_configuration.cmake) |
| endfunction() |
| |
| function(check_update_public_resources resource_downloaded_dir) |
| |
| string(JOIN "/" FILE_URL ${resource_downloaded_dir}) |
| execute_process( |
| COMMAND python3 ${SCRIPTS_DIR}/py/check_update_resources_downloaded.py |
| --resource_downloaded_dir ${resource_downloaded_dir} |
| --setup_script_path ${SCRIPTS_DIR}/../set_up_default_resources.py |
| RESULT_VARIABLE return_code |
| ) |
| if (NOT return_code EQUAL "0") |
| if (NOT return_code EQUAL "1") |
| # Return code equal to 2 or else means an error in the resources_downloaded folder |
| message(FATAL_ERROR "Resources downloaded error, please run: set_up_default_resources.py") |
| else() |
| # Return code equal to 1 means that resources_downloaded need to be updated |
| message(FATAL_ERROR "Resources downloaded need to be updated, please run: set_up_default_resources.py --clean") |
| endif() |
| endif () |
| |
| endfunction() |