# Build Process

This document describes the build process for creating distributable LinkSDK XCFrameworks, covering local development builds, the automated build script, and integration with the CI/CD pipeline. The build process transforms the LinkSDK source code into a universal XCFramework that supports both iOS devices and simulators.

For information about the CI/CD pipeline and automated releases, see [CI/CD Pipeline](/content/FrontFin/mesh-ios-sdk/5.2-cicd-pipeline/index.html). For local development and testing setup, see [Testing](/content/FrontFin/mesh-ios-sdk/5.3-testing/index.html).

## Build Script Overview

The LinkSDK uses a shell script-based build system that creates universal XCFrameworks suitable for distribution. The primary build script is [`build-framework.sh`](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/%60build-framework.sh%60)(), which handles the complete build, packaging, and distribution preparation process.

### Build Script Execution Flow

```
Build Script Start

Set MARKETING_VERSION and CURRENT_PROJECT_VERSION

xcodebuild archive
iOS Device Platform

xcodebuild archive
iOS Simulator Platform

xcodebuild -create-xcframework
Combine iOS + Simulator

Update Info.plist
CFBundleVersion

Copy XCFramework to Root

Create .zip Archive

Compute Swift Package Checksum

Update Package.swift

Remove Build Artifacts
```

Sources: [build-framework.sh1-64](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L1-L64)

## XCFramework Creation Process

### Platform-Specific Builds

The build process creates separate archives for each supported platform using `xcodebuild archive` commands. The LinkSDK framework is built twice with different destination platforms:

| Platform         | Destination                           | Archive Path                              |
| ---------------- | ------------------------------------- | ----------------------------------------- |
| iOS Device       | `generic/platform=iOS`               | `LinkSDK.framework-iphoneos.xcarchive`   |
| iOS Simulator     | `generic/platform=iOS Simulator`     | `LinkSDK.framework-iphonesimulator.xcarchive` |

### Build Configuration Parameters

The build script configures several critical parameters for each platform build:

```
IPHONEOS_DEPLOYMENT_TARGET=13.0
SKIP_INSTALL=NO
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
MARKETING_VERSION=$MARKETING_VERSION
CURRENT_PROJECT_VERSION=$CURRENT_PROJECT_VERSION
```

Sources: [build-framework.sh19-41](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L19-L41)

### XCFramework Assembly

After creating platform-specific archives, the script combines them into a single XCFramework using the `xcodebuild -create-xcframework` command. This process merges the iOS device and simulator frameworks into a universal binary that automatically selects the appropriate architecture at build time.

```
Output

XCFramework Creation

Input Archives

LinkSDK.framework-iphoneos.xcarchive
iOS Device Framework

LinkSDK.framework-iphonesimulator.xcarchive
iOS Simulator Framework

xcodebuild -create-xcframework

LinkSDK.xcframework
Universal Binary
```

Sources: [build-framework.sh43-47](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L43-L47)

## Version Management

### Version Parameter Handling

The build script accepts a version parameter and derives related version identifiers:

- `MARKETING_VERSION`: Full semantic version (e.g., "1.2.3")
- `CURRENT_PROJECT_VERSION`: Major version number extracted from marketing version

If no version is provided, the script defaults to version "1.0".

### Info.plist Version Updates

The script updates the XCFramework's `Info.plist` file with version information using the `PlistBuddy` utility:

```
/usr/libexec/Plistbuddy -c "Add :CFBundleVersion string $MARKETING_VERSION" "$PLIST"
/usr/libexec/Plistbuddy -c "Add :CFBundleShortVersionString string $CURRENT_PROJECT_VERSION" "$PLIST"
```

Sources: [build-framework.sh49-50](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L49-L50)

## Xcode Project Configuration

### Target Structure

The LinkSDK Xcode project contains three primary targets defined in the project configuration:

| Target Name            | Product Type                                 | Purpose                                |
| ---------------------- | -------------------------------------------- | -------------------------------------- |
| `LinkSDK`             | `com.apple.product-type.framework`          | Main framework library                 |
| `LinkSDKExample`      | `com.apple.product-type.application`        | Example implementation app             |
| `LinkSDKTests`        | `com.apple.product-type.bundle.unit-test`  | Unit test bundle                       |

### Framework Build Settings

The LinkSDK framework target uses specific build settings optimized for distribution:

| Setting                               | Value | Purpose                                                |
| ------------------------------------- | ----- | ------------------------------------------------------ |
| `BUILD_LIBRARY_FOR_DISTRIBUTION`     | `YES` | Enables module stability for distribution               |
| `MACH_O_TYPE`                        | `staticlib` | Creates static library binary                         |
| `SKIP_INSTALL`                       | `YES` | Prevents automatic installation                         |
| `IPHONEOS_DEPLOYMENT_TARGET`         | `13.0` | Minimum iOS version support                            |
| `ENABLE_MODULE_VERIFIER`             | `YES` | Enables module interface verification                   |
| `SWIFT_INSTALL_OBJC_HEADER`          | `NO`  | Disables Objective-C header generation                  |
| `DEFINES_MODULE`                     | `NO`  | Framework module definition handling                    |

Sources: [LinkSDK.xcodeproj/project.pbxproj610-692](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/LinkSDK.xcodeproj/project.pbxproj#L610-L692)

### Code Signing Configuration

The framework target uses manual code signing with conditional team settings:

```
CODE_SIGN_STYLE = Manual
DEVELOPMENT_TEAM = ""
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = C6WMXUCWYF
```

Sources: [LinkSDK.xcodeproj/project.pbxproj622-628](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/LinkSDK.xcodeproj/project.pbxproj#L622-L628)

## Swift Package Manager Integration

### Package.swift Updates

The build script automatically updates the `Package.swift` file with the new framework URL and checksum:

```
CHECKSUM=`swift package compute-checksum "$SDK_FRAMEWORK_FILENAME.zip"`
SDK_URL="https://github.com/FrontFin/mesh-ios-sdk/releases/download/$MARKETING_VERSION/$SDK_FRAMEWORK_FILENAME.zip"

sed -i '' "s|checksum: ".*"|checksum: \"$CHECKSUM\"|g" Package.swift
sed -i '' "s|url: ".*"|url: \"$SDK_URL\"|g" Package.swift
```

This ensures that Swift Package Manager can verify the integrity of the distributed XCFramework and download it from the correct GitHub release URL.

Sources: [build-framework.sh57-62](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L57-L62)

## Build Outputs and Artifacts

### File Structure

The build process generates the following artifacts:

```
./
├── LinkSDK.xcframework/          # Universal XCFramework
│   ├── Info.plist               # Framework metadata
│   ├── ios-arm64/               # iOS device architecture
│   └── ios-arm64_x86_64-simulator/ # iOS simulator architectures
├── LinkSDK.xcframework.zip      # Compressed distribution package
└── Package.swift                # Updated with new checksum/URL
```

### Build Folder Management

The script uses a temporary `./build` folder for intermediate artifacts and cleans up after completion:

```
BUILD_FOLDER='./build'
# ... build operations ...
rm -r $BUILD_FOLDER
```

Sources: [build-framework.sh13-53](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L13-L53)

## Local Development Usage

### Manual Build Execution

Developers can execute the build script locally with an optional version parameter:

```
# Build with default version (1.0)
./build-framework.sh

# Build with specific version
./build-framework.sh 2.1.0
```

### Prerequisites

Local builds require:

- Xcode 15.0 or later (compatible with `objectVersion = 70`)
- Valid Apple Developer certificate for code signing
- Access to QuantumIOS dependency package

Sources: [LinkSDK.xcodeproj/project.pbxproj6](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/LinkSDK.xcodeproj/project.pbxproj#L6-L6) [build-framework.sh1-64](https://github.com/FrontFin/mesh-ios-sdk/blob/02fd63b0/build-framework.sh#L1-L64)
