Packages

QNN (Qualcomm AI Engine Direct) NIF bindings for the Hexagon NPU (QCS6490/HTP)

Current section

Files

Jump to
hexagon_tpu CMakeLists.txt
Raw

CMakeLists.txt

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project(hexagon_tpu_nif C CXX)
if(NOT DEFINED PRIV_DIR)
if(DEFINED MIX_APP_PATH AND NOT "${MIX_APP_PATH}" STREQUAL "")
set(PRIV_DIR "${MIX_APP_PATH}/priv")
else()
set(PRIV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/priv")
endif()
endif()
if(NOT DEFINED C_SRC OR "${C_SRC}" STREQUAL "")
set(C_SRC "${CMAKE_CURRENT_SOURCE_DIR}/c_src")
endif()
# ERTS include directory (provided by elixir_make, or derived from erl)
if(DEFINED ERTS_INCLUDE_DIR AND NOT "${ERTS_INCLUDE_DIR}" STREQUAL "")
set(ERTS_INCLUDE_DIR "${ERTS_INCLUDE_DIR}")
else()
find_program(ERL_EXECUTABLE erl)
if(ERL_EXECUTABLE)
execute_process(
COMMAND ${ERL_EXECUTABLE} -noshell -eval "io:format('~s', [code:root_dir() ++ \"/erts-\" ++ erlang:system_info(version) ++ \"/include\"]), halt()."
OUTPUT_VARIABLE ERTS_INCLUDE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
else()
message(FATAL_ERROR "Erlang executable 'erl' not found")
endif()
endif()
if(NOT EXISTS "${ERTS_INCLUDE_DIR}")
message(FATAL_ERROR "ERTS_INCLUDE_DIR does not exist: '${ERTS_INCLUDE_DIR}'")
endif()
# QNN headers (the only SDK input; backends are dlopen'd at runtime)
if(NOT DEFINED QNN_SDK_ROOT OR "${QNN_SDK_ROOT}" STREQUAL "")
message(FATAL_ERROR "QNN_SDK_ROOT is not set (path to extracted QAIRT SDK)")
endif()
if(NOT EXISTS "${QNN_SDK_ROOT}/include/QNN/QnnInterface.h")
message(FATAL_ERROR "QNN headers not found under '${QNN_SDK_ROOT}/include/QNN'")
endif()
message(STATUS "PRIV_DIR: ${PRIV_DIR}")
message(STATUS "ERTS_INCLUDE_DIR: ${ERTS_INCLUDE_DIR}")
message(STATUS "QNN_SDK_ROOT: ${QNN_SDK_ROOT}")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include_directories("${ERTS_INCLUDE_DIR}")
include_directories(SYSTEM "${QNN_SDK_ROOT}/include/QNN")
include_directories("${C_SRC}")
set(SOURCE_FILES
"${C_SRC}/hexagon_tpu_nif.cpp"
"${C_SRC}/qnn_api.cpp"
"${C_SRC}/qnn_meta.cpp"
)
add_library(hexagon_tpu_nif SHARED ${SOURCE_FILES})
target_compile_options(hexagon_tpu_nif PRIVATE -Wall -Wextra)
# Only libdl: QNN backends (libQnnHtp.so / libQnnCpu.so / libQnnSystem.so)
# are dlopen'd at runtime from the device rootfs.
target_link_libraries(hexagon_tpu_nif PRIVATE dl)
# Statically link libstdc++/libgcc so the NIF doesn't depend on the target
# rootfs C++ runtime version (toolchain gcc may be newer than rootfs).
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_link_options(hexagon_tpu_nif PRIVATE -static-libstdc++ -static-libgcc)
endif()
set_target_properties(hexagon_tpu_nif PROPERTIES PREFIX "")
if(NOT WIN32)
set_target_properties(hexagon_tpu_nif PROPERTIES SUFFIX ".so")
endif()
if(UNIX AND APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
endif()
install(TARGETS hexagon_tpu_nif RUNTIME DESTINATION "${PRIV_DIR}")