Skip to content

swift: add iOS simulator support #38

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ libtailscale.so
libtailscale.a
libtailscale.h
libtailscale.tar*
libtailscale_ios.a
libtailscale_ios.h
libtailscale_*.a
libtailscale_*.h

/tstestcontrol/libtstestcontrol.a
/tstestcontrol/libtstestcontrol.h
Expand Down
18 changes: 13 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,21 @@ libtailscale.a:
go build -buildmode=c-archive

libtailscale_ios.a:
GOOS=ios GOARCH=arm64 CGO_ENABLED=1 CC=$(PWD)/swift/script/clangwrap.sh go build -v -ldflags -w -tags ios -o libtailscale_ios.a -buildmode=c-archive
GOOS=ios GOARCH=arm64 CGO_ENABLED=1 CC=$(PWD)/swift/script/clangwrap-ios.sh go build -v -ldflags -w -tags ios -o libtailscale_ios.a -buildmode=c-archive

libtailscale_ios_sim_arm64.a:
GOOS=ios GOARCH=arm64 CGO_ENABLED=1 CC=$(PWD)/swift/script/clangwrap-ios-sim-arm.sh go build -v -ldflags -w -tags ios -o libtailscale_ios_sim_arm64.a -buildmode=c-archive

libtailscale_ios_sim_x86_64.a:
GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC=$(PWD)/swift/script/clangwrap-ios-sim-x86.sh go build -v -ldflags -w -tags ios -o libtailscale_ios_sim_x86_64.a -buildmode=c-archive

.PHONY: c-archive-ios
c-archive-ios: libtailscale_ios.a ## Builds libtailscale_ios.a for iOS (iOS SDK required)

.PHONY: c-archive-ios-sim
c-archive-ios-sim: libtailscale_ios_sim_arm64.a libtailscale_ios_sim_x86_64.a ## Builds a fat binary for iOS (iOS SDK required)
lipo -create -output libtailscale_ios_sim.a libtailscale_ios_sim_x86_64.a libtailscale_ios_sim_arm64.a

.PHONY: c-archive
c-archive: libtailscale.a ## Builds libtailscale.a for the target platform

Expand All @@ -20,10 +30,8 @@ shared: ## Builds libtailscale.so for the target platform

.PHONY: clean
clean: ## Clean up build artifacts
rm -f libtailscale.a
rm -f libtailscale_ios.a
rm -f libtailscale.h
rm -f libtailscale_ios.h
rm -f libtailscale*.h
rm -f libtailscale*.a

.PHONY: help
help: ## Show this help
Expand Down
6 changes: 5 additions & 1 deletion swift/Examples/TailscaleKitHello/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@

## Instructions

First build TailscaleKit:
First build TailscaleKit for the platform you wish to target:

From /swift:
```
$ make macos
$ make ios-fat
```

The ios target expects the universal xcframework produced by make ios-fat and
can be run on either a device or the simulator.

In TailnetSettings, configure an auth key and a server/service to query.

```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
/* Begin PBXBuildFile section */
C25260032D7A71E800BD3CCA /* TailscaleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2525FC52D7A69DE00BD3CCA /* TailscaleKit.framework */; };
C25260052D7A71FE00BD3CCA /* TailscaleKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C2525FC52D7A69DE00BD3CCA /* TailscaleKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C289804A2DBAA8DA0019B7EB /* TailscaleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C28980492DBAA7E50019B7EB /* TailscaleKit.framework */; };
C289804B2DBAA8DA0019B7EB /* TailscaleKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C28980492DBAA7E50019B7EB /* TailscaleKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C2CE237E2DD7756B0096C105 /* TailscaleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2CE23762DD76A5C0096C105 /* TailscaleKit.framework */; };
C2ED636C2DDE3C1400297161 /* TailscaleKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C2ED636B2DDE3C1400297161 /* TailscaleKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
Expand All @@ -30,7 +30,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
C289804B2DBAA8DA0019B7EB /* TailscaleKit.framework in Embed Frameworks */,
C2ED636C2DDE3C1400297161 /* TailscaleKit.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -43,16 +43,11 @@
C25260082D7A7DC400BD3CCA /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
C289803E2DBA8A350019B7EB /* HelloFromTailscale_iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloFromTailscale_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
C28980492DBAA7E50019B7EB /* TailscaleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TailscaleKit.framework; path = "../../build/Build/Products/Release-iphoneos/TailscaleKit.framework"; sourceTree = "<group>"; };
C2CE23762DD76A5C0096C105 /* TailscaleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TailscaleKit.framework; path = "../../build/Build/Products/Release-iphonesimulator/TailscaleKit.framework"; sourceTree = "<group>"; };
C2ED636B2DDE3C1400297161 /* TailscaleKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = TailscaleKit.xcframework; path = "../../build/Build/Products/Release-iphonefat/TailscaleKit.xcframework"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
C25260072D7A7BAE00BD3CCA /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = C2525FF02D7A70B700BD3CCA /* HelloFromTailscale */;
};
C289803F2DBA8A360019B7EB /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale_iOS" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Expand All @@ -62,13 +57,20 @@
);
target = C28980342DBA8A350019B7EB /* HelloFromTailscale_iOS */;
};
C2CE23752DD76A330096C105 /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info_iOS.plist,
);
target = C2525FF02D7A70B700BD3CCA /* HelloFromTailscale */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
C2525FF22D7A70B700BD3CCA /* HelloFromTailscale */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
C25260072D7A7BAE00BD3CCA /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale" target */,
C2CE23752DD76A330096C105 /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale" target */,
C289803F2DBA8A360019B7EB /* Exceptions for "HelloFromTailscale" folder in "HelloFromTailscale_iOS" target */,
);
path = HelloFromTailscale;
Expand All @@ -89,7 +91,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C289804A2DBAA8DA0019B7EB /* TailscaleKit.framework in Frameworks */,
C2CE237E2DD7756B0096C105 /* TailscaleKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -118,6 +120,8 @@
C2525FC42D7A69DE00BD3CCA /* Frameworks */ = {
isa = PBXGroup;
children = (
C2ED636B2DDE3C1400297161 /* TailscaleKit.xcframework */,
C2CE23762DD76A5C0096C105 /* TailscaleKit.framework */,
C2525FC52D7A69DE00BD3CCA /* TailscaleKit.framework */,
C28980492DBAA7E50019B7EB /* TailscaleKit.framework */,
);
Expand Down Expand Up @@ -374,7 +378,7 @@
DEVELOPMENT_TEAM = W5364U7YZB;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "../../build/Build/**";
FRAMEWORK_SEARCH_PATHS = ../../build/Build;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = HelloFromTailscale/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
Expand Down Expand Up @@ -403,7 +407,7 @@
DEVELOPMENT_TEAM = W5364U7YZB;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "../../build/Build/**";
FRAMEWORK_SEARCH_PATHS = ../../build/Build;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = HelloFromTailscale/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
Expand Down Expand Up @@ -432,7 +436,7 @@
DEVELOPMENT_TEAM = W5364U7YZB;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "../../build/Build/Products/Release-iphoneOS";
FRAMEWORK_SEARCH_PATHS = "../../build/Build/Products/Release-iphonefat";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = HelloFromTailscale/Info_iOS.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
Expand Down Expand Up @@ -467,7 +471,7 @@
DEVELOPMENT_TEAM = W5364U7YZB;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "../../build/Build/Products/Release-iphoneOS";
FRAMEWORK_SEARCH_PATHS = "../../build/Build/Products/Release-iphonefat";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = HelloFromTailscale/Info_iOS.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1620"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C2CE22D62DD680A20096C105"
BuildableName = "HelloFromTailscale_iOS_Simulator.app"
BlueprintName = "HelloFromTailscale_iOS_Simulator"
ReferencedContainer = "container:TailscaleKitHello.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C2CE22D62DD680A20096C105"
BuildableName = "HelloFromTailscale_iOS_Simulator.app"
BlueprintName = "HelloFromTailscale_iOS_Simulator"
ReferencedContainer = "container:TailscaleKitHello.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C2CE22D62DD680A20096C105"
BuildableName = "HelloFromTailscale_iOS_Simulator.app"
BlueprintName = "HelloFromTailscale_iOS_Simulator"
ReferencedContainer = "container:TailscaleKitHello.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
29 changes: 25 additions & 4 deletions swift/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ endif
# the libtailscale.a and libtailscale_ios.a dependencies.

.PHONY: all
all: test ios macos ## Runs the tests and builds all library targets
all: test ios macos ios-fat ## Runs the tests and builds all library targets

.PHONY: macos
macos: ## Builds TailscaleKit for macos to swift/build/Build/Products/Release (unsigned)
@echo
@echo "::: Building TailscaleKit for macOS :::"
@echo "::: Building TailscaleKit.framework for macOS :::"
cd .. && make c-archive
mkdir -p build
xcodebuild build -scheme "TailscaleKit (macOS)" \
Expand All @@ -26,9 +26,9 @@ macos: ## Builds TailscaleKit for macos to swift/build/Build/Products/Release (
CODE_SIGNING_ALLOWED=NO | $(XCPRETTIFIER)

.PHONY: ios
ios: ## Builds TailscaleKit for iOS to swift/build/Build/Products/Release (unsigned)
ios: ## Builds TailscaleKit for iOS to swift/build/Build/Products/Release-iphoneos (unsigned)
@echo
@echo "::: Building TailscaleKit for iOS :::"
@echo "::: Building TailscaleKit.framework for iOS :::"
cd .. && make c-archive-ios
mkdir -p build
xcodebuild build -scheme "TailscaleKit (iOS)" \
Expand All @@ -37,6 +37,27 @@ ios: ## Builds TailscaleKit for iOS to swift/build/Build/Products/Release (unsi
-destination 'generic/platform=iOS' \
CODE_SIGNING_ALLOWED=NO | $(XCPRETTIFIER)

.PHONY: ios-sim
ios-sim: ## Builds TailscaleKit for iOS to swift/build/Build/Products/Release-iphonesimulator (unsigned)
@echo
@echo "::: Building TailscaleKit.framework for iOS Simulator :::"
cd .. && make c-archive-ios-sim
mkdir -p build
xcodebuild build -scheme "TailscaleKit (Simulator)" \
-derivedDataPath build \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
CODE_SIGNING_ALLOWED=NO | $(XCPRETTIFIER)

.PHONY: ios-fat
ios-fat: ios-sim ios ## Builds TailscaleKit.xcframework to swift/build/Build/Products/Release-iphonefat
@echo
@echo "::: Building TailscaleKit.xcframework for ios and ios-simulator :::"
mkdir -p ./build/Build/Products/Release-iphonefat
xcodebuild -create-xcframework \
-framework ./build/Build/Products/Release-iphoneos/TailscaleKit.framework \
-framework ./build/Build/Products/Release-iphonesimulator/TailscaleKit.framework \
-output ./build/Build/Products/Release-iphonefat/TailscaleKit.xcframework

.PHONY: test
test: ## Run tests (macOS)
Expand Down
Loading
Loading