Add support for host build to pytorch_android native code (#27664)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/27664
When ANDROID_ABI is not set, find libtorch headers and libraries from
the LIBTORCH_HOME build variable (which must be set by hand), place
output under a "host" directory, and use dynamic linking instead of
static.
This doesn't actually work without some local changes to fbjni, but I
want to get the changes landed to avoid unnecessary merge conflicts.
Test Plan: Imported from OSS
Differential Revision: D18210315
Pulled By: dreiss
fbshipit-source-id: 685a62de3c2a0a52bec7fd6fb95113058456bac8
diff --git a/android/pytorch_android/CMakeLists.txt b/android/pytorch_android/CMakeLists.txt
index 18665ea..69b3f97 100644
--- a/android/pytorch_android/CMakeLists.txt
+++ b/android/pytorch_android/CMakeLists.txt
@@ -4,7 +4,19 @@
set(CMAKE_VERBOSE_MAKEFILE ON)
set(pytorch_android_DIR ${CMAKE_CURRENT_LIST_DIR}/src/main/cpp)
-set(libtorch_include_DIR ${pytorch_android_DIR}/libtorch_include/${ANDROID_ABI})
+
+if (ANDROID_ABI)
+ set(libtorch_include_DIR ${pytorch_android_DIR}/libtorch_include/${ANDROID_ABI})
+ set(BUILD_SUBDIR ${ANDROID_ABI})
+else()
+ if (NOT LIBTORCH_HOME)
+ message(FATAL_ERROR
+ "pytorch_android requires LIBTORCH_HOME to be defined for non-Android builds.")
+ endif()
+ set(libtorch_include_DIR ${LIBTORCH_HOME}/include)
+ link_directories(${LIBTORCH_HOME}/lib)
+ set(BUILD_SUBDIR host)
+endif()
message(STATUS "libtorch dir:${libtorch_DIR}")
@@ -25,36 +37,57 @@
)
set(fbjni_DIR ${CMAKE_CURRENT_LIST_DIR}/../libs/fbjni/)
-set(fbjni_BUILD_DIR ${CMAKE_BINARY_DIR}/fbjni/${ANDROID_ABI})
+set(fbjni_BUILD_DIR ${CMAKE_BINARY_DIR}/fbjni/${BUILD_SUBDIR})
add_subdirectory(${fbjni_DIR} ${fbjni_BUILD_DIR})
-function(import_static_lib name)
- add_library(${name} STATIC IMPORTED)
- set_property(
- TARGET ${name}
- PROPERTY IMPORTED_LOCATION
- ${CMAKE_CURRENT_LIST_DIR}/src/main/jniLibs/${ANDROID_ABI}/${name}.a)
-endfunction(import_static_lib)
+if (ANDROID_ABI)
-import_static_lib(libtorch)
-import_static_lib(libc10)
-import_static_lib(libnnpack)
-import_static_lib(libpytorch_qnnpack)
-import_static_lib(libeigen_blas)
-import_static_lib(libcpuinfo)
-import_static_lib(libclog)
+ function(import_static_lib name)
+ add_library(${name} STATIC IMPORTED)
+ set_property(
+ TARGET ${name}
+ PROPERTY IMPORTED_LOCATION
+ ${CMAKE_CURRENT_LIST_DIR}/src/main/jniLibs/${ANDROID_ABI}/${name}.a)
+ endfunction(import_static_lib)
-target_link_libraries(pytorch
- fbjni
- -Wl,--gc-sections
- -Wl,--whole-archive
- libtorch
- -Wl,--no-whole-archive
- libc10
- libnnpack
- libpytorch_qnnpack
- libeigen_blas
- libcpuinfo
- libclog
-)
+ import_static_lib(libtorch)
+ import_static_lib(libc10)
+ import_static_lib(libnnpack)
+ import_static_lib(libpytorch_qnnpack)
+ import_static_lib(libeigen_blas)
+ import_static_lib(libcpuinfo)
+ import_static_lib(libclog)
+
+ # Link most things statically on Android.
+ target_link_libraries(pytorch
+ fbjni
+ -Wl,--gc-sections
+ -Wl,--whole-archive
+ libtorch
+ -Wl,--no-whole-archive
+ libc10
+ libnnpack
+ libpytorch_qnnpack
+ libeigen_blas
+ libcpuinfo
+ libclog
+ )
+
+else()
+
+ # Prefer dynamic linking on the host
+ target_link_libraries(pytorch
+ fbjni
+ -Wl,--gc-sections
+ -Wl,--whole-archive
+ torch
+ -Wl,--no-whole-archive
+ c10
+ nnpack
+ pytorch_qnnpack
+ cpuinfo
+ clog
+ )
+
+endif()