1cmake_minimum_required(VERSION 3.4.1) 2option(BUILD_LITE_INTERPRETER "Master flag to build pytorch_jni_lite" ON) 3message( 4 STATUS 5 "BUILD_LITE_INTERPRETER (pytorch_jni_lite): ${BUILD_LITE_INTERPRETER}") 6 7if(BUILD_LITE_INTERPRETER) 8 project(pytorch_jni_lite CXX) 9 set(PYTORCH_JNI_TARGET pytorch_jni_lite) 10else() 11 project(pytorch_jni CXX) 12 set(PYTORCH_JNI_TARGET pytorch_jni) 13endif() 14 15include(GNUInstallDirs) 16 17set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ standard whose features are requested to build this target.") 18set(CMAKE_VERBOSE_MAKEFILE ON) 19message(STATUS "ANDROID_STL:${ANDROID_STL}") 20 21set(TRACE_ENABLED OFF) 22if(DEFINED ENV{TRACE_ENABLED}) 23 if($ENV{TRACE_ENABLED} STREQUAL "1") 24 message(STATUS "TRACE_ENABLED ON") 25 set(TRACE_ENABLED ON) 26 endif() 27endif() 28if(NOT TRACE_ENABLED) 29 message(STATUS "TRACE_ENABLED OFF") 30endif() 31 32set(USE_VULKAN OFF) 33 34set(pytorch_android_DIR ${CMAKE_CURRENT_LIST_DIR}/src/main/cpp) 35 36if(ANDROID_ABI) 37 set(USE_VULKAN ON) 38 set(libtorch_include_DIR ${pytorch_android_DIR}/libtorch_include/${ANDROID_ABI}) 39 set(BUILD_SUBDIR ${ANDROID_ABI}) 40elseif(BUILD_LIBTORCH_WITH_JNI) 41 # Don't need LIBTORCH_HOME if we're building from within PyTorch. 42else() 43 # Building against a pre-built libtorch. 44 if(NOT LIBTORCH_HOME) 45 message(FATAL_ERROR 46 "pytorch_android requires LIBTORCH_HOME to be defined for non-Android builds.") 47 endif() 48 set(libtorch_include_DIR ${LIBTORCH_HOME}/include) 49 link_directories(${LIBTORCH_HOME}/lib) 50 set(BUILD_SUBDIR host) 51endif() 52 53message(STATUS "libtorch dir:${libtorch_DIR}") 54 55configure_file( 56 ${pytorch_android_DIR}/cmake_macros.h.in 57 ${pytorch_android_DIR}/cmake_macros.h) 58 59 60if(BUILD_LITE_INTERPRETER) 61 file(GLOB pytorch_android_SOURCES 62 ${pytorch_android_DIR}/pytorch_jni_lite.cpp 63 ${pytorch_android_DIR}/pytorch_jni_common.cpp 64 ${pytorch_android_DIR}/pytorch_jni_common.h 65 ) 66else() 67 file(GLOB pytorch_android_SOURCES 68 ${pytorch_android_DIR}/pytorch_jni_jit.cpp 69 ${pytorch_android_DIR}/pytorch_jni_common.cpp 70 ${pytorch_android_DIR}/pytorch_jni_common.h 71 ) 72endif() 73add_library(${PYTORCH_JNI_TARGET} SHARED ${pytorch_android_SOURCES}) 74 75if(APPLE) 76 # Need to add rpath so dlopen can find dependencies. 77 add_custom_command(TARGET pytorch_jni 78 POST_BUILD COMMAND 79 ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@loader_path" 80 $<TARGET_FILE:pytorch_jni>) 81endif() 82 83target_compile_options(${PYTORCH_JNI_TARGET} PRIVATE 84 -fexceptions 85) 86target_include_directories(${PYTORCH_JNI_TARGET} BEFORE 87PUBLIC $<BUILD_INTERFACE:${libtorch_include_DIR}>) 88 89set(fbjni_DIR ${CMAKE_CURRENT_LIST_DIR}/../libs/fbjni/) 90set(fbjni_BUILD_DIR ${CMAKE_BINARY_DIR}/fbjni/${BUILD_SUBDIR}) 91 92add_subdirectory(${fbjni_DIR} ${fbjni_BUILD_DIR}) 93 94# ---[ Vulkan deps 95if(USE_VULKAN) 96 set(Vulkan_LIBS) 97 set(Vulkan_INCLUDES) 98 include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/VulkanDependencies.cmake) 99endif() 100 101if(ANDROID_ABI) 102 function(import_static_lib name) 103 add_library(${name} STATIC IMPORTED) 104 set_property( 105 TARGET ${name} 106 PROPERTY IMPORTED_LOCATION 107 ${CMAKE_CURRENT_LIST_DIR}/src/main/jniLibs/${ANDROID_ABI}/${name}.a) 108 endfunction(import_static_lib) 109 110 import_static_lib(libtorch) 111 import_static_lib(libtorch_cpu) 112 import_static_lib(libc10) 113 import_static_lib(libnnpack) 114 import_static_lib(libXNNPACK) 115 import_static_lib(libpytorch_qnnpack) 116 import_static_lib(libpthreadpool) 117 import_static_lib(libeigen_blas) 118 import_static_lib(libcpuinfo) 119 import_static_lib(libclog) 120 121 # Link most things statically on Android. 122 set(pytorch_jni_LIBS 123 fbjni 124 -Wl,--gc-sections 125 -Wl,--whole-archive 126 libtorch 127 libtorch_cpu 128 -Wl,--no-whole-archive 129 libc10 130 libnnpack 131 libXNNPACK 132 libpytorch_qnnpack 133 libpthreadpool 134 libeigen_blas 135 libcpuinfo 136 libclog 137 ) 138else() 139 # Prefer dynamic linking on the host 140 set(pytorch_jni_LIBS 141 fbjni 142 torch 143 torch_cpu 144 c10 145 cpuinfo 146 ) 147 148 if(USE_NNPACK) 149 list(APPEND pytorch_jni_LIBS nnpack) 150 endif() 151 152 if(USE_XNNPACK) 153 list(APPEND pytorch_jni_LIBS XNNPACK) 154 endif() 155 156 if(USE_SYSTEM_PTHREADPOOL) 157 list(APPEND pytorch_jni_LIBS pthreadpool) 158 endif() 159 160 if(USE_PYTORCH_QNNPACK) 161 list(APPEND pytorch_jni_LIBS pytorch_qnnpack) 162 list(APPEND pytorch_jni_LIBS clog) 163 endif() 164 165endif() 166 167if(USE_VULKAN) 168 list(APPEND pytorch_jni_LIBS ${Vulkan_LIBS}) 169endif() 170 171target_link_libraries(${PYTORCH_JNI_TARGET} ${pytorch_jni_LIBS}) 172 173install(TARGETS ${PYTORCH_JNI_TARGET} 174 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 175 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 176 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) #For windows 177 178if(MSVC) 179 install(FILES $<TARGET_PDB_FILE:pytorch_jni> DESTINATION ${CMAKE_INSTALL_LIBDIR} OPTIONAL) 180 install(TARGETS ${PYTORCH_JNI_TARGET} DESTINATION ${CMAKE_INSTALL_LIBDIR}) 181endif() 182