Skip to content

Commit ff134fc

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: d179497 ghstack-comment-id: 3067161235 Pull-Request: #12425
1 parent b9bb3c1 commit ff134fc

File tree

5 files changed

+114
-68
lines changed

5 files changed

+114
-68
lines changed

CMakeLists.txt

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

733733
set(CMAKE_EXECUTABLE_SUFFIX ".html")
734-
target_link_options(executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file "${WASM_MODEL_DIR}@/")
734+
target_link_options(
735+
executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file
736+
"${WASM_MODEL_DIR}@/"
737+
)
735738
endif()
736739
endif()
737740

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: 72 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,73 +10,88 @@ 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+
set(KLEIDIAI_STATIC_LIB
26+
"${XNNPACK_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libkleidiai.a"
27+
)
28+
get_extra_cmake_args_for_external_project(XNNPACK_EXTRA_CMAKE_ARGS)
29+
ExternalProject_Add(
30+
XNNPACKExternalProject
31+
SOURCE_DIR ${XNNPACK_SOURCE_DIR}
32+
# Not 100% clear on these locations
33+
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/XNNPACK
34+
INSTALL_DIR ${XNNPACK_INSTALL_DIR}
35+
INSTALL_BYPRODUCTS ${XNNPACK_STATIC_LIB} ${XNNPACK_MICROKERNELS_STATIC_LIB}
36+
${KLEIDIAI_STATIC_LIB}
37+
CMAKE_ARGS
38+
${XNNPACK_EXTRA_CMAKE_ARGS}
39+
-D
40+
XNNPACK_LIBRARY_TYPE=static
41+
-D
42+
XNNPACK_BUILD_BENCHMARKS=OFF
43+
-D
44+
XNNPACK_BUILD_TESTS=OFF
45+
-D
46+
XNNPACK_ENABLE_AVXVNNI=OFF
47+
# Work around observed failure:
48+
# https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232
49+
-D
50+
XNNPACK_ENABLE_AVX512VNNIGFNI=OFF
51+
-D
52+
ENABLE_XNNPACK_WEIGHTS_CACHE=${EXECUTORCH_XNNPACK_ENABLE_WEIGHT_CACHE}
53+
-D
54+
ENABLE_XNNPACK_SHARED_WORKSPACE=${EXECUTORCH_XNNPACK_SHARED_WORKSPACE}
55+
-D
56+
XNNPACK_ENABLE_KLEIDIAI=${EXECUTORCH_XNNPACK_ENABLE_KLEIDI}
57+
-D
58+
CMAKE_INSTALL_PREFIX=<INSTALL_DIR>
59+
-D
60+
XNNPACK_BUILD_ALL_MICROKERNELS=OFF
61+
-D
62+
CMAKE_POSITION_INDEPENDENT_CODE=ON
3463
)
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 "")
4364

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

69+
add_dependencies(XNNPACK XNNPACKExternalProject)
5670

57-
set(XNNPACK_BUILD_ALL_MICROKERNELS
58-
OFF
59-
CACHE BOOL ""
71+
add_library(xnnpack-microkernels-prod STATIC IMPORTED GLOBAL)
72+
set_property(
73+
TARGET xnnpack-microkernels-prod PROPERTY IMPORTED_LOCATION
74+
${XNNPACK_MICROKERNELS_STATIC_LIB}
6075
)
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})
76+
add_dependencies(xnnpack-microkernels-prod XNNPACKExternalProject)
6877

78+
set_target_properties(
79+
XNNPACK PROPERTIES INTERFACE_LINK_LIBRARIES xnnpack-microkernels-prod
80+
)
81+
82+
install(DIRECTORY ${XNNPACK_INSTALL_DIR}/ DESTINATION ${CMAKE_INSTALL_PREFIX})
6983

7084
if(EXECUTORCH_XNNPACK_ENABLE_KLEIDI)
71-
if(TARGET kleidiai)
72-
install(TARGETS kleidiai
73-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
74-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
75-
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
76-
endif()
85+
add_library(kleidiai SHARED IMPORTED)
86+
install(FILES ${KLEIDIAI_STATIC_LIB} PUBLIC_HEADER
87+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
88+
)
89+
set_property(
90+
TARGET kleidiai PROPERTY IMPORTED_LOCATION ${KLEIDIAI_STATIC_LIB}
91+
)
92+
set_property(
93+
TARGET XNNPACK
94+
APPEND
95+
PROPERTY INTERFACE_LINK_LIBRARIES kleidiai
96+
)
7797
endif()
78-
79-
# Revert PIC Flag to what it originally was
80-
set(CMAKE_POSITION_INDEPENDENT_CODE
81-
${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG}
82-
)

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)