Skip to content

Commit 55af0a1

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: 0aa08b8 ghstack-comment-id: 3067161235 Pull-Request: #12425
1 parent 7c300e7 commit 55af0a1

File tree

3 files changed

+78
-71
lines changed

3 files changed

+78
-71
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: 69 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -10,71 +10,84 @@ 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 ""
15+
16+
include(ExternalProject)
17+
set(XNNPACK_STATIC_LIB "${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/libXNNPACK.a")
18+
set(XNNPACK_MICROKERNELS_STATIC_LIB
19+
"${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/libxnnpack-microkernels-prod.a"
3020
)
31-
set(XNNPACK_BUILD_TESTS
32-
OFF
33-
CACHE BOOL ""
21+
ExternalProject_Add(
22+
XNNPACKExternalProject
23+
SOURCE_DIR ${XNNPACK_SOURCE_DIR}
24+
# Not 100% clear on these locations
25+
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/XNNPACK
26+
BUILD_BYPRODUCTS ${XNNPACK_STATIC_LIB} ${XNNPACK_MICROKERNELS_STATIC_LIB}
27+
CMAKE_ARGS
28+
-D
29+
XNNPACK_LIBRARY_TYPE=static
30+
-D
31+
XNNPACK_BUILD_BENCHMARKS=OFF
32+
-D
33+
XNNPACK_BUILD_TESTS=OFF
34+
-D
35+
XNNPACK_ENABLE_AVXVNNI=OFF
36+
# Work around observed failure:
37+
# https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232
38+
-D
39+
XNNPACK_ENABLE_AVX512VNNIGFNI=OFF
40+
-D
41+
ENABLE_XNNPACK_WEIGHTS_CACHE=${EXECUTORCH_XNNPACK_ENABLE_WEIGHT_CACHE}
42+
-D
43+
ENABLE_XNNPACK_SHARED_WORKSPACE=${EXECUTORCH_XNNPACK_SHARED_WORKSPACE}
44+
-D
45+
XNNPACK_ENABLE_KLEIDIAI=${EXECUTORCH_XNNPACK_ENABLE_KLEIDIAI}
46+
-D
47+
CMAKE_INSTALL_PREFIX=<INSTALL_DIR>
48+
-D
49+
XNNPACK_BUILD_ALL_MICROKERNELS=OFF
50+
-D
51+
CMAKE_POSITION_INDEPENDENT_CODE=ON
3452
)
35-
set(XNNPACK_ENABLE_AVXVNNI
36-
OFF
37-
CACHE BOOL ""
38-
)
39-
# Work around observed failure: https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232
40-
set(XNNPACK_ENABLE_AVX512VNNIGFNI
41-
OFF
42-
CACHE BOOL "")
4353

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()
54+
# add_subdirectory("${XNNPACK_SOURCE_DIR}") include_directories(SYSTEM
55+
# ${XNNPACK_INCLUDE_DIR})
56+
57+
add_library(XNNPACK STATIC IMPORTED GLOBAL)
58+
# TODO: this probably doesn't work on Windows.
59+
set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION ${XNNPACK_STATIC_LIB})
5560

61+
add_dependencies(XNNPACK XNNPACKExternalProject)
5662

57-
set(XNNPACK_BUILD_ALL_MICROKERNELS
58-
OFF
59-
CACHE BOOL ""
63+
add_library(xnnpack-microkernels-prod STATIC IMPORTED GLOBAL)
64+
set_property(
65+
TARGET xnnpack-microkernels-prod PROPERTY IMPORTED_LOCATION
66+
${XNNPACK_MICROKERNELS_STATIC_LIB}
6067
)
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})
68+
add_dependencies(xnnpack-microkernels-prod XNNPACKExternalProject)
6869

70+
set_target_properties(
71+
XNNPACK PROPERTIES INTERFACE_LINK_LIBRARIES xnnpack-microkernels-prod
72+
)
73+
74+
install(FILES ${XNNPACK_MICROKERNELS_STATIC_LIB}
75+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
76+
)
6977

7078
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})
79+
add_library(kleidiai SHARED IMPORTED)
80+
find_library(
81+
KLEIDIAI_LIBRARY kleidiai
82+
PATHS "${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/kleidiai-source"
83+
)
84+
if(not KLEIDIAI_LIBRARY)
85+
message(FATAL_ERROR "Can't find KleidiAI")
86+
endif()
87+
install(
88+
TARGETS kleidiai
89+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
90+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
91+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
92+
)
7593
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/executorch-config.cmake

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ set(lib_list
7878
extension_threadpool
7979
extension_training
8080
xnnpack_backend
81-
# Start XNNPACK Lib Deps
82-
XNNPACK
83-
xnnpack-microkernels-prod
84-
kleidiai
85-
# End XNNPACK Lib Deps
8681
cpuinfo
8782
pthreadpool
8883
vulkan_backend
@@ -150,7 +145,9 @@ if(TARGET coremldelegate)
150145
endif()
151146

152147
if(TARGET etdump)
153-
set_target_properties(etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch")
148+
set_target_properties(
149+
etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch"
150+
)
154151
endif()
155152

156153
if(TARGET optimized_native_cpu_ops_lib)
@@ -174,13 +171,11 @@ if(TARGET extension_threadpool)
174171
endif()
175172

176173
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)
174+
# executorch -- size tests fail due to regression if we include this and I'm
175+
# not sure it's needed.
176+
optimized_native_cpu_ops_lib portable_ops_lib quantized_ops_lib
177+
xnnpack_backend vulkan_backend quantized_ops_aot_lib
178+
)
184179
foreach(lib ${shared_lib_list})
185180
if(TARGET ${lib})
186181
target_link_options_shared_lib(${lib})

0 commit comments

Comments
 (0)