llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
#!/bin/bash
#
# Options
IOS_MIN_OS_VERSION = 16.4
MACOS_MIN_OS_VERSION = 13.3
VISIONOS_MIN_OS_VERSION = 1.0
TVOS_MIN_OS_VERSION = 16.4
BUILD_SHARED_LIBS = OFF
LLAMA_BUILD_EXAMPLES = OFF
LLAMA_BUILD_TESTS = OFF
LLAMA_BUILD_SERVER = OFF
GGML_METAL = ON
GGML_METAL_EMBED_LIBRARY = ON
GGML_BLAS_DEFAULT = ON
GGML_METAL_USE_BF16 = ON
GGML_OPENMP = OFF
COMMON_C_FLAGS = "-Wno-macro-redefined -Wno-shorten-64-to-32 -Wno-unused-command-line-argument -g"
COMMON_CXX_FLAGS = "-Wno-macro-redefined -Wno-shorten-64-to-32 -Wno-unused-command-line-argument -g"
# Common options for all builds
COMMON_CMAKE_ARGS = (
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED= NO
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY= ""
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED= NO
-DCMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT= "dwarf-with-dsym"
-DCMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS= YES
-DCMAKE_XCODE_ATTRIBUTE_COPY_PHASE_STRIP= NO
-DCMAKE_XCODE_ATTRIBUTE_STRIP_INSTALLED_PRODUCT= NO
-DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM= ggml
-DBUILD_SHARED_LIBS= ${ BUILD_SHARED_LIBS }
-DLLAMA_BUILD_EXAMPLES= ${ LLAMA_BUILD_EXAMPLES }
-DLLAMA_BUILD_TESTS= ${ LLAMA_BUILD_TESTS }
-DLLAMA_BUILD_SERVER= ${ LLAMA_BUILD_SERVER }
-DGGML_METAL_EMBED_LIBRARY= ${ GGML_METAL_EMBED_LIBRARY }
-DGGML_BLAS_DEFAULT= ${ GGML_BLAS_DEFAULT }
-DGGML_METAL= ${ GGML_METAL }
-DGGML_METAL_USE_BF16= ${ GGML_METAL_USE_BF16 }
-DGGML_NATIVE= OFF
-DGGML_OPENMP= ${ GGML_OPENMP }
)
2025-04-11 09:24:34 +02:00
XCODE_VERSION = $( xcodebuild -version 2>/dev/null | head -n1 | awk '{ print $2 }' )
MAJOR_VERSION = $( echo $XCODE_VERSION | cut -d. -f1)
MINOR_VERSION = $( echo $XCODE_VERSION | cut -d. -f2)
echo " Detected Xcode version: $XCODE_VERSION "
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
check_required_tool( ) {
local tool = $1
local install_message = $2
if ! command -v $tool & > /dev/null; then
echo " Error: $tool is required but not found. "
echo " $install_message "
exit 1
fi
}
echo "Checking for required tools..."
check_required_tool "cmake" "Please install CMake 3.28.0 or later (brew install cmake)"
check_required_tool "xcodebuild" "Please install Xcode and Xcode Command Line Tools (xcode-select --install)"
check_required_tool "libtool" "Please install libtool which should be available with Xcode Command Line Tools (CLT). Make sure Xcode CLT is installed (xcode-select --install)"
check_required_tool "dsymutil" "Please install Xcode and Xcode Command Line Tools (xcode-select --install)"
set -e
## Clean up previous builds
rm -rf build-apple
rm -rf build-ios-sim
rm -rf build-ios-device
rm -rf build-macos
rm -rf build-visionos
rm -rf build-visionos-sim
rm -rf build-tvos-sim
rm -rf build-tvos-device
# Setup the xcframework build directory structure
setup_framework_structure( ) {
local build_dir = $1
local min_os_version = $2
local platform = $3 # "ios", "macos", "visionos", or "tvos"
local framework_name = "llama"
echo " Creating ${ platform } -style framework structure for ${ build_dir } "
if [ [ " $platform " = = "macos" ] ] ; then
# macOS versioned structure uses versioned directories
mkdir -p ${ build_dir } /framework/${ framework_name } .framework/Versions/A/Headers
mkdir -p ${ build_dir } /framework/${ framework_name } .framework/Versions/A/Modules
mkdir -p ${ build_dir } /framework/${ framework_name } .framework/Versions/A/Resources
# Create symbolic links
ln -sf A ${ build_dir } /framework/${ framework_name } .framework/Versions/Current
ln -sf Versions/Current/Headers ${ build_dir } /framework/${ framework_name } .framework/Headers
ln -sf Versions/Current/Modules ${ build_dir } /framework/${ framework_name } .framework/Modules
ln -sf Versions/Current/Resources ${ build_dir } /framework/${ framework_name } .framework/Resources
ln -sf Versions/Current/${ framework_name } ${ build_dir } /framework/${ framework_name } .framework/${ framework_name }
# Set header and module paths
local header_path = ${ build_dir } /framework/${ framework_name } .framework/Versions/A/Headers/
local module_path = ${ build_dir } /framework/${ framework_name } .framework/Versions/A/Modules/
else
# iOS/VisionOS/tvOS use a flat structure
mkdir -p ${ build_dir } /framework/${ framework_name } .framework/Headers
mkdir -p ${ build_dir } /framework/${ framework_name } .framework/Modules
# Remove any existing structure to ensure clean build
rm -rf ${ build_dir } /framework/${ framework_name } .framework/Versions
# Set header and module paths
local header_path = ${ build_dir } /framework/${ framework_name } .framework/Headers/
local module_path = ${ build_dir } /framework/${ framework_name } .framework/Modules/
fi
# Copy all required headers (common for all platforms)
cp include/llama.h ${ header_path }
cp ggml/include/ggml.h ${ header_path }
cp ggml/include/ggml-alloc.h ${ header_path }
cp ggml/include/ggml-backend.h ${ header_path }
cp ggml/include/ggml-metal.h ${ header_path }
cp ggml/include/ggml-cpu.h ${ header_path }
cp ggml/include/ggml-blas.h ${ header_path }
cp ggml/include/gguf.h ${ header_path }
# Create module map (common for all platforms)
cat > ${ module_path } module.modulemap << EOF
framework module llama {
header "llama.h"
header "ggml.h"
header "ggml-alloc.h"
header "ggml-backend.h"
header "ggml-metal.h"
header "ggml-cpu.h"
header "ggml-blas.h"
header "gguf.h"
link "c++"
link framework "Accelerate"
link framework "Metal"
link framework "Foundation"
export *
}
EOF
# Platform-specific settings for Info.plist
local platform_name = ""
local sdk_name = ""
local supported_platform = ""
case " $platform " in
"ios" )
platform_name = "iphoneos"
sdk_name = " iphoneos ${ min_os_version } "
supported_platform = "iPhoneOS"
local plist_path = " ${ build_dir } /framework/ ${ framework_name } .framework/Info.plist "
local device_family = ' <key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>'
; ;
"macos" )
platform_name = "macosx"
sdk_name = " macosx ${ min_os_version } "
supported_platform = "MacOSX"
local plist_path = " ${ build_dir } /framework/ ${ framework_name } .framework/Versions/A/Resources/Info.plist "
local device_family = ""
; ;
"visionos" )
platform_name = "xros"
sdk_name = " xros ${ min_os_version } "
supported_platform = "XRPlatform"
local plist_path = " ${ build_dir } /framework/ ${ framework_name } .framework/Info.plist "
local device_family = ""
; ;
"tvos" )
platform_name = "appletvos"
sdk_name = " appletvos ${ min_os_version } "
supported_platform = "AppleTVOS"
local plist_path = " ${ build_dir } /framework/ ${ framework_name } .framework/Info.plist "
local device_family = ' <key>UIDeviceFamily</key>
<array>
<integer>3</integer>
</array>'
; ;
esac
# Create Info.plist
cat > ${ plist_path } << EOF
<?xml version = "1.0" encoding = "UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version = "1.0" >
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>llama</string>
<key>CFBundleIdentifier</key>
<string>org.ggml.llama</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>llama</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>MinimumOSVersion</key>
<string>${ min_os_version } </string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>${ supported_platform } </string>
</array>${ device_family }
<key>DTPlatformName</key>
<string>${ platform_name } </string>
<key>DTSDKName</key>
<string>${ sdk_name } </string>
</dict>
</plist>
EOF
}
# Create dynamic libraries from static libraries.
combine_static_libraries( ) {
local build_dir = " $1 "
local release_dir = " $2 "
local platform = " $3 " # "ios", "macos", "visionos", or "tvos"
local is_simulator = " $4 "
local base_dir = " $( pwd ) "
local framework_name = "llama"
# Determine output path based on platform
local output_lib = ""
if [ [ " $platform " = = "macos" ] ] ; then
# macOS uses versioned structure
output_lib = " ${ build_dir } /framework/ ${ framework_name } .framework/Versions/A/ ${ framework_name } "
else
# iOS, visionOS, and tvOS use a directory flat structure
output_lib = " ${ build_dir } /framework/ ${ framework_name } .framework/ ${ framework_name } "
fi
local libs = (
" ${ base_dir } / ${ build_dir } /src/ ${ release_dir } /libllama.a "
" ${ base_dir } / ${ build_dir } /ggml/src/ ${ release_dir } /libggml.a "
" ${ base_dir } / ${ build_dir } /ggml/src/ ${ release_dir } /libggml-base.a "
" ${ base_dir } / ${ build_dir } /ggml/src/ ${ release_dir } /libggml-cpu.a "
" ${ base_dir } / ${ build_dir } /ggml/src/ggml-metal/ ${ release_dir } /libggml-metal.a "
" ${ base_dir } / ${ build_dir } /ggml/src/ggml-blas/ ${ release_dir } /libggml-blas.a "
)
# Create temporary directory for processing
local temp_dir = " ${ base_dir } / ${ build_dir } /temp "
mkdir -p " ${ temp_dir } "
# Since we have multiple architectures libtool will find object files that do not
# match the target architecture. We suppress these warnings.
libtool -static -o " ${ temp_dir } /combined.a " " ${ libs [@] } " 2> /dev/null
# Determine SDK, architectures, and install_name based on platform and simulator flag.
local sdk = ""
local archs = ""
local min_version_flag = ""
local install_name = ""
case " $platform " in
"ios" )
if [ [ " $is_simulator " = = "true" ] ] ; then
sdk = "iphonesimulator"
archs = "arm64 x86_64"
min_version_flag = " -mios-simulator-version-min= ${ IOS_MIN_OS_VERSION } "
else
sdk = "iphoneos"
archs = "arm64"
min_version_flag = " -mios-version-min= ${ IOS_MIN_OS_VERSION } "
fi
install_name = "@rpath/llama.framework/llama"
; ;
"macos" )
sdk = "macosx"
archs = "arm64 x86_64"
min_version_flag = " -mmacosx-version-min= ${ MACOS_MIN_OS_VERSION } "
install_name = "@rpath/llama.framework/Versions/Current/llama"
; ;
"visionos" )
if [ [ " $is_simulator " = = "true" ] ] ; then
sdk = "xrsimulator"
archs = "arm64 x86_64"
min_version_flag = " -mtargetos=xros ${ VISIONOS_MIN_OS_VERSION } -simulator "
else
sdk = "xros"
archs = "arm64"
min_version_flag = " -mtargetos=xros ${ VISIONOS_MIN_OS_VERSION } "
fi
# Use flat structure for visionOS, same as iOS
install_name = "@rpath/llama.framework/llama"
; ;
"tvos" )
if [ [ " $is_simulator " = = "true" ] ] ; then
sdk = "appletvsimulator"
archs = "arm64 x86_64"
min_version_flag = " -mtvos-simulator-version-min= ${ TVOS_MIN_OS_VERSION } "
else
sdk = "appletvos"
archs = "arm64"
min_version_flag = " -mtvos-version-min= ${ TVOS_MIN_OS_VERSION } "
fi
install_name = "@rpath/llama.framework/llama"
; ;
esac
# Build architecture flags
local arch_flags = ""
for arch in $archs ; do
arch_flags += " -arch $arch "
done
# Create dynamic library
echo " Creating dynamic library for ${ platform } . "
xcrun -sdk $sdk clang++ -dynamiclib \
-isysroot $( xcrun --sdk $sdk --show-sdk-path) \
$arch_flags \
$min_version_flag \
-Wl,-force_load," ${ temp_dir } /combined.a " \
-framework Foundation -framework Metal -framework Accelerate \
-install_name " $install_name " \
-o " ${ base_dir } / ${ output_lib } "
# Platform-specific post-processing for device builds
if [ [ " $is_simulator " = = "false" ] ] ; then
2025-04-11 09:24:34 +02:00
if command -v xcrun vtool & >/dev/null; then
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
case " $platform " in
"ios" )
echo "Marking binary as a framework binary for iOS..."
2025-04-11 09:24:34 +02:00
xcrun vtool -set-build-version ios ${ IOS_MIN_OS_VERSION } ${ IOS_MIN_OS_VERSION } -replace \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-output " ${ base_dir } / ${ output_lib } " " ${ base_dir } / ${ output_lib } "
; ;
"visionos" )
echo "Marking binary as a framework binary for visionOS..."
2025-04-11 09:24:34 +02:00
if [ [ " $MAJOR_VERSION " -gt 16 ] ] || [ [ " $MAJOR_VERSION " -eq 16 && " $MINOR_VERSION " -gt 2 ] ] ; then
echo "Xcode version greater than 16.2, using visionOS."
VISION_OS_BUILD_VERSION = "visionos"
else
echo "Xcode version less than or equal to 16.2, using xros."
VISION_OS_BUILD_VERSION = "xros"
fi
xcrun vtool -set-build-version ${ VISION_OS_BUILD_VERSION } ${ VISIONOS_MIN_OS_VERSION } ${ VISIONOS_MIN_OS_VERSION } -replace \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-output " ${ base_dir } / ${ output_lib } " " ${ base_dir } / ${ output_lib } "
; ;
"tvos" )
echo "Marking binary as a framework binary for tvOS..."
2025-04-11 09:24:34 +02:00
xcrun vtool -set-build-version tvos ${ TVOS_MIN_OS_VERSION } ${ TVOS_MIN_OS_VERSION } -replace \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-output " ${ base_dir } / ${ output_lib } " " ${ base_dir } / ${ output_lib } "
; ;
esac
else
echo "Warning: vtool not found. Binary may not pass App Store validation."
fi
fi
echo "Creating properly formatted dSYM..."
# Create a separate directory for dSYMs for all platforms
mkdir -p " ${ base_dir } / ${ build_dir } /dSYMs "
# iOS and visionOS style dSYM (flat structure)
if [ [ " $platform " = = "ios" || " $platform " = = "visionos" || " $platform " = = "tvos" ] ] ; then
# Generate dSYM in the dSYMs directory
xcrun dsymutil " ${ base_dir } / ${ output_lib } " -o " ${ base_dir } / ${ build_dir } /dSYMs/llama.dSYM "
# Create a copy of the binary that will be stripped
cp " ${ base_dir } / ${ output_lib } " " ${ temp_dir } /binary_to_strip "
# Strip debug symbols from the copy
xcrun strip -S " ${ temp_dir } /binary_to_strip " -o " ${ temp_dir } /stripped_lib "
# Replace the original with the stripped version
mv " ${ temp_dir } /stripped_lib " " ${ base_dir } / ${ output_lib } "
else
# macOS style dSYM
# First strip debug info to a separate file
xcrun strip -S " ${ base_dir } / ${ output_lib } " -o " ${ temp_dir } /stripped_lib "
# Generate dSYM in the dSYMs directory
xcrun dsymutil " ${ base_dir } / ${ output_lib } " -o " ${ base_dir } / ${ build_dir } /dSYMs/llama.dSYM "
# Replace original binary with stripped version
mv " ${ temp_dir } /stripped_lib " " ${ base_dir } / ${ output_lib } "
fi
# Remove any automatically generated dSYM files in the framework structure as they will
# otherwise case Invalid Bundle Structure validation errors.
if [ -d " ${ base_dir } / ${ output_lib } .dSYM " ] ; then
echo " Removing generated dSYM file in framework structure: ${ base_dir } / ${ output_lib } .dSYM "
rm -rf " ${ base_dir } / ${ output_lib } .dSYM "
fi
# Clean up
rm -rf " ${ temp_dir } "
}
echo "Building for iOS simulator..."
cmake -B build-ios-sim -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ IOS_MIN_OS_VERSION } \
-DIOS= ON \
-DCMAKE_SYSTEM_NAME= iOS \
-DCMAKE_OSX_SYSROOT= iphonesimulator \
-DCMAKE_OSX_ARCHITECTURES= "arm64;x86_64" \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= iphonesimulator \
-DCMAKE_C_FLAGS= " ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-ios-sim --config Release -- -quiet
echo "Building for iOS devices..."
cmake -B build-ios-device -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ IOS_MIN_OS_VERSION } \
-DCMAKE_OSX_SYSROOT= iphoneos \
-DCMAKE_OSX_ARCHITECTURES= "arm64" \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= iphoneos \
-DCMAKE_C_FLAGS= " ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-ios-device --config Release -- -quiet
echo "Building for macOS..."
cmake -B build-macos -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ MACOS_MIN_OS_VERSION } \
-DCMAKE_OSX_ARCHITECTURES= "arm64;x86_64" \
-DCMAKE_C_FLAGS= " ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-macos --config Release -- -quiet
echo "Building for visionOS..."
cmake -B build-visionos -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ VISIONOS_MIN_OS_VERSION } \
-DCMAKE_OSX_ARCHITECTURES= "arm64" \
-DCMAKE_SYSTEM_NAME= visionOS \
-DCMAKE_OSX_SYSROOT= xros \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= xros \
2025-03-19 10:15:23 +00:00
-DCMAKE_C_FLAGS= " -D_XOPEN_SOURCE=700 ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " -D_XOPEN_SOURCE=700 ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-visionos --config Release -- -quiet
echo "Building for visionOS simulator..."
cmake -B build-visionos-sim -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ VISIONOS_MIN_OS_VERSION } \
-DCMAKE_OSX_ARCHITECTURES= "arm64;x86_64" \
-DCMAKE_SYSTEM_NAME= visionOS \
-DCMAKE_OSX_SYSROOT= xrsimulator \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= xrsimulator \
2025-03-19 10:15:23 +00:00
-DCMAKE_C_FLAGS= " -D_XOPEN_SOURCE=700 ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " -D_XOPEN_SOURCE=700 ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-visionos-sim --config Release -- -quiet
# Add tvOS builds (might need the same u_int definitions as watchOS and visionOS)
echo "Building for tvOS simulator..."
cmake -B build-tvos-sim -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ TVOS_MIN_OS_VERSION } \
-DCMAKE_SYSTEM_NAME= tvOS \
-DCMAKE_OSX_SYSROOT= appletvsimulator \
-DCMAKE_OSX_ARCHITECTURES= "arm64;x86_64" \
-DGGML_METAL= ON \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= appletvsimulator \
-DCMAKE_C_FLAGS= " ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-tvos-sim --config Release -- -quiet
echo "Building for tvOS devices..."
cmake -B build-tvos-device -G Xcode \
" ${ COMMON_CMAKE_ARGS [@] } " \
-DCMAKE_OSX_DEPLOYMENT_TARGET= ${ TVOS_MIN_OS_VERSION } \
-DCMAKE_SYSTEM_NAME= tvOS \
-DCMAKE_OSX_SYSROOT= appletvos \
-DCMAKE_OSX_ARCHITECTURES= "arm64" \
-DGGML_METAL= ON \
-DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS= appletvos \
-DCMAKE_C_FLAGS= " ${ COMMON_C_FLAGS } " \
-DCMAKE_CXX_FLAGS= " ${ COMMON_CXX_FLAGS } " \
2025-04-07 13:35:19 +02:00
-DLLAMA_CURL= OFF \
llama : add xcframework build script (#11996)
* llama : add xcframework build script
This commit adds a script to build an XCFramework for Apple
ios, macos, visionos, and tvos platforms.
The generated XCFramework can then be added to a project and used in
the same way as a regular framework. The llama.swiftui example project
has been updated to use the XCFramework and can be started using the
following command:
```console
$ open examples/llama.swiftui/llama.swiftui.xcodeproj/
```
Refs: https://github.com/ggml-org/llama.cpp/issues/10747
* examples : remove llama.cpp (source dir ref) from project.pbxproj
This commit removes the reference to llama.cpp from the project.pbxproj
file since Package.swift has been removed.
* ci : updated build.yml to use build-xcframework.sh
* ci : add xcframework build to github releases
This commit adds the ability to create a GitHub release with the
xcframework build artifact.
* scripts : add apple app validation scripts
This commit adds scripts that can validate the iOS, macOS, tvOS, and
VisionOS applications. The scripts create a simple test app project,
copy the llama.xcframework to the test project, build and archive the
app, create an IPA from the archive, and validate the IPA using altool.
The motivation for this is to provide some basic validation and
hopefully avoid having to manually validate apps in Xcode.
* llama : remove Package.swift
This commit removes the Package.swift file, as we are now building an
XCFramework for the project.
* llama : remove Sources and spm-headers directories
* llama : use TargetConditionals.h for visionOS/tvOS
2025-03-05 06:30:31 +01:00
-S .
cmake --build build-tvos-device --config Release -- -quiet
# Setup frameworks and copy binaries and headers
echo "Setting up framework structures..."
setup_framework_structure "build-ios-sim" ${ IOS_MIN_OS_VERSION } "ios"
setup_framework_structure "build-ios-device" ${ IOS_MIN_OS_VERSION } "ios"
setup_framework_structure "build-macos" ${ MACOS_MIN_OS_VERSION } "macos"
setup_framework_structure "build-visionos" ${ VISIONOS_MIN_OS_VERSION } "visionos"
setup_framework_structure "build-visionos-sim" ${ VISIONOS_MIN_OS_VERSION } "visionos"
setup_framework_structure "build-tvos-sim" ${ TVOS_MIN_OS_VERSION } "tvos"
setup_framework_structure "build-tvos-device" ${ TVOS_MIN_OS_VERSION } "tvos"
# Create dynamic libraries from static libraries
echo "Creating dynamic libraries from static libraries..."
combine_static_libraries "build-ios-sim" "Release-iphonesimulator" "ios" "true"
combine_static_libraries "build-ios-device" "Release-iphoneos" "ios" "false"
combine_static_libraries "build-macos" "Release" "macos" "false"
combine_static_libraries "build-visionos" "Release-xros" "visionos" "false"
combine_static_libraries "build-visionos-sim" "Release-xrsimulator" "visionos" "true"
combine_static_libraries "build-tvos-sim" "Release-appletvsimulator" "tvos" "true"
combine_static_libraries "build-tvos-device" "Release-appletvos" "tvos" "false"
# Create XCFramework with correct debug symbols paths
echo "Creating XCFramework..."
xcodebuild -create-xcframework \
-framework $( pwd ) /build-ios-sim/framework/llama.framework \
-debug-symbols $( pwd ) /build-ios-sim/dSYMs/llama.dSYM \
-framework $( pwd ) /build-ios-device/framework/llama.framework \
-debug-symbols $( pwd ) /build-ios-device/dSYMs/llama.dSYM \
-framework $( pwd ) /build-macos/framework/llama.framework \
-debug-symbols $( pwd ) /build-macos/dSYMS/llama.dSYM \
-framework $( pwd ) /build-visionos/framework/llama.framework \
-debug-symbols $( pwd ) /build-visionos/dSYMs/llama.dSYM \
-framework $( pwd ) /build-visionos-sim/framework/llama.framework \
-debug-symbols $( pwd ) /build-visionos-sim/dSYMs/llama.dSYM \
-framework $( pwd ) /build-tvos-device/framework/llama.framework \
-debug-symbols $( pwd ) /build-tvos-device/dSYMs/llama.dSYM \
-framework $( pwd ) /build-tvos-sim/framework/llama.framework \
-debug-symbols $( pwd ) /build-tvos-sim/dSYMs/llama.dSYM \
-output $( pwd ) /build-apple/llama.xcframework