1# Copyright (c) 2024 MediaTek Inc. 2# 3# Licensed under the BSD License (the "License"); you may not use this file 4# except in compliance with the License. See the license file in the root 5# directory of this source tree for more details. 6 7cmake_minimum_required(VERSION 3.19) 8project(mediatek_example) 9 10message(CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}) 11 12set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 13if(NOT CMAKE_CXX_STANDARD) 14 set(CMAKE_CXX_STANDARD 17) 15endif() 16 17# Source root directory for executorch. 18if(NOT EXECUTORCH_ROOT) 19 set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) 20endif() 21 22include(${EXECUTORCH_ROOT}/build/Utils.cmake) 23include(${EXECUTORCH_ROOT}/build/Codegen.cmake) 24 25if(NOT PYTHON_EXECUTABLE) 26 resolve_python_executable() 27endif() 28 29set(_common_compile_options -Wno-deprecated-declarations -fPIC) 30 31# Let files say "include <executorch/path/to/header.h>". 32set(_common_include_directories ${EXECUTORCH_ROOT}/..) 33 34# 35# The `_<target>_srcs` lists are defined by including ${EXECUTORCH_SRCS_FILE}. 36# 37set(EXECUTORCH_SRCS_FILE 38 "${CMAKE_CURRENT_BINARY_DIR}/../../executorch_srcs.cmake" 39) 40extract_sources(${EXECUTORCH_SRCS_FILE}) 41include(${EXECUTORCH_SRCS_FILE}) 42 43# Find prebuilt libraries. executorch package should contain portable_ops_lib, 44# etdump, bundled_program. 45find_package(executorch CONFIG REQUIRED) 46target_compile_options(executorch INTERFACE -DET_EVENT_TRACER_ENABLED) 47find_package(gflags REQUIRED) 48 49link_directories(${EXECUTORCH_ROOT}/cmake-android-out/lib) 50 51if(${ANDROID}) 52 message("Build MTK Android Examples") 53 54 get_filename_component( 55 EXECUTORCH_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE 56 ) 57 set(_mtk_executor_runner__srcs ${_executor_runner__srcs}) 58 list(TRANSFORM _mtk_executor_runner__srcs PREPEND "${EXECUTORCH_SOURCE_DIR}/") 59 list(FILTER _mtk_executor_runner__srcs EXCLUDE REGEX ".*executor_runner.cpp$") 60 list(PREPEND _mtk_executor_runner__srcs 61 ${CMAKE_CURRENT_LIST_DIR}/executor_runner/mtk_executor_runner.cpp 62 ) 63 64 add_executable(mtk_executor_runner ${_mtk_executor_runner__srcs}) 65 66 target_include_directories( 67 mtk_executor_runner 68 PUBLIC ${_common_include_directories} 69 ${EXECUTORCH_ROOT}/cmake-android-out/third-party/gflags/include 70 ) 71 72 target_link_libraries( 73 mtk_executor_runner ${_executor_runner_libs} executorch neuron_backend 74 gflags 75 ) 76 target_compile_options(mtk_executor_runner PUBLIC ${_common_compile_options}) 77 78 set(_mtk_oss_executor_runner__srcs ${_executor_runner__srcs}) 79 list( 80 TRANSFORM 81 _mtk_oss_executor_runner__srcs 82 PREPEND 83 "${EXECUTORCH_SOURCE_DIR}/" 84 ) 85 list( 86 FILTER 87 _mtk_oss_executor_runner__srcs 88 EXCLUDE REGEX 89 ".*executor_runner.cpp$" 90 ) 91 list( 92 PREPEND 93 _mtk_oss_executor_runner__srcs 94 ${CMAKE_CURRENT_LIST_DIR}/executor_runner/mtk_oss_executor_runner.cpp 95 ) 96 97 add_executable(mtk_oss_executor_runner ${_mtk_oss_executor_runner__srcs}) 98 99 target_include_directories(mtk_oss_executor_runner 100 PUBLIC 101 ${_common_include_directories} 102 ${EXECUTORCH_ROOT}/cmake-android-out/third-party/gflags/include 103 ) 104 105 target_link_libraries(mtk_oss_executor_runner 106 ${_executor_runner_libs} 107 executorch 108 neuron_backend 109 gflags 110 ) 111 target_compile_options(mtk_oss_executor_runner 112 PUBLIC 113 ${_common_compile_options} 114 ) 115 116 set(_mtk_llama_executor_runner__srcs ${_mtk_executor_runner__srcs}) 117 list(FILTER _mtk_llama_executor_runner__srcs EXCLUDE REGEX 118 ".*executor_runner.cpp$" 119 ) 120 list(PREPEND _mtk_llama_executor_runner__srcs 121 ${CMAKE_CURRENT_LIST_DIR}/executor_runner/mtk_llama_executor_runner.cpp 122 ) 123 # Build ABSL and RE2 124 set(EXTENSIONS_LLM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../extension/llm) 125 set(THIRD_PARTY_ABSL_DIR ${EXTENSIONS_LLM_DIR}/third-party/abseil-cpp) 126 set(THIRD_PARTY_RE2_DIR ${EXTENSIONS_LLM_DIR}/third-party/re2) 127 set(ABSL_ENABLE_INSTALL ON) 128 set(ABSL_PROPAGATE_CXX_STD ON) 129 set(_pic_flag ${CMAKE_POSITION_INDEPENDENT_CODE}) 130 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 131 add_subdirectory( 132 ${THIRD_PARTY_ABSL_DIR} ${CMAKE_CURRENT_BINARY_DIR}/third-party/abseil 133 ) 134 add_subdirectory( 135 ${THIRD_PARTY_RE2_DIR} ${CMAKE_CURRENT_BINARY_DIR}/third-party/re2 136 ) 137 set(CMAKE_POSITION_INDEPENDENT_CODE ${_pic_flag}) 138 139 # Build tokenizers 140 set(LLAMA2_TOKENIZER_DIR ${EXTENSIONS_LLM_DIR}/tokenizer) 141 add_library(tokenizer STATIC) 142 target_include_directories( 143 tokenizer PUBLIC ${_common_include_directories} ${THIRD_PARTY_ABSL_DIR} 144 ${THIRD_PARTY_RE2_DIR} 145 ) 146 target_link_libraries(tokenizer PRIVATE re2::re2) 147 target_sources( 148 tokenizer 149 PRIVATE 150 ${LLAMA2_TOKENIZER_DIR}/tiktoken.cpp 151 ${LLAMA2_TOKENIZER_DIR}/bpe_tokenizer.cpp 152 ${CMAKE_CURRENT_SOURCE_DIR}/../models/llama/tokenizer/llama_tiktoken.cpp 153 ) 154 155 # Include directory for neuron headers 156 include_directories( 157 BEFORE ${_common_include_directories} 158 ${CMAKE_CURRENT_SOURCE_DIR}/../../backends/mediatek/runtime/include 159 ) 160 161 # Build Llama Executor static library 162 add_subdirectory(executor_runner/llama_runner) 163 164 # Build Llama Executor Runner 165 add_executable(mtk_llama_executor_runner ${_mtk_llama_executor_runner__srcs}) 166 167 target_link_libraries( 168 mtk_llama_executor_runner 169 ${_executor_runner_libs} 170 ${NEURON_BUFFER_ALLOCATOR_LIB} 171 neuron_backend 172 gflags 173 mtk_llama_executor_lib 174 tokenizer 175 ) 176 target_compile_options( 177 mtk_llama_executor_runner PUBLIC ${_common_compile_options} 178 ) 179endif() 180