• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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