From 242b65dbaeb35ac08bd27ccd64e18019c9e1f409 Mon Sep 17 00:00:00 2001 From: Anthony Shoumikhin Date: Fri, 8 Mar 2024 22:45:15 -0800 Subject: [PATCH 1/2] Build in release mode by default and build portable framework explicitly. Summary: . Differential Revision: D54711007 --- build/build_apple_frameworks.sh | 20 ++++++++++++-------- build/test_ios.sh | 2 +- build/test_ios_ci.sh | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/build/build_apple_frameworks.sh b/build/build_apple_frameworks.sh index 5ac8cd2c1dd..c43ac8b5681 100755 --- a/build/build_apple_frameworks.sh +++ b/build/build_apple_frameworks.sh @@ -11,7 +11,7 @@ PLATFORMS=("iphoneos" "iphonesimulator") PLATFORM_FLAGS=("OS" "SIMULATOR") SOURCE_ROOT_DIR="" OUTPUT="cmake-out" -MODE="Debug" +MODE="Release" TOOLCHAIN="" BUCK2="/tmp/buck2" PYTHON=$(which python3) @@ -19,12 +19,13 @@ FLATC="" IOS_DEPLOYMENT_TARGET="17.0" COREML=OFF MPS=OFF +PORTABLE=OFF XNNPACK=OFF HEADERS_PATH="include" EXECUTORCH_FRAMEWORK="executorch:libexecutorch.a,libextension_data_loader.a,libextension_module.a:$HEADERS_PATH" -PORTABLE_FRAMEWORK="portable_backend:libportable_kernels.a,libportable_ops_lib.a:" COREML_FRAMEWORK="coreml_backend:libcoremldelegate.a:" MPS_FRAMEWORK="mps_backend:libmpsdelegate.a:" +PORTABLE_FRAMEWORK="portable_backend:libportable_kernels.a,libportable_ops_lib.a:" XNNPACK_FRAMEWORK="xnnpack_backend:libXNNPACK.a,libcpuinfo.a,libpthreadpool.a,libxnnpack_backend.a:" usage() { @@ -34,14 +35,15 @@ usage() { echo echo "Options:" echo " --output=DIR Output directory. Default: 'cmake-out'" - echo " --Release Use Release build mode. Default: 'Debug'" + echo " --Debug Use Debug build mode. Default: 'Release'" echo " --toolchain=FILE Cmake toolchain file. Default: '\$SOURCE_ROOT_DIR/third-party/pytorch/cmake/iOS.cmake'" echo " --buck2=FILE Buck2 executable path. Default: '/tmp/buck2'" echo " --python=FILE Python executable path. Default: Path of python3 found in the current \$PATH" echo " --flatc=FILE FlatBuffers Compiler executable path. Default: '\$SOURCE_ROOT_DIR/third-party/flatbuffers/cmake-out/flatc'" - echo " --coreml Include this flag to build Core ML backend." - echo " --mps Include this flag to build Metal Performance Shaders backend." - echo " --xnnpack Include this flag to build XNNPACK backend." + echo " --coreml Include this flag to build the Core ML backend." + echo " --mps Include this flag to build the Metal Performance Shaders backend." + echo " --portable Include this flag to build the Portable backend." + echo " --xnnpack Include this flag to build the XNNPACK backend." echo echo "Example:" echo " $0 /path/to/source/root --output=cmake-out --Release --toolchain=/path/to/cmake/toolchain --buck2=/path/to/buck2 --python=/path/to/python3 --coreml --mps --xnnpack" @@ -52,13 +54,14 @@ for arg in "$@"; do case $arg in -h|--help) usage ;; --output=*) OUTPUT="${arg#*=}" ;; - --Release) MODE="Release" ;; + --Debug) MODE="Debug" ;; --toolchain=*) TOOLCHAIN="${arg#*=}" ;; --buck2=*) BUCK2="${arg#*=}" ;; --python=*) PYTHON="${arg#*=}" ;; --flatc=*) FLATC="${arg#*=}" ;; --ios-deployment-target=*) IOS_DEPLOYMENT_TARGET="${arg#*=}" ;; --coreml) COREML=ON ;; + --portable) PORTABLE=ON ;; --mps) MPS=ON ;; --xnnpack) XNNPACK=ON ;; *) @@ -105,6 +108,7 @@ cmake_build() { echo "Building for $platform with flag $platform_flag" mkdir "$platform" && cd "$platform" || exit 1 cmake "$SOURCE_ROOT_DIR" -G Xcode \ + -DCMAKE_BUILD_TYPE="$MODE" \ -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" \ -DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD="c++17" \ -DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY="libc++" \ @@ -152,7 +156,7 @@ append_framework_flag() { } append_framework_flag "ON" "$EXECUTORCH_FRAMEWORK" -append_framework_flag "ON" "$PORTABLE_FRAMEWORK" +append_framework_flag "$PORTABLE" "$PORTABLE_FRAMEWORK" append_framework_flag "$COREML" "$COREML_FRAMEWORK" append_framework_flag "$MPS" "$MPS_FRAMEWORK" append_framework_flag "$XNNPACK" "$XNNPACK_FRAMEWORK" diff --git a/build/test_ios.sh b/build/test_ios.sh index 8c65eb60804..d19bae807c0 100755 --- a/build/test_ios.sh +++ b/build/test_ios.sh @@ -107,7 +107,7 @@ curl https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt \ say "Building Frameworks" -./build/build_apple_frameworks.sh --buck2="$(realpath $BUCK2)" --Release --coreml --mps --xnnpack +./build/build_apple_frameworks.sh --buck2="$(realpath $BUCK2)" --coreml --mps --portable --xnnpack mv cmake-out "$APP_PATH/Frameworks" say "Creating Simulator" diff --git a/build/test_ios_ci.sh b/build/test_ios_ci.sh index 41aeb127eb9..0fbab419e45 100755 --- a/build/test_ios_ci.sh +++ b/build/test_ios_ci.sh @@ -64,7 +64,7 @@ curl https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt \ say "Building Frameworks" -./build/build_apple_frameworks.sh --buck2="$(which buck2)" --flatc="$(which flatc)" --coreml --mps --xnnpack +./build/build_apple_frameworks.sh --buck2="$(which buck2)" --flatc="$(which flatc)" --coreml --mps --portable --xnnpack mv cmake-out "$APP_PATH/Frameworks" say "Creating Simulator" From 37474b62020d645d1f3ce021b9f1c79c872434de Mon Sep 17 00:00:00 2001 From: Anthony Shoumikhin Date: Fri, 8 Mar 2024 22:45:15 -0800 Subject: [PATCH 2/2] Build Apple extensions with CMake. Summary: . Differential Revision: D54711005 --- CMakeLists.txt | 4 ++ build/build_apple_frameworks.sh | 5 ++- extension/apple/CMakeLists.txt | 45 +++++++++++++++++++ .../ExecuTorch/Exported/module.modulemap | 6 +++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 extension/apple/CMakeLists.txt create mode 100644 extension/apple/ExecuTorch/Exported/module.modulemap diff --git a/CMakeLists.txt b/CMakeLists.txt index 185214c2752..2803f5c4bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -340,6 +340,10 @@ if(EXECUTORCH_BUILD_SDK) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sdk) endif() +if(EXECUTORCH_BUILD_EXTENSION_APPLE) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/apple) +endif() + if(EXECUTORCH_BUILD_EXTENSION_DATA_LOADER) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/data_loader) endif() diff --git a/build/build_apple_frameworks.sh b/build/build_apple_frameworks.sh index c43ac8b5681..30e36df136c 100755 --- a/build/build_apple_frameworks.sh +++ b/build/build_apple_frameworks.sh @@ -22,7 +22,7 @@ MPS=OFF PORTABLE=OFF XNNPACK=OFF HEADERS_PATH="include" -EXECUTORCH_FRAMEWORK="executorch:libexecutorch.a,libextension_data_loader.a,libextension_module.a:$HEADERS_PATH" +EXECUTORCH_FRAMEWORK="executorch:libexecutorch.a,libextension_apple.a,libextension_data_loader.a,libextension_module.a:$HEADERS_PATH" COREML_FRAMEWORK="coreml_backend:libcoremldelegate.a:" MPS_FRAMEWORK="mps_backend:libmpsdelegate.a:" PORTABLE_FRAMEWORK="portable_backend:libportable_kernels.a,libportable_ops_lib.a:" @@ -115,6 +115,7 @@ cmake_build() { -DBUCK2="$BUCK2" \ -DPYTHON_EXECUTABLE="$PYTHON" \ -DFLATC_EXECUTABLE="$FLATC" \ + -DEXECUTORCH_BUILD_EXTENSION_APPLE=ON \ -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \ -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$(pwd)" \ @@ -139,6 +140,8 @@ mkdir -p "$HEADERS_PATH" //extension/module: \ | rsync -av --files-from=- "$SOURCE_ROOT_DIR" "$HEADERS_PATH/executorch" +cp "$SOURCE_ROOT_DIR/extension/apple/ExecuTorch/Exported/"{*.h,*.modulemap} "$HEADERS_PATH" + echo "Creating frameworks" for platform in "${PLATFORMS[@]}"; do diff --git a/extension/apple/CMakeLists.txt b/extension/apple/CMakeLists.txt new file mode 100644 index 00000000000..db194270d33 --- /dev/null +++ b/extension/apple/CMakeLists.txt @@ -0,0 +1,45 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +# Please this file formatted by running: +# ~~~ +# cmake-format --first-comment-is-literal=True CMakeLists.txt +# ~~~ + +cmake_minimum_required(VERSION 3.19) + +# Source root directory for executorch. +if(NOT EXECUTORCH_ROOT) + set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) +endif() + +add_library(extension_apple) + +set(EXPORTED_SOURCES + ExecuTorch/Exported/ExecuTorchLog.mm +) + +target_sources( + extension_apple PRIVATE + ${EXPORTED_SOURCES} +) + +target_include_directories( + extension_apple PUBLIC + ExecuTorch/Exported +) + +find_library(FOUNDATION_FRAMEWORK Foundation) +target_link_libraries(extension_apple + PRIVATE + executorch + ${FOUNDATION_FRAMEWORK} +) + +target_compile_options(extension_apple PUBLIC ${_common_compile_options}) +target_compile_options(extension_apple PRIVATE "-fobjc-arc") +target_compile_options(extension_apple PRIVATE "-fno-exceptions") +target_compile_options(extension_apple PRIVATE "-fno-rtti") diff --git a/extension/apple/ExecuTorch/Exported/module.modulemap b/extension/apple/ExecuTorch/Exported/module.modulemap new file mode 100644 index 00000000000..cb91d5d4d62 --- /dev/null +++ b/extension/apple/ExecuTorch/Exported/module.modulemap @@ -0,0 +1,6 @@ +module ExecuTorch { + umbrella header "ExecuTorch.h" + + export * + module * { export * } +} \ No newline at end of file