Skip to content

Commit 487e357

Browse files
committed
Build XNNPACK as an ExternalProject
I believe this is necessary to support EXPORT. (We probably should not land this unless we have a PR stacked on top of this that successfully converts the build to EXPORT; sending this out so I can get CI going) ghstack-source-id: efefde1 ghstack-comment-id: 3067161235 Pull-Request: #12425
1 parent 56d39b9 commit 487e357

File tree

4 files changed

+108
-66
lines changed

4 files changed

+108
-66
lines changed

backends/xnnpack/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,8 @@ target_include_directories(
9292
${EXECUTORCH_ROOT}/third-party/flatbuffers/include
9393
)
9494

95-
set(xnnpack_third_party pthreadpool extension_threadpool cpuinfo)
96-
9795
include(cmake/Dependencies.cmake)
96+
set(xnnpack_third_party XNNPACK pthreadpool extension_threadpool cpuinfo)
9897

9998
list(TRANSFORM _xnnpack_backend__srcs PREPEND "${EXECUTORCH_ROOT}/")
10099
add_library(xnnpack_backend ${_xnnpack_backend__srcs})

backends/xnnpack/cmake/Dependencies.cmake

Lines changed: 71 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -10,71 +10,86 @@ set(THIRD_PARTY_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third-party")
1010

1111
# --- XNNPACK
1212

13-
# Setting this global PIC flag for all XNNPACK targets. This is needed for
14-
# Object libraries within XNNPACK which must be PIC to successfully link this
15-
# static libXNNPACK
16-
set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG
17-
${CMAKE_POSITION_INDEPENDENT_CODE}
18-
)
19-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
20-
2113
set(XNNPACK_SOURCE_DIR "${THIRD_PARTY_ROOT}/XNNPACK")
2214
set(XNNPACK_INCLUDE_DIR "${XNNPACK_SOURCE_DIR}/include")
23-
set(XNNPACK_LIBRARY_TYPE
24-
"static"
25-
CACHE STRING ""
26-
)
27-
set(XNNPACK_BUILD_BENCHMARKS
28-
OFF
29-
CACHE BOOL ""
30-
)
31-
set(XNNPACK_BUILD_TESTS
32-
OFF
33-
CACHE BOOL ""
15+
16+
include(ExternalProject)
17+
set(XNNPACK_STATIC_LIB
18+
"${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/install/lib/libXNNPACK.a"
3419
)
35-
set(XNNPACK_ENABLE_AVXVNNI
36-
OFF
37-
CACHE BOOL ""
20+
set(XNNPACK_MICROKERNELS_STATIC_LIB
21+
"${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/install/lib/libxnnpack-microkernels-prod.a"
3822
)
39-
# Work around observed failure: https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232
40-
set(XNNPACK_ENABLE_AVX512VNNIGFNI
41-
OFF
42-
CACHE BOOL "")
23+
get_extra_cmake_args_for_external_project(XNNPACK_EXTRA_CMAKE_ARGS)
24+
ExternalProject_Add(
25+
XNNPACKExternalProject
26+
SOURCE_DIR ${XNNPACK_SOURCE_DIR}
27+
# Not 100% clear on these locations
28+
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/XNNPACK
29+
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/install/
30+
INSTALL_BYPRODUCTS ${XNNPACK_STATIC_LIB} ${XNNPACK_MICROKERNELS_STATIC_LIB}
31+
CMAKE_ARGS
32+
${XNNPACK_EXTRA_CMAKE_ARGS}
33+
-D
34+
XNNPACK_LIBRARY_TYPE=static
35+
-D
36+
XNNPACK_BUILD_BENCHMARKS=OFF
37+
-D
38+
XNNPACK_BUILD_TESTS=OFF
39+
-D
40+
XNNPACK_ENABLE_AVXVNNI=OFF
41+
# Work around observed failure:
42+
# https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232
43+
-D
44+
XNNPACK_ENABLE_AVX512VNNIGFNI=OFF
45+
-D
46+
ENABLE_XNNPACK_WEIGHTS_CACHE=${EXECUTORCH_XNNPACK_ENABLE_WEIGHT_CACHE}
47+
-D
48+
ENABLE_XNNPACK_SHARED_WORKSPACE=${EXECUTORCH_XNNPACK_SHARED_WORKSPACE}
49+
-D
50+
XNNPACK_ENABLE_KLEIDIAI=${EXECUTORCH_XNNPACK_ENABLE_KLEIDIAI}
51+
-D
52+
CMAKE_INSTALL_PREFIX=<INSTALL_DIR>
53+
-D
54+
XNNPACK_BUILD_ALL_MICROKERNELS=OFF
55+
-D
56+
CMAKE_POSITION_INDEPENDENT_CODE=ON
57+
)
4358

44-
if(EXECUTORCH_XNNPACK_ENABLE_KLEIDI)
45-
set(XNNPACK_ENABLE_KLEIDIAI
46-
ON
47-
CACHE BOOL ""
48-
)
49-
else()
50-
set(XNNPACK_ENABLE_KLEIDIAI
51-
OFF
52-
CACHE BOOL ""
53-
)
54-
endif()
59+
add_library(XNNPACK STATIC IMPORTED GLOBAL)
60+
# TODO: this probably doesn't work on Windows.
61+
set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION ${XNNPACK_STATIC_LIB})
5562

63+
add_dependencies(XNNPACK XNNPACKExternalProject)
5664

57-
set(XNNPACK_BUILD_ALL_MICROKERNELS
58-
OFF
59-
CACHE BOOL ""
65+
add_library(xnnpack-microkernels-prod STATIC IMPORTED GLOBAL)
66+
set_property(
67+
TARGET xnnpack-microkernels-prod PROPERTY IMPORTED_LOCATION
68+
${XNNPACK_MICROKERNELS_STATIC_LIB}
6069
)
61-
add_subdirectory("${XNNPACK_SOURCE_DIR}")
62-
include_directories(SYSTEM ${XNNPACK_INCLUDE_DIR})
63-
list(APPEND xnnpack_third_party XNNPACK)
64-
install(TARGETS xnnpack-microkernels-prod
65-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
66-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
67-
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
70+
add_dependencies(xnnpack-microkernels-prod XNNPACKExternalProject)
6871

72+
set_target_properties(
73+
XNNPACK PROPERTIES INTERFACE_LINK_LIBRARIES xnnpack-microkernels-prod
74+
)
75+
76+
install(FILES ${XNNPACK_STATIC_LIB} ${XNNPACK_MICROKERNELS_STATIC_LIB}
77+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
78+
)
6979

7080
if(EXECUTORCH_XNNPACK_ENABLE_KLEIDI)
71-
install(TARGETS kleidiai
72-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
73-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
74-
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
81+
add_library(kleidiai SHARED IMPORTED)
82+
find_library(
83+
KLEIDIAI_LIBRARY kleidiai
84+
PATHS "${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/kleidiai-source"
85+
)
86+
if(not KLEIDIAI_LIBRARY)
87+
message(FATAL_ERROR "Can't find KleidiAI")
88+
endif()
89+
install(
90+
TARGETS kleidiai
91+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
92+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
93+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
94+
)
7595
endif()
76-
77-
# Revert PIC Flag to what it originally was
78-
set(CMAKE_POSITION_INDEPENDENT_CODE
79-
${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG}
80-
)

tools/cmake/Utils.cmake

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,31 @@ macro(find_package_torch)
278278
find_package(Torch CONFIG REQUIRED)
279279
endif()
280280
endmacro()
281+
282+
# In order to support cross compiling, we need to propagate a bunch of CMake
283+
# variables to ExternalProject. Call this to get the current values of all
284+
# relevant variables, which should then be passed to CMAKE_ARGS.
285+
function(get_extra_cmake_args_for_external_project outVar)
286+
set(VARIABLES_TO_PROPAGATE
287+
ANDROID_ABI
288+
ANDROID_PLATFORM
289+
CMAKE_BUILD_TYPE
290+
CMAKE_C_COMPILER_LAUNCHER
291+
CMAKE_CXX_COMPILER_LAUNCHER
292+
CMAKE_FIND_ROOT_PATH
293+
CMAKE_OSX_DEPLOYMENT_TARGET
294+
CMAKE_TOOLCHAIN_FILE
295+
DEPLOYMENT_TARGET
296+
PLATFORM
297+
)
298+
set(${outVar} "")
299+
foreach(var ${VARIABLES_TO_PROPAGATE})
300+
if(DEFINED ${var})
301+
list(APPEND ${outVar} -D "${var}=${${var}}")
302+
endif()
303+
endforeach()
304+
set(${outVar}
305+
${${outVar}}
306+
PARENT_SCOPE
307+
)
308+
endfunction()

tools/cmake/executorch-config.cmake

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ if(TARGET coremldelegate)
150150
endif()
151151

152152
if(TARGET etdump)
153-
set_target_properties(etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch")
153+
set_target_properties(
154+
etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch"
155+
)
154156
endif()
155157

156158
if(TARGET optimized_native_cpu_ops_lib)
@@ -174,13 +176,11 @@ if(TARGET extension_threadpool)
174176
endif()
175177

176178
set(shared_lib_list
177-
# executorch -- size tests fail due to regression if we include this and I'm not sure it's needed.
178-
optimized_native_cpu_ops_lib
179-
portable_ops_lib
180-
quantized_ops_lib
181-
xnnpack_backend
182-
vulkan_backend
183-
quantized_ops_aot_lib)
179+
# executorch -- size tests fail due to regression if we include this and I'm
180+
# not sure it's needed.
181+
optimized_native_cpu_ops_lib portable_ops_lib quantized_ops_lib
182+
xnnpack_backend vulkan_backend quantized_ops_aot_lib
183+
)
184184
foreach(lib ${shared_lib_list})
185185
if(TARGET ${lib})
186186
target_link_options_shared_lib(${lib})

0 commit comments

Comments
 (0)