// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
46E97003F6597438A0AC93C0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BEF20C6F91CCD1A10D66BCE /* AppDelegate.swift */; };
E5C85D1F07153227204F81D6 /* WhiskerRuntime in Frameworks */ = {isa = PBXBuildFile; productRef = F920EEBD91D9E8039DA5A3F9 /* WhiskerRuntime */; };
8B41E0C2B6A95E8F70D2A38B /* WhiskerModules in Frameworks */ = {isa = PBXBuildFile; productRef = A4F2BE0925D17CE83AB061F7 /* WhiskerModules */; };
{{extra_pbxproj_build_file_entries}}
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
35D466DB8920E7A52C599EBC /* {{ios_scheme}}.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "{{ios_scheme}}.app"; sourceTree = BUILT_PRODUCTS_DIR; };
4BEF20C6F91CCD1A10D66BCE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
D3F08A1D5C9B6E7A2F104B59 /* whisker_modules */ = {isa = PBXFileReference; lastKnownFileType = folder; name = whisker_modules; path = "{{whisker_modules_ios_path}}"; sourceTree = "<absolute>"; };
{{extra_pbxproj_file_reference_entries}}
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
D4C57884A372C8EC69F16CAD /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E5C85D1F07153227204F81D6 /* WhiskerRuntime in Frameworks */,
8B41E0C2B6A95E8F70D2A38B /* WhiskerModules in Frameworks */,
{{extra_pbxproj_frameworks_phase_files}}
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
00961668E9C919BF4554CF95 /* Products */ = {
isa = PBXGroup;
children = (
35D466DB8920E7A52C599EBC /* {{ios_scheme}}.app */,
);
name = Products;
sourceTree = "<group>";
};
2AFB6256646F5C748E027F5E /* Sources */ = {
isa = PBXGroup;
children = (
4BEF20C6F91CCD1A10D66BCE /* AppDelegate.swift */,
);
path = Sources;
sourceTree = "<group>";
};
E8630311BAB2B628B85BC5D2 = {
isa = PBXGroup;
children = (
E8E7FE2E076C1851BADE1012 /* Packages */,
2AFB6256646F5C748E027F5E /* Sources */,
F1F2F3F4F5F6F7F8F9FAFBFC /* Whisker Plugin Files */,
00961668E9C919BF4554CF95 /* Products */,
);
sourceTree = "<group>";
};
E8E7FE2E076C1851BADE1012 /* Packages */ = {
isa = PBXGroup;
children = (
D3F08A1D5C9B6E7A2F104B59 /* whisker_modules */,
);
name = Packages;
sourceTree = "<group>";
};
F1F2F3F4F5F6F7F8F9FAFBFC /* Whisker Plugin Files */ = {
isa = PBXGroup;
children = (
{{extra_pbxproj_plugin_files_group_children}}
);
name = "Whisker Plugin Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
479BCD1507C869E5783E1EC4 /* {{ios_scheme}} */ = {
isa = PBXNativeTarget;
buildConfigurationList = 39A71CFC79D014E76D4445EB /* Build configuration list for PBXNativeTarget "{{ios_scheme}}" */;
buildPhases = (
7E2B91D0F46A1C73B5A5DE91 /* Whisker Generate */,
4A590CB0D847DB4C38DDCDFC /* Sources */,
A1A2A3A4A5A6A7A8A9AAAB00 /* Resources */,
D4C57884A372C8EC69F16CAD /* Frameworks */,
3F69E4C8A2D75B6E81C094BB /* Whisker Embed Framework */,
);
buildRules = (
);
dependencies = (
);
name = "{{ios_scheme}}";
packageProductDependencies = (
F920EEBD91D9E8039DA5A3F9 /* WhiskerRuntime */,
A4F2BE0925D17CE83AB061F7 /* WhiskerModules */,
);
productName = "{{ios_scheme}}";
productReference = 35D466DB8920E7A52C599EBC /* {{ios_scheme}}.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXShellScriptBuildPhase section */
7E2B91D0F46A1C73B5A5DE91 /* Whisker Generate */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Whisker Generate";
outputFileListPaths = (
);
outputPaths = (
"$(BUILT_PRODUCTS_DIR)/Frameworks/WhiskerDriver.framework/WhiskerDriver",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "set -euo pipefail\n# Step-7 Build Phase: produces WhiskerDriver.framework into\n# $BUILT_PRODUCTS_DIR/Frameworks/ before Xcode's link step runs.\n# The framework wraps the Rust user crate + C++ bridge — it can't\n# be pre-built because it contains user `#[whisker::main]` code,\n# so the per-app pbxproj invokes `whisker build-ios` here. The CLI\n# itself fetches Lynx, runs cargo, runs install_name_tool, copies\n# headers, and writes Info.plist.\nWORKSPACE=\"{{whisker_workspace_root}}\"\nif ! command -v whisker >/dev/null 2>&1; then\n echo \"error: 'whisker' not on PATH. Run 'cargo install whisker-cli' from the workspace root.\" >&2\n exit 1\nfi\nif [ ! -d \"$WORKSPACE\" ]; then\n echo \"error: Whisker workspace path baked into this pbxproj no longer exists: $WORKSPACE\" >&2\n echo \"This usually means the project was moved or renamed after \\`whisker run ios\\` first generated gen/ios.\" >&2\n echo \"Re-run \\`whisker run ios\\` from the (new) workspace root to refresh the gen tree.\" >&2\n exit 1\nfi\n# `whisker run` sets WHISKER_FEATURES=whisker/hot-reload (space-separated\n# if multiple) so the user dylib carries the dev-runtime WebSocket\n# client. Direct `xcodebuild` invocations (e.g. CI Release builds)\n# leave it unset; production binaries skip the dev-runtime entirely.\nFEATURE_ARGS=\"\"\nif [ -n \"${WHISKER_FEATURES:-}\" ]; then\n for feat in $WHISKER_FEATURES; do\n FEATURE_ARGS=\"$FEATURE_ARGS --features $feat\"\n done\nfi\nwhisker build-ios \\\n --workspace=\"$WORKSPACE\" \\\n --package=\"{{whisker_user_package}}\" \\\n --configuration=\"$CONFIGURATION\" \\\n --platform=\"$PLATFORM_NAME\" \\\n --archs=\"$ARCHS\" \\\n --built-products-dir=\"$BUILT_PRODUCTS_DIR\" \\\n $FEATURE_ARGS\n";
};
3F69E4C8A2D75B6E81C094BB /* Whisker Embed Framework */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(BUILT_PRODUCTS_DIR)/Frameworks/WhiskerDriver.framework/WhiskerDriver",
);
name = "Whisker Embed Framework";
outputFileListPaths = (
);
outputPaths = (
"$(TARGET_BUILD_DIR)/$(EXECUTABLE_FOLDER_PATH)/Frameworks/WhiskerDriver.framework/WhiskerDriver",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "set -euo pipefail\n# Step-7 Embed: copies WhiskerDriver.framework from the build-products\n# search path into the .app bundle's Frameworks/. The earlier\n# 'Whisker Generate' phase dropped it at $BUILT_PRODUCTS_DIR/Frameworks/\n# so FRAMEWORK_SEARCH_PATHS picks it up for the linker; this phase\n# completes the journey by placing it where dyld looks at app launch\n# (via LD_RUNPATH_SEARCH_PATHS=@executable_path/Frameworks).\nSRC=\"$BUILT_PRODUCTS_DIR/Frameworks/WhiskerDriver.framework\"\nDST_DIR=\"$TARGET_BUILD_DIR/$EXECUTABLE_FOLDER_PATH/Frameworks\"\nmkdir -p \"$DST_DIR\"\nrm -rf \"$DST_DIR/WhiskerDriver.framework\"\ncp -R \"$SRC\" \"$DST_DIR/\"\n# Codesign — required on device builds; harmless on simulator.\nif [ -n \"${EXPANDED_CODE_SIGN_IDENTITY:-}\" ]; then\n /usr/bin/codesign --force --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" --preserve-metadata=identifier,entitlements --timestamp=none \"$DST_DIR/WhiskerDriver.framework\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXProject section */
993C38E6B55CB9C6F082FDCA /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
TargetAttributes = {
};
};
buildConfigurationList = 04EE2E1E635D92BC638F96E0 /* Build configuration list for PBXProject "{{ios_scheme}}" */;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
Base,
en,
);
mainGroup = E8630311BAB2B628B85BC5D2;
minimizedProjectReferenceProxies = 1;
packageReferences = (
B25ED1A6F9E42E26D051E805 /* XCRemoteSwiftPackageReference "whisker" */,
C97DA5F310E249B0FCB72E81 /* XCLocalSwiftPackageReference "WhiskerModules" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 00961668E9C919BF4554CF95 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
479BCD1507C869E5783E1EC4 /* {{ios_scheme}} */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
A1A2A3A4A5A6A7A8A9AAAB00 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
{{extra_pbxproj_resources_phase_files}}
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
4A590CB0D847DB4C38DDCDFC /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
46E97003F6597438A0AC93C0 /* AppDelegate.swift in Sources */,
{{extra_pbxproj_sources_phase_files}}
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
3280429393A41FA3FBA1F5D6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"DEBUG=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "{{ios_deployment_target}}";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.9;
};
name = Debug;
};
72DC351F8133C2EE79D7230F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
// Step-7: WhiskerDriver.framework is produced by the
// "Whisker Generate" Build Phase into
// $(BUILT_PRODUCTS_DIR)/Frameworks/. The linker needs to
// see it via -F + -framework at the Frameworks phase.
FRAMEWORK_SEARCH_PATHS = "$(inherited) $(BUILT_PRODUCTS_DIR)/Frameworks";
OTHER_LDFLAGS = "$(inherited) -framework WhiskerDriver";
INFOPLIST_FILE = Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "{{ios_bundle_id}}";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
{{extra_pbxproj_target_build_settings}}
};
name = Debug;
};
91C02734642ACB1BD6BF3AE6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
// See the matching Debug config for the rationale.
FRAMEWORK_SEARCH_PATHS = "$(inherited) $(BUILT_PRODUCTS_DIR)/Frameworks";
OTHER_LDFLAGS = "$(inherited) -framework WhiskerDriver";
INFOPLIST_FILE = Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "{{ios_bundle_id}}";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
{{extra_pbxproj_target_build_settings}}
};
name = Release;
};
C24C7A9544E293DB9D604F47 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "{{ios_deployment_target}}";
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.9;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
04EE2E1E635D92BC638F96E0 /* Build configuration list for PBXProject "{{ios_scheme}}" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3280429393A41FA3FBA1F5D6 /* Debug */,
C24C7A9544E293DB9D604F47 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
39A71CFC79D014E76D4445EB /* Build configuration list for PBXNativeTarget "{{ios_scheme}}" */ = {
isa = XCConfigurationList;
buildConfigurations = (
72DC351F8133C2EE79D7230F /* Debug */,
91C02734642ACB1BD6BF3AE6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
/* End XCConfigurationList section */
/* Begin XCLocalSwiftPackageReference section */
C97DA5F310E249B0FCB72E81 /* XCLocalSwiftPackageReference "WhiskerModules" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = "{{whisker_modules_ios_path}}";
};
/* End XCLocalSwiftPackageReference section */
/* Begin XCRemoteSwiftPackageReference section */
B25ED1A6F9E42E26D051E805 /* XCRemoteSwiftPackageReference "whisker" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "{{whisker_ios_spm_url}}";
requirement = {
kind = exactVersion;
version = "{{whisker_ios_spm_version}}";
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
F920EEBD91D9E8039DA5A3F9 /* WhiskerRuntime */ = {
isa = XCSwiftPackageProductDependency;
package = B25ED1A6F9E42E26D051E805 /* XCRemoteSwiftPackageReference "whisker" */;
productName = WhiskerRuntime;
};
A4F2BE0925D17CE83AB061F7 /* WhiskerModules */ = {
isa = XCSwiftPackageProductDependency;
productName = WhiskerModules;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 993C38E6B55CB9C6F082FDCA /* Project object */;
}