206 lines
7.0 KiB
CMake
206 lines
7.0 KiB
CMake
# 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 "computev69")
|
|
set(_hexarch_dir_v73 "computev73")
|
|
set(_hexarch_dir_v75 "computev75")
|
|
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, v73, v75")
|
|
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 the Hexagon arch directory for runtime linker.
|
|
set(_rtld_dir "hexagon_toolv84_${_hexagon_arch}")
|
|
if(_hexagon_arch STREQUAL "v75")
|
|
set(_rtld_dir "hexagon_toolv87_v75") # Use hexagon_toolv87_v75 for v75
|
|
endif()
|
|
if(_hexagon_arch STREQUAL "v69")
|
|
set(_rtld_dir "hexagon_toolv84_v68") # Use hexagon_toolv84_v68 for v69
|
|
endif()
|
|
set(_dirs
|
|
"${_hexagon_sdk_root}/rtos/qurt/${_hexarch_dir}/include/posix"
|
|
"${_hexagon_sdk_root}/rtos/qurt/${_hexarch_dir}/include/qurt"
|
|
"${_hexagon_sdk_root}/ipc/fastrpc/rtld/ship/${_rtld_dir}"
|
|
)
|
|
_check_path_exists("${_hexagon_sdk_root}/ipc/fastrpc/rtld/ship/inc" _sdk_dlfcn)
|
|
if(_sdk_dlfcn)
|
|
list(APPEND _dirs "${_hexagon_sdk_root}/ipc/fastrpc/rtld/ship/inc")
|
|
endif()
|
|
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()
|