# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. macro(__tvm_option variable description value) if(NOT DEFINED ${variable}) set(${variable} ${value} CACHE STRING ${description}) endif() endmacro() set(TVM_ALL_OPTIONS) ####################################################### # An option that the user can select. Can accept condition to control when option is available for user. # Usage: # tvm_option( "doc string" [IF ]) macro(tvm_option variable description value) set(__value ${value}) set(__condition "") set(__varname "__value") list(APPEND TVM_ALL_OPTIONS ${variable}) foreach(arg ${ARGN}) if(arg STREQUAL "IF" OR arg STREQUAL "if") set(__varname "__condition") else() list(APPEND ${__varname} ${arg}) endif() endforeach() unset(__varname) if("${__condition}" STREQUAL "") set(__condition 2 GREATER 1) endif() if(${__condition}) if("${__value}" MATCHES ";") if(${__value}) __tvm_option(${variable} "${description}" ON) else() __tvm_option(${variable} "${description}" OFF) endif() elseif(DEFINED ${__value}) if(${__value}) __tvm_option(${variable} "${description}" ON) else() __tvm_option(${variable} "${description}" OFF) endif() else() __tvm_option(${variable} "${description}" "${__value}") endif() else() unset(${variable} CACHE) endif() endmacro() function(assign_source_group group) foreach(_source IN ITEMS ${ARGN}) if (IS_ABSOLUTE "${_source}") file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}") else() set(_source_rel "${_source}") endif() get_filename_component(_source_path "${_source_rel}" PATH) string(REPLACE "/" "\\" _source_path_msvc "${_source_path}") source_group("${group}\\${_source_path_msvc}" FILES "${_source}") endforeach() endfunction(assign_source_group) function(tvm_micro_add_copy_file var src dest) get_filename_component(basename "${src}" NAME) get_filename_component(dest_parent_dir "${dest}" DIRECTORY) add_custom_command( OUTPUT "${dest}" COMMAND "${CMAKE_COMMAND}" -E copy "${src}" "${dest}" DEPENDS "${src}") list(APPEND "${var}" "${dest}") set("${var}" "${${var}}" PARENT_SCOPE) endfunction(tvm_micro_add_copy_file) set(MICROTVM_TEMPLATE_PROJECTS "${CMAKE_CURRENT_BINARY_DIR}/microtvm_template_projects") # From cmake documentation: # True if the constant is 1, ON, YES, TRUE, Y, or a non-zero number. # False if the constant is 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, the empty string, or ends in the suffix -NOTFOUND. # Named boolean constants are case-insensitive. # # While this regex does contain a check for an empty string that check does not work # cmake's regex is weak set(IS_FALSE_PATTERN "^[Oo][Ff][Ff]$|^0$|^[Ff][Aa][Ll][Ss][Ee]$|^[Nn][Oo]$|^[Nn][Oo][Tt][Ff][Oo][Uu][Nn][Dd]$|.*-[Nn][Oo][Tt][Ff][Oo][Uu][Nn][Dd]$|^$") set(IS_TRUE_PATTERN "^[Oo][Nn]$|^[1-9][0-9]*$|^[Tt][Rr][Uu][Ee]$|^[Yy][Ee][Ss]$|^[Yy]$") # Custom file() macro that automatically uses CONFIGURE_DEPENDS if cmake # supports it. CONFIGURE_DEPENDS scans the globbed directories on each build to # check if any files have been added/removed. This has a small build overhead, # but ensures that you don't manually have to rerun cmake if files were added. # The macro should be used like so: # tvm_file_glob(GLOB VARIABLE_NAME dir/*.cc dir/*c) # or # tvm_file_glob(GLOB_RECURSE VARIABLE_NAME dir/*/*.cc) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") macro(tvm_file_glob glob variable) file(${glob} ${variable} CONFIGURE_DEPENDS ${ARGN}) endmacro() else() macro(tvm_file_glob) file(${glob} ${variable} ${ARGN}) endmacro() endif()