diff --git a/CMakeLists.txt b/CMakeLists.txt index e58036a5cad..834a732ef40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,86 +164,126 @@ endif() add_subdirectory(third-party) if(NOT DEFINED FXDIV_SOURCE_DIR) - set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG - ${CMAKE_POSITION_INDEPENDENT_CODE} + include(GNUInstallDirs) + get_extra_cmake_args_for_external_project(FXDIV_EXTRA_CMAKE_ARGS) + set(FXDIV_SOURCE_DIR + "${CMAKE_CURRENT_LIST_DIR}/backends/xnnpack/third-party/FXdiv" ) - set(FXDIV_SOURCE_DIR "backends/xnnpack/third-party/FXdiv") - add_subdirectory("${FXDIV_SOURCE_DIR}") - set(CMAKE_POSITION_INDEPENDENT_CODE - ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG} + set(FXDIV_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/fxdiv") + set(FXDIV_INSTALL_DIR "${FXDIV_BINARY_DIR}/install") + set(FXDIV_HEADER "${FXDIV_INSTALL_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/fxdiv.h") + ExternalProject_Add( + fxdivExternalProject + SOURCE_DIR "${FXDIV_SOURCE_DIR}" + BINARY_DIR "${FXDIV_BINARY_DIR}" + INSTALL_DIR "${FXDIV_INSTALL_DIR}" + BUILD_BYPRODUCTS "${FXDIV_HEADER}" + CMAKE_ARGS "${FXDIV_EXTRA_CMAKE_ARGS}" + -D + CMAKE_INSTALL_PREFIX= + -D + FXDIV_BUILD_TESTS=OFF + -D + FXDIV_BUILD_BENCHMARKS=OFF ) + add_library(fxdiv INTERFACE IMPORTED) + set_property(TARGET fxdiv PROPERTY IMPORTED_LOCATION "${FXDIV_HEADER}") endif() if(EXECUTORCH_BUILD_CPUINFO) # --- cpuinfo - set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG - ${CMAKE_POSITION_INDEPENDENT_CODE} + set(CPUINFO_SOURCE_DIR + "${CMAKE_CURRENT_LIST_DIR}/backends/xnnpack/third-party/cpuinfo" ) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - set(CPUINFO_SOURCE_DIR "backends/xnnpack/third-party/cpuinfo") - set(CPUINFO_BUILD_TOOLS - OFF - CACHE BOOL "" + set(CPUINFO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/cpuinfo") + set(CPUINFO_INSTALL_DIR "${CPUINFO_BINARY_DIR}/install") + set(CPUINFO_LIBRARY + "${CPUINFO_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libcpuinfo.a" ) - set(CPUINFO_BUILD_UNIT_TESTS - OFF - CACHE BOOL "" - ) - set(CPUINFO_BUILD_MOCK_TESTS - OFF - CACHE BOOL "" - ) - set(CPUINFO_BUILD_BENCHMARKS - OFF - CACHE BOOL "" - ) - set(CPUINFO_LIBRARY_TYPE - "static" - CACHE STRING "" - ) - set(CPUINFO_LOG_LEVEL - "error" - CACHE STRING "" + + get_extra_cmake_args_for_external_project(CPUINFO_EXTRA_CMAKE_ARGS) + ExternalProject_Add( + cpuinfoExternalProject + SOURCE_DIR "${CPUINFO_SOURCE_DIR}" + BINARY_DIR "${CPUINFO_BINARY_DIR}" + INSTALL_DIR "${CPUINFO_INSTALL_DIR}" + BUILD_BYPRODUCTS "${CPUINFO_LIBRARY}" + CMAKE_ARGS "${CPUINFO_EXTRA_CMAKE_ARGS}" + -D + CMAKE_POSITION_INDEPENDENT_CODE=ON + -D + CPUINFO_BUILD_TOOLS=OFF + -D + CPUINFO_BUILD_UNIT_TESTS=OFF + -D + CPUINFO_BUILD_MOCK_TESTS=OFF + -D + CPUINFO_BUILD_BENCHMARKS=OFF + -D + CPUINFO_LIBRARY_TYPE=static + -D + CPUINFO_LOG_LEVEL=error + -D + CMAKE_INSTALL_PREFIX= + -D + CLOG_SOURCE_DIR="${CPUINFO_SOURCE_DIR}/deps/clog" ) - set(CLOG_SOURCE_DIR "${CPUINFO_SOURCE_DIR}/deps/clog") - add_subdirectory("${CPUINFO_SOURCE_DIR}") - set(CMAKE_POSITION_INDEPENDENT_CODE - ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG} + add_library(cpuinfo STATIC IMPORTED) + set_property(TARGET cpuinfo PROPERTY IMPORTED_LOCATION "${CPUINFO_LIBRARY}") + add_dependencies(cpuinfo cpuinfoExternalProject) + # Trailing slash matters here! "Move everything from the temporary pthreadpool + # install directory to the proper install directory." + install(DIRECTORY "${CPUINFO_INSTALL_DIR}/" + DESTINATION "${CMAKE_INSTALL_PREFIX}" ) endif() if(EXECUTORCH_BUILD_PTHREADPOOL) # --- pthreadpool - set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG - ${CMAKE_POSITION_INDEPENDENT_CODE} - ) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - set(PTHREADPOOL_SOURCE_DIR "backends/xnnpack/third-party/pthreadpool") - set(PTHREADPOOL_BUILD_TESTS - OFF - CACHE BOOL "" + set(PTHREADPOOL_SOURCE_DIR + "${CMAKE_CURRENT_LIST_DIR}/backends/xnnpack/third-party/pthreadpool" ) - set(PTHREADPOOL_BUILD_BENCHMARKS - OFF - CACHE BOOL "" - ) - set(PTHREADPOOL_LIBRARY_TYPE - "static" - CACHE STRING "" - ) - set(PTHREADPOOL_ALLOW_DEPRECATED_API - ON - CACHE BOOL "" + include(GNUInstallDirs) + set(PTHREADPOOL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/pthreadpool") + set(PTHREADPOOL_INSTALL_DIR "${PTHREADPOOL_BINARY_DIR}/install") + set(PTHREADPOOL_LIBRARY + "${PTHREADPOOL_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libpthreadpool.a" ) + get_extra_cmake_args_for_external_project(PTHREADPOOL_EXTRA_CMAKE_ARGS) if(APPLE) - set(PTHREADPOOL_SYNC_PRIMITIVE - "condvar" - CACHE STRING "" + list(APPEND PTHREADPOOL_EXTRA_CMAKE_ARGS -D + PTHREADPOOL_SYNC_PRIMITIVE=condvar ) endif() - add_subdirectory("${PTHREADPOOL_SOURCE_DIR}") - set(CMAKE_POSITION_INDEPENDENT_CODE - ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG} + ExternalProject_Add( + pthreadpoolExternalProject + SOURCE_DIR "${PTHREADPOOL_SOURCE_DIR}" + BINARY_DIR "${PTHREADPOOL_BINARY_DIR}" + INSTALL_DIR "${PTHREADPOOL_INSTALL_DIR}" + BUILD_BYPRODUCTS "${PTHREADPOOL_LIBRARY}" + CMAKE_ARGS ${PTHREADPOOL_EXTRA_CMAKE_ARGS} + -D + PTHREADPOOL_BUILD_TESTS=OFF + -D + PTHREADPOOL_BUILD_BENCHMARKS=OFF + -D + PTHREADPOOL_LIBRARY_TYPE=static + -D + PTHREADPOOL_ALLOW_DEPRECATED_API=ON + -D + CMAKE_POSITION_INDEPENDENT_CODE=ON + -D + CMAKE_INSTALL_PREFIX= + ) + add_library(pthreadpool STATIC IMPORTED) + set_property( + TARGET pthreadpool PROPERTY IMPORTED_LOCATION "${PTHREADPOOL_LIBRARY}" + ) + add_dependencies(pthreadpool pthreadpoolExternalProject) + # Trailing slash matters here! "Move everything from the temporary pthreadpool + # install directory to the proper install directory." + install(DIRECTORY "${PTHREADPOOL_INSTALL_DIR}/" + DESTINATION "${CMAKE_INSTALL_PREFIX}" ) endif() @@ -731,7 +771,10 @@ if(EXECUTORCH_BUILD_EXECUTOR_RUNNER) endif() set(CMAKE_EXECUTABLE_SUFFIX ".html") - target_link_options(executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file "${WASM_MODEL_DIR}@/") + target_link_options( + executor_runner PUBLIC -sALLOW_MEMORY_GROWTH --embed-file + "${WASM_MODEL_DIR}@/" + ) endif() endif() diff --git a/backends/xnnpack/CMakeLists.txt b/backends/xnnpack/CMakeLists.txt index b6ba211ecb3..c4c5068d197 100644 --- a/backends/xnnpack/CMakeLists.txt +++ b/backends/xnnpack/CMakeLists.txt @@ -92,9 +92,8 @@ target_include_directories( ${EXECUTORCH_ROOT}/third-party/flatbuffers/include ) -set(xnnpack_third_party pthreadpool extension_threadpool cpuinfo) - include(cmake/Dependencies.cmake) +set(xnnpack_third_party XNNPACK pthreadpool extension_threadpool cpuinfo) list(TRANSFORM _xnnpack_backend__srcs PREPEND "${EXECUTORCH_ROOT}/") add_library(xnnpack_backend ${_xnnpack_backend__srcs}) diff --git a/backends/xnnpack/cmake/Dependencies.cmake b/backends/xnnpack/cmake/Dependencies.cmake index 71ade68ccb2..b6fd547e2bc 100644 --- a/backends/xnnpack/cmake/Dependencies.cmake +++ b/backends/xnnpack/cmake/Dependencies.cmake @@ -10,73 +10,83 @@ set(THIRD_PARTY_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third-party") # --- XNNPACK -# Setting this global PIC flag for all XNNPACK targets. This is needed for -# Object libraries within XNNPACK which must be PIC to successfully link this -# static libXNNPACK -set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG - ${CMAKE_POSITION_INDEPENDENT_CODE} -) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - set(XNNPACK_SOURCE_DIR "${THIRD_PARTY_ROOT}/XNNPACK") set(XNNPACK_INCLUDE_DIR "${XNNPACK_SOURCE_DIR}/include") -set(XNNPACK_LIBRARY_TYPE - "static" - CACHE STRING "" + +include(ExternalProject) +include(GNUInstallDirs) # For CMAKE_INSTALL_LIBDIR +set(XNNPACK_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/install") +set(XNNPACK_STATIC_LIB + "${XNNPACK_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libXNNPACK.a" ) -set(XNNPACK_BUILD_BENCHMARKS - OFF - CACHE BOOL "" +set(XNNPACK_MICROKERNELS_STATIC_LIB + "${XNNPACK_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libxnnpack-microkernels-prod.a" ) -set(XNNPACK_BUILD_TESTS - OFF - CACHE BOOL "" +get_extra_cmake_args_for_external_project(XNNPACK_EXTRA_CMAKE_ARGS) +ExternalProject_Add( + XNNPACKExternalProject + SOURCE_DIR ${XNNPACK_SOURCE_DIR} + # Not 100% clear on these locations + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/XNNPACK + INSTALL_DIR ${XNNPACK_INSTALL_DIR} + INSTALL_BYPRODUCTS ${XNNPACK_STATIC_LIB} ${XNNPACK_MICROKERNELS_STATIC_LIB} + CMAKE_ARGS + ${XNNPACK_EXTRA_CMAKE_ARGS} + -D + XNNPACK_LIBRARY_TYPE=static + -D + XNNPACK_BUILD_BENCHMARKS=OFF + -D + XNNPACK_BUILD_TESTS=OFF + -D + XNNPACK_ENABLE_AVXVNNI=OFF + # Work around observed failure: + # https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232 + -D + XNNPACK_ENABLE_AVX512VNNIGFNI=OFF + -D + ENABLE_XNNPACK_WEIGHTS_CACHE=${EXECUTORCH_XNNPACK_ENABLE_WEIGHT_CACHE} + -D + ENABLE_XNNPACK_SHARED_WORKSPACE=${EXECUTORCH_XNNPACK_SHARED_WORKSPACE} + -D + XNNPACK_ENABLE_KLEIDIAI=${EXECUTORCH_XNNPACK_ENABLE_KLEIDIAI} + -D + CMAKE_INSTALL_PREFIX= + -D + XNNPACK_BUILD_ALL_MICROKERNELS=OFF + -D + CMAKE_POSITION_INDEPENDENT_CODE=ON ) -set(XNNPACK_ENABLE_AVXVNNI - OFF - CACHE BOOL "" - ) -# Work around observed failure: https://github.com/pytorch/executorch/pull/10362#issuecomment-2906391232 -set(XNNPACK_ENABLE_AVX512VNNIGFNI - OFF - CACHE BOOL "") -if(EXECUTORCH_XNNPACK_ENABLE_KLEIDI) - set(XNNPACK_ENABLE_KLEIDIAI - ON - CACHE BOOL "" - ) -else() - set(XNNPACK_ENABLE_KLEIDIAI - OFF - CACHE BOOL "" - ) -endif() +add_library(XNNPACK STATIC IMPORTED GLOBAL) +# TODO: this probably doesn't work on Windows. +set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION ${XNNPACK_STATIC_LIB}) + +add_dependencies(XNNPACK XNNPACKExternalProject) +add_library(xnnpack-microkernels-prod STATIC IMPORTED GLOBAL) +set_property( + TARGET xnnpack-microkernels-prod PROPERTY IMPORTED_LOCATION + ${XNNPACK_MICROKERNELS_STATIC_LIB} +) +add_dependencies(xnnpack-microkernels-prod XNNPACKExternalProject) -set(XNNPACK_BUILD_ALL_MICROKERNELS - OFF - CACHE BOOL "" +set_target_properties( + XNNPACK PROPERTIES INTERFACE_LINK_LIBRARIES xnnpack-microkernels-prod ) -add_subdirectory("${XNNPACK_SOURCE_DIR}") -include_directories(SYSTEM ${XNNPACK_INCLUDE_DIR}) -list(APPEND xnnpack_third_party XNNPACK) -install(TARGETS xnnpack-microkernels-prod - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(DIRECTORY ${XNNPACK_INSTALL_DIR}/ DESTINATION ${CMAKE_INSTALL_PREFIX}) if(EXECUTORCH_XNNPACK_ENABLE_KLEIDI) - if(TARGET kleidiai) - install(TARGETS kleidiai - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - endif() + add_library(kleidiai SHARED IMPORTED) + find_library( + KLEIDIAI_LIBRARY kleidiai + PATHS "${CMAKE_CURRENT_BINARY_DIR}/XNNPACK/kleidiai-source" + ) + if(KLEIDIAI_LIBRARY) + message(WARNING "Can't find KleidiAI, skipping install") + install(FILES ${KLEIDIAI_LIBRARY} PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + endif() endif() - -# Revert PIC Flag to what it originally was -set(CMAKE_POSITION_INDEPENDENT_CODE - ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG} -) diff --git a/devtools/bundled_program/CMakeLists.txt b/devtools/bundled_program/CMakeLists.txt index ee7fb34e37f..b1b227b3528 100644 --- a/devtools/bundled_program/CMakeLists.txt +++ b/devtools/bundled_program/CMakeLists.txt @@ -4,18 +4,20 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -set( - _schema_files - bundled_program_schema.fbs - scalar_type.fbs -) +set(_schema_files bundled_program_schema.fbs scalar_type.fbs) set(_schema_outputs) foreach(schema_file ${_schema_files}) - list(APPEND _bundled_program_schema__srcs "${CMAKE_CURRENT_SOURCE_DIR}/schema/${schema_file}") + list(APPEND _bundled_program_schema__srcs + "${CMAKE_CURRENT_SOURCE_DIR}/schema/${schema_file}" + ) string(REGEX REPLACE "[.]fbs$" "_generated.h" generated "${schema_file}") - list(APPEND _schema_outputs "${DEVTOOLS_INCLUDE_DIR}/executorch/devtools/bundled_program/schema/${generated}") + list( + APPEND + _schema_outputs + "${DEVTOOLS_INCLUDE_DIR}/executorch/devtools/bundled_program/schema/${generated}" + ) endforeach() file(MAKE_DIRECTORY ${DEVTOOLS_INCLUDE_DIR}/executorch/devtools/bundled_program) @@ -32,20 +34,13 @@ add_custom_command( ) add_library( - bundled_program - ${_schema_outputs} - ${CMAKE_CURRENT_SOURCE_DIR}/bundled_program.cpp -) -target_link_libraries( - bundled_program - PUBLIC - executorch + bundled_program ${_schema_outputs} + ${CMAKE_CURRENT_SOURCE_DIR}/bundled_program.cpp ) +target_link_libraries(bundled_program PUBLIC executorch) target_include_directories( - bundled_program - PUBLIC - ${DEVTOOLS_INCLUDE_DIR} - ${PROJECT_SOURCE_DIR}/third-party/flatbuffers/include + bundled_program PUBLIC ${DEVTOOLS_INCLUDE_DIR} + ${PROJECT_SOURCE_DIR}/third-party/flatbuffers/include ) install( diff --git a/tools/cmake/Utils.cmake b/tools/cmake/Utils.cmake index 732f5ddd1e7..941ec9a9954 100644 --- a/tools/cmake/Utils.cmake +++ b/tools/cmake/Utils.cmake @@ -278,3 +278,32 @@ macro(find_package_torch) find_package(Torch CONFIG REQUIRED) endif() endmacro() + +# In order to support cross compiling, we need to propagate a bunch of CMake +# variables to ExternalProject. Call this to get the current values of all +# relevant variables, which should then be passed to CMAKE_ARGS. +function(get_extra_cmake_args_for_external_project outVar) + set(VARIABLES_TO_PROPAGATE + ANDROID_ABI + ANDROID_PLATFORM + CMAKE_ARCHIVE_OUTPUT_DIRECTORY + CMAKE_BUILD_TYPE + CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER + CMAKE_FIND_ROOT_PATH + CMAKE_OSX_DEPLOYMENT_TARGET + CMAKE_TOOLCHAIN_FILE + DEPLOYMENT_TARGET + PLATFORM + ) + set(${outVar} "") + foreach(var ${VARIABLES_TO_PROPAGATE}) + if(DEFINED ${var}) + list(APPEND ${outVar} -D "${var}=${${var}}") + endif() + endforeach() + set(${outVar} + ${${outVar}} + PARENT_SCOPE + ) +endfunction() diff --git a/tools/cmake/executorch-config.cmake b/tools/cmake/executorch-config.cmake index f64b080239d..6472648786c 100644 --- a/tools/cmake/executorch-config.cmake +++ b/tools/cmake/executorch-config.cmake @@ -150,7 +150,9 @@ if(TARGET coremldelegate) endif() if(TARGET etdump) - set_target_properties(etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch") + set_target_properties( + etdump PROPERTIES INTERFACE_LINK_LIBRARIES "flatccrt;executorch" + ) endif() if(TARGET optimized_native_cpu_ops_lib) @@ -174,13 +176,11 @@ if(TARGET extension_threadpool) endif() set(shared_lib_list - # executorch -- size tests fail due to regression if we include this and I'm not sure it's needed. - optimized_native_cpu_ops_lib - portable_ops_lib - quantized_ops_lib - xnnpack_backend - vulkan_backend - quantized_ops_aot_lib) + # executorch -- size tests fail due to regression if we include this and I'm + # not sure it's needed. + optimized_native_cpu_ops_lib portable_ops_lib quantized_ops_lib + xnnpack_backend vulkan_backend quantized_ops_aot_lib +) foreach(lib ${shared_lib_list}) if(TARGET ${lib}) target_link_options_shared_lib(${lib})