Skip to content

Commit 3c27f10

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: 1749e27 ghstack-comment-id: 3067161235 Pull-Request: #12425
1 parent 4e24f14 commit 3c27f10

File tree

5 files changed

+109
-66
lines changed

5 files changed

+109
-66
lines changed

CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,10 @@ if(EXECUTORCH_BUILD_EXECUTOR_RUNNER)
737737
endif()
738738

739739
set(CMAKE_EXECUTABLE_SUFFIX ".html")
740-
target_link_options(executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file "${WASM_MODEL_DIR}@/")
740+
target_link_options(
741+
executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file
742+
"${WASM_MODEL_DIR}@/"
743+
)
741744
endif()
742745
endif()
743746

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

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()
61+
add_library(XNNPACK STATIC IMPORTED GLOBAL)
62+
# TODO: this probably doesn't work on Windows.
63+
set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION ${XNNPACK_STATIC_LIB})
5564

65+
add_dependencies(XNNPACK XNNPACKExternalProject)
5666

57-
set(XNNPACK_BUILD_ALL_MICROKERNELS
58-
OFF
59-
CACHE BOOL ""
67+
add_library(xnnpack-microkernels-prod STATIC IMPORTED GLOBAL)
68+
set_property(
69+
TARGET xnnpack-microkernels-prod PROPERTY IMPORTED_LOCATION
70+
${XNNPACK_MICROKERNELS_STATIC_LIB}
6071
)
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})
72+
add_dependencies(xnnpack-microkernels-prod XNNPACKExternalProject)
6873

74+
set_target_properties(
75+
XNNPACK PROPERTIES INTERFACE_LINK_LIBRARIES xnnpack-microkernels-prod
76+
)
77+
78+
install(DIRECTORY ${XNNPACK_INSTALL_DIR}/ DESTINATION ${CMAKE_INSTALL_PREFIX})
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(FILES ${KLEIDIAI_LIBRARY} PUBLIC_HEADER
90+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
91+
)
7592
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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,32 @@ 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_ARCHIVE_OUTPUT_DIRECTORY
290+
CMAKE_BUILD_TYPE
291+
CMAKE_C_COMPILER_LAUNCHER
292+
CMAKE_CXX_COMPILER_LAUNCHER
293+
CMAKE_FIND_ROOT_PATH
294+
CMAKE_OSX_DEPLOYMENT_TARGET
295+
CMAKE_TOOLCHAIN_FILE
296+
DEPLOYMENT_TARGET
297+
PLATFORM
298+
)
299+
set(${outVar} "")
300+
foreach(var ${VARIABLES_TO_PROPAGATE})
301+
if(DEFINED ${var})
302+
list(APPEND ${outVar} -D "${var}=${${var}}")
303+
endif()
304+
endforeach()
305+
set(${outVar}
306+
${${outVar}}
307+
PARENT_SCOPE
308+
)
309+
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)