blob: 173f0f3b2d67a40d420e0a653a9bc0e7cf0949c3 [file] [log] [blame]
# 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(set_parent _var)
set(${_var} ${ARGN} PARENT_SCOPE)
endmacro()
# Check if the path in _path exists. If true, set _output_variable
# to the absolute path, otherwise set it to the value of _path with
# the suffix "-NOTFOUND" appended to it.
function(_check_path_exists _path _output_variable)
file(TO_NATIVE_PATH "/" _native_root_dir)
file(RELATIVE_PATH _absolute_path "${_native_root_dir}" "${_path}")
# RELATIVE_PATH will strip the root, so add it back.
set(_absolute_path "${_native_root_dir}${_absolute_path}")
if(EXISTS "${_absolute_path}")
set_parent(${_output_variable} "${_absolute_path}")
else()
set_parent(${_output_variable} "${_path}-NOTFOUND")
endif()
endfunction()
# Check if all paths in the _paths list exist. If so set _output_variable
# to the list of the absolute paths from the input list, otherwise set
# _output_variable to the first path that was not found, and append the
# "-NOTFOUND" suffix to it.
function(_check_all_paths_exist _paths _output_variable)
foreach(_path IN LISTS _paths)
_check_path_exists("${_path}" _out_path)
if(_out_path)
list(APPEND _out_paths "${_out_path}")
else()
set_parent(${_output_variable} "${_path}-NOTFOUND")
return()
endif()
endforeach()
set_parent(${_output_variable} ${_out_paths})
endfunction()
function(_get_linux_version _output_vendor _output_release)
execute_process(
COMMAND lsb_release "-is"
OUTPUT_VARIABLE _vendor
)
if(_vendor)
string(STRIP "${_vendor}" _vendor)
set_parent(${_output_vendor} ${_vendor})
else()
set_parent(${_output_vendor} "NOTFOUND")
endif()
execute_process(
COMMAND lsb_release "-rs"
OUTPUT_VARIABLE _release
)
if(_release)
string(STRIP "${_release}" _release)
set_parent(${_output_release} ${_release})
else()
set_parent(${_output_release} "NOTFOUND")
endif()
endfunction()
function(_get_ubuntu_version _output_version)
_get_linux_version(_vendor _release)
if(_vendor STREQUAL "Ubuntu")
string(REGEX MATCH "[0-9]+" _release_major "${_release}")
if(_release_major)
set_parent(${_output_version} "${_vendor}${_release_major}")
return()
endif()
endif()
set_parent(${_output_version} "NOTFOUND")
endfunction()
function(_get_hexagon_sdk_property_impl
_hexagon_sdk_root _hexagon_arch _property _output_variable)
# Properties
# VERSION
# SDK_INCLUDE
# QURT_INCLUDE
# QURT_LIB
# RPCMEM_ROOT
# DSPRPC_LIB
# QAIC_EXE
if(${ARGC} LESS "4")
message(FATAL_ERROR
"Invalid number of arguments to get_hexagon_sdk_property"
)
endif()
# Set the Hexagon arch directory component.
set(_hexarch_dir_v65 "computev65")
set(_hexarch_dir_v66 "computev66")
set(_hexarch_dir_v68 "computev68")
set(_hexarch_dir_v69 "computev68") # Use computev68 for v69
set(_hexarch_dir_str "_hexarch_dir_${_hexagon_arch}")
set(_hexarch_dir "${${_hexarch_dir_str}}")
if(NOT _hexarch_dir)
message(SEND_ERROR "Please set Hexagon architecture to one of v65, v66, v68, v69")
endif()
if(_property STREQUAL "VERSION")
_check_path_exists("${_hexagon_sdk_root}/incs/version.h" _version_header)
if(_version_header)
execute_process(
COMMAND grep "#define[ \t]*VERSION_STRING" "${_version_header}"
OUTPUT_VARIABLE _version_define
)
string(
REGEX REPLACE ".*VERSION_STRING.* ([0-9\\.]+) .*" "\\1"
_version_string "${_version_define}"
)
set_parent(${_output_variable} ${_version_string})
else()
set_parent(${_output_variable} "${_property}-NOTFOUND")
endif()
elseif(_property STREQUAL "QAIC_EXE")
set(_override $ENV{QAIC_PATH_OVERRIDE})
if(_override)
_check_path_exists("${_override}" _qaic_path)
else()
_get_ubuntu_version(_uversion)
_check_path_exists(
"${_hexagon_sdk_root}/ipc/fastrpc/qaic/${_uversion}/qaic"
_qaic_path
)
endif()
if(NOT _qaic_path)
message(
WARNING
"The qaic executable cannot be found in '${_qaic_path}'. You can set "
"the environment variable QAIC_PATH_OVERRIDE to override the automatic "
"search."
)
endif()
set_parent(${_output_variable} "${_qaic_path}")
else()
# The rest of the checks returns path(s), which shares some common code.
if(_property STREQUAL "SDK_INCLUDE")
set(_dirs "${_hexagon_sdk_root}/incs" "${_hexagon_sdk_root}/incs/stddef")
elseif(_property STREQUAL "QURT_INCLUDE")
set(_dirs
"${_hexagon_sdk_root}/rtos/qurt/${_hexarch_dir}/include/posix"
"${_hexagon_sdk_root}/rtos/qurt/${_hexarch_dir}/include/qurt"
)
elseif(_property STREQUAL "QURT_LIB")
set(_dirs "${_hexagon_sdk_root}/rtos/qurt/${_hexarch_dir}/lib/pic")
elseif(_property STREQUAL "RPCMEM_ROOT")
set(_dirs "${_hexagon_sdk_root}/ipc/fastrpc/rpcmem")
elseif(_property STREQUAL "DSPRPC_LIB")
set(_dirs "${_hexagon_sdk_root}/ipc/fastrpc/remote/ship/android_aarch64")
else()
message(SEND_ERROR "Unknown SDK property ${_property}")
endif()
_check_all_paths_exist("${_dirs}" _dirs_exist)
set_parent(${_output_variable} "${_dirs_exist}")
endif()
endfunction()
function(get_hexagon_sdk_property _hexagon_sdk_root _hexagon_arch)
math(EXPR _pnum ${ARGC}-3) # _pnum = number of extra arguments minus 1
foreach(_p RANGE 0 ${_pnum} 2) # Range includes the upper bound.
list(GET ARGN 0 _property)
list(GET ARGN 1 _outvar)
_get_hexagon_sdk_property_impl(${_hexagon_sdk_root} ${_hexagon_arch}
${_property} _out
)
set_parent(${_outvar} ${_out})
list(REMOVE_AT ARGN 0 1)
endforeach()
endfunction()