set -ex
BUILD_DIR="$(pwd)/lib/Release/Hello"
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
cat << EOF > Greeter.swift
public class Greeter {
public init() {}
public func hello() {
print("Hello World!")
}
}
EOF
mkdir -p arm64 x86_64
swiftc -parse-as-library \
-emit-object -o arm64/Hello.o \
-emit-module -module-name Hello -emit-module-path arm64/Hello.swiftmodule \
-enable-library-evolution -emit-module-interface-path arm64/Hello.swiftinterface \
-target arm64-apple-macosx10.9.0 \
Greeter.swift
swiftc -parse-as-library \
-emit-object -o x86_64/Hello.o \
-emit-module -module-name Hello -emit-module-path x86_64/Hello.swiftmodule \
-enable-library-evolution -emit-module-interface-path x86_64/Hello.swiftinterface \
-target x86_64-apple-macosx10.9.0 \
Greeter.swift
lipo -create arm64/Hello.o x86_64/Hello.o -output Hello.o
libtool -static -o libHello.a Hello.o
rm Hello.o
mkdir -p Hello.framework/Versions/A/
mkdir -p Hello.framework/Versions/A/Modules
mkdir -p Hello.framework/Versions/A/Modules/Hello.swiftmodule
mkdir -p Hello.framework/Versions/A/Headers
mkdir -p Hello.framework/Versions/A/Resources
mv libHello.a Hello.framework/Versions/A/Hello
mv arm64/Hello.swiftdoc Hello.framework/Versions/A/Modules/
mv arm64/Hello.abi.json Hello.framework/Versions/A/Modules/
mv arm64/Hello.swiftsourceinfo Hello.framework/Versions/A/Modules/
mv arm64/Hello.swiftmodule Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftmodule
mv arm64/Hello.swiftinterface Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftinterface
mv arm64/Hello.private.swiftinterface Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.private.swiftinterface
mv x86_64/Hello.swiftmodule Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule
mv x86_64/Hello.swiftinterface Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface
mv x86_64/Hello.private.swiftinterface Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface
cat << EOF > Hello.framework/Versions/A/Modules/module.modulemap
framework module Hello {
header "HelloFramework.h"
export *
}
EOF
cat << EOF > Hello.framework/Versions/A/Headers/HelloFramework.h
#import <Foundation/Foundation.h>
void hello(void);
EOF
cat << EOF > Hello.framework/Versions/A/Info.plist
<?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>Hello</string>
<key>CFBundleIdentifier</key>
<string>com.example.Hello</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Hello</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright Ā© 2024 Hello Company. All rights reserved.</string>
</dict>
</plist>
EOF
cd Hello.framework/Versions
ln -s A Current
cd ..
ln -s Versions/Current/Hello Hello
ln -s Versions/Current/Headers Headers
ln -s Versions/Current/Info.plist Info.plist
ln -s Versions/Current/Resources Resources
ln -s Versions/Current/Modules Modules
cd ..
chmod -R 755 Hello.framework
cat << EOF > UseHello.swift
import Hello
@main
public struct UseHello {
public static func main() {
let greeter = Greeter()
greeter.hello()
}
}
EOF
swiftc -parse-as-library \
-o UseHello-arm64 UseHello.swift \
-target arm64-apple-macosx10.9.0 \
-F. -framework Hello -I Hello.framework/Modules/arm64
swiftc -parse-as-library \
-o UseHello-x86_64 UseHello.swift \
-target x86_64-apple-macosx10.9.0 \
-F. -framework Hello -I Hello.framework/Modules/x86_64
lipo -create UseHello-arm64 UseHello-x86_64 -output UseHello
rm UseHello-arm64 UseHello-x86_64
rm -rf arm64
rm -rf x86_64
./UseHello
xcodebuild -create-xcframework \
-framework Hello.framework \
-output Hello.xcframework
rm * 2>/dev/null
swift package init --type executable --name UseHello
cat << EOF > Package.swift
// swift-tools-version: 6.0
import PackageDescription
let package = Package(
name: "UseHello",
platforms: [.macOS(.v15)],
products: [
.executable(name: "UseHello", targets: ["UseHello"])
],
dependencies: [],
targets: [
.executableTarget(name: "UseHello", dependencies: ["Hello"]),
.binaryTarget(name: "Hello", path: "./Hello.xcframework")
]
)
EOF
rm Sources/main.swift
mkdir -p Sources/UseHello
cat << EOF > Sources/UseHello/main.swift
import Hello
Greeter().hello()
EOF
swift run --arch x86_64
swift run --arch arm64
swift build --arch x86_64 --arch arm64