From ec4fd6ae6185fbbbb3aa0104557107f381c77d3f Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 16 Aug 2026 12:13:20 +0800 Subject: [PATCH 1/3] Split macro target into a subpackage --- Example/Tuist/Package.swift | 2 +- Package.swift | 31 +++----------- Renderer/Stdout/Tuist/Package.swift | 2 +- Scripts/test.sh | 1 + Subpackages/OpenSwiftUIMacros/.gitignore | 4 ++ Subpackages/OpenSwiftUIMacros/Package.swift | 41 +++++++++++++++++++ .../EntryDefaultValueMacro.swift | 0 .../OpenSwiftUIMacros/EntryMacro.swift | 0 .../OpenSwiftUIMacrosPlugin.swift | 0 .../EntryMacroTests.swift | 0 10 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 Subpackages/OpenSwiftUIMacros/.gitignore create mode 100644 Subpackages/OpenSwiftUIMacros/Package.swift rename {Sources => Subpackages/OpenSwiftUIMacros/Sources}/OpenSwiftUIMacros/EntryDefaultValueMacro.swift (100%) rename {Sources => Subpackages/OpenSwiftUIMacros/Sources}/OpenSwiftUIMacros/EntryMacro.swift (100%) rename {Sources => Subpackages/OpenSwiftUIMacros/Sources}/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift (100%) rename {Tests => Subpackages/OpenSwiftUIMacros/Tests}/OpenSwiftUIMacrosTests/EntryMacroTests.swift (100%) diff --git a/Example/Tuist/Package.swift b/Example/Tuist/Package.swift index ce5b7ceae..237cb5efe 100644 --- a/Example/Tuist/Package.swift +++ b/Example/Tuist/Package.swift @@ -79,7 +79,7 @@ var packageProductTypes: [String: ProjectDescription.Product] = [ "OpenSwiftUICore": ProjectDescription.Product.framework, "OpenSwiftUI_SPI": ProjectDescription.Product.staticFramework, "COpenSwiftUI": ProjectDescription.Product.staticFramework, - "OpenSwiftUIMacros": ProjectDescription.Product.macro, + "OpenSwiftUIMacrosPlugin": ProjectDescription.Product.macro, "OpenSwiftUITestsSupport": ProjectDescription.Product.staticFramework, "OpenSwiftUISymbolDualTestsSupport": ProjectDescription.Product.staticFramework, "OpenAttributeGraphShims": ProjectDescription.Product.staticFramework, diff --git a/Package.swift b/Package.swift index 3f7c56bb7..bad996f68 100644 --- a/Package.swift +++ b/Package.swift @@ -1,6 +1,5 @@ // swift-tools-version: 6.2 -import CompilerPluginSupport import Foundation import PackageDescription @@ -546,26 +545,6 @@ let openSwiftUISPITestTarget = Target.testTarget( swiftSettings: sharedSwiftSettings ) -// MARK: - OpenSwiftUIMacros Target - -let openSwiftUIMacrosTarget = Target.macro( - name: "OpenSwiftUIMacros", - dependencies: [ - .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), - .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), - ], - swiftSettings: sharedSwiftSettings -) - -let openSwiftUIMacrosTestTarget = Target.testTarget( - name: "OpenSwiftUIMacrosTests", - dependencies: [ - "OpenSwiftUIMacros", - .product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"), - ], - swiftSettings: sharedSwiftSettings -) - // MARK: - OpenSwiftUICore Target // NOTE: @@ -575,7 +554,7 @@ let openSwiftUICoreTarget = Target.target( name: "OpenSwiftUICore", dependencies: [ "OpenSwiftUI_SPI", - "OpenSwiftUIMacros", + .product(name: "OpenSwiftUIMacrosPlugin", package: "OpenSwiftUIMacros"), .product(name: "OpenCoreGraphicsShims", package: "OpenCoreGraphics"), .product(name: "OpenQuartzCoreShims", package: "OpenCoreGraphics"), .product(name: "OpenAttributeGraphShims", package: "OpenAttributeGraph"), @@ -777,11 +756,12 @@ let package = Package( products: products, dependencies: [ .package(url: "https://github.com/apple/swift-numerics", from: "1.0.3"), - .package(url: "https://github.com/swiftlang/swift-syntax.git", from: "603.0.0"), + // Keep the host-only macro implementation outside this package so + // target-platform tests do not link it into their test bundles. + .package(path: "Subpackages/OpenSwiftUIMacros"), ], targets: [ openSwiftUISPITarget, - openSwiftUIMacrosTarget, openSwiftUICoreTarget, cOpenSwiftUITarget, openSwiftUITarget, @@ -808,7 +788,6 @@ if !compatibilityTestCondition { package.targets += [ cOpenSwiftUITestTarget, openSwiftUISPITestTarget, - openSwiftUIMacrosTestTarget, openSwiftUICoreTestTarget, openSwiftUITestTarget, openSwiftUIBridgeTestTarget, @@ -986,7 +965,7 @@ let packageSettings = PackageSettings( "OpenSwiftUICore": ProjectDescription.Product.framework, "OpenSwiftUI_SPI": ProjectDescription.Product.staticFramework, "COpenSwiftUI": ProjectDescription.Product.staticFramework, - "OpenSwiftUIMacros": ProjectDescription.Product.macro, + "OpenSwiftUIMacrosPlugin": ProjectDescription.Product.macro, "OpenSwiftUITestsSupport": ProjectDescription.Product.staticFramework, "OpenSwiftUISymbolDualTestsSupport": ProjectDescription.Product.staticFramework, "OpenAttributeGraphShims": ProjectDescription.Product.staticFramework, diff --git a/Renderer/Stdout/Tuist/Package.swift b/Renderer/Stdout/Tuist/Package.swift index 419905d7a..bac29d343 100644 --- a/Renderer/Stdout/Tuist/Package.swift +++ b/Renderer/Stdout/Tuist/Package.swift @@ -26,7 +26,7 @@ let packageProductTypes: [String: ProjectDescription.Product] = [ "OpenSwiftUICore": .staticFramework, "OpenSwiftUI_SPI": .staticFramework, "COpenSwiftUI": .staticFramework, - "OpenSwiftUIMacros": .macro, + "OpenSwiftUIMacrosPlugin": .macro, "OpenSwiftUITestsSupport": .staticFramework, "OpenSwiftUISymbolDualTestsSupport": .staticFramework, "OpenAttributeGraphShims": .staticFramework, diff --git a/Scripts/test.sh b/Scripts/test.sh index 233f47e21..637416c16 100755 --- a/Scripts/test.sh +++ b/Scripts/test.sh @@ -16,3 +16,4 @@ if [[ "$(uname)" == "Linux" ]] && command -v swiftly &> /dev/null && [[ -z "$OPE fi swift test +swift test --package-path Subpackages/OpenSwiftUIMacros diff --git a/Subpackages/OpenSwiftUIMacros/.gitignore b/Subpackages/OpenSwiftUIMacros/.gitignore new file mode 100644 index 000000000..2b13982f2 --- /dev/null +++ b/Subpackages/OpenSwiftUIMacros/.gitignore @@ -0,0 +1,4 @@ +/.build +/Derived +/*.xcodeproj +/Package.resolved diff --git a/Subpackages/OpenSwiftUIMacros/Package.swift b/Subpackages/OpenSwiftUIMacros/Package.swift new file mode 100644 index 000000000..b580a028e --- /dev/null +++ b/Subpackages/OpenSwiftUIMacros/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version: 6.2 + +import CompilerPluginSupport +import PackageDescription + +let package = Package( + name: "OpenSwiftUIMacros", + platforms: [ + .macOS(.v15), + ], + products: [ + .library(name: "OpenSwiftUIMacrosPlugin", targets: ["OpenSwiftUIMacros"]), + ], + dependencies: [ + .package(url: "https://github.com/swiftlang/swift-syntax.git", from: "603.0.0"), + ], + targets: [ + .macro( + name: "OpenSwiftUIMacros", + dependencies: [ + .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), + .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), + ], + swiftSettings: [ + .enableUpcomingFeature("InternalImportsByDefault"), + .swiftLanguageMode(.v5), + ] + ), + .testTarget( + name: "OpenSwiftUIMacrosTests", + dependencies: [ + "OpenSwiftUIMacros", + .product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"), + ], + swiftSettings: [ + .enableUpcomingFeature("InternalImportsByDefault"), + .swiftLanguageMode(.v5), + ] + ), + ] +) diff --git a/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift b/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift similarity index 100% rename from Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift rename to Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift diff --git a/Sources/OpenSwiftUIMacros/EntryMacro.swift b/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryMacro.swift similarity index 100% rename from Sources/OpenSwiftUIMacros/EntryMacro.swift rename to Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryMacro.swift diff --git a/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift b/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift similarity index 100% rename from Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift rename to Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift diff --git a/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift b/Subpackages/OpenSwiftUIMacros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift similarity index 100% rename from Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift rename to Subpackages/OpenSwiftUIMacros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift From 895f951f64b46f2fe7d3d22162e2c7ec0dd86743 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 16 Aug 2026 12:34:47 +0800 Subject: [PATCH 2/3] Remove xcframework macro workaround --- Scripts/build_xcframework.sh | 12 ++++++------ .../View/Text/Text/Text+LayoutShape.swift | 16 ---------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/Scripts/build_xcframework.sh b/Scripts/build_xcframework.sh index 78e77c6ee..f5d832753 100755 --- a/Scripts/build_xcframework.sh +++ b/Scripts/build_xcframework.sh @@ -265,14 +265,12 @@ puts "Removed #{macro_name} archive references from #{File.dirname(path)}" RUBY } -# The xcframework archive path sets OPENSWIFTUI_XCFRAMEWORK_BUILD, which expands -# macro usages inline where needed. Avoid forcing generated macro tool targets to -# archive for simulator SDKs, where Xcode can try to build them for the target -# platform instead of the host platform. +# Keep OpenObservation's same-package macro target out of archive builds. The +# OpenSwiftUIMacros target lives in a separate package and remains available to +# OpenSwiftUICore as a host-only compiler plugin. remove_generated_macro_references "$PROJECT_ROOT/.build/tuist-derived/Projects/OpenObservation/OpenObservation.xcodeproj" "OpenObservation" "OpenObservationMacros" remove_generated_macro_references "$PROJECT_ROOT/.build/tuist-derived/OpenObservation/OpenObservation.xcodeproj" "OpenObservation" "OpenObservationMacros" remove_generated_macro_references "$PROJECT_ROOT/../OpenObservation/OpenObservation.xcodeproj" "OpenObservation" "OpenObservationMacros" -remove_generated_macro_references "$XCODEPROJ" "OpenSwiftUICore" "OpenSwiftUIMacros" remove_generated_macro_references "$XCODEPROJ" "OpenSwiftUICore" "OpenObservationMacros" echo "SDKs: ${SDKS[*]}" @@ -473,7 +471,9 @@ build_framework() { -scheme "$scheme" -configuration Release -archivePath "$archive_path" - -sdk "$sdk" + # A global -sdk overrides host-only macro targets and makes Xcode archive + # them for the destination platform. The destination selects the SDK for + # framework targets while macro executables retain their host platform. -destination "$destination" -derivedDataPath "$DERIVED_DATA_PATH" -skipPackagePluginValidation diff --git a/Sources/OpenSwiftUICore/View/Text/Text/Text+LayoutShape.swift b/Sources/OpenSwiftUICore/View/Text/Text/Text+LayoutShape.swift index e5e3470fb..e22d7f0cc 100644 --- a/Sources/OpenSwiftUICore/View/Text/Text/Text+LayoutShape.swift +++ b/Sources/OpenSwiftUICore/View/Text/Text/Text+LayoutShape.swift @@ -105,22 +105,6 @@ package struct TextShape: Equatable { } } -// Workaround: xcodebuild builds SPM macro targets for the target SDK platform -// instead of the host platform, causing "malformed response" errors on non-macOS -// SDKs (eg. iphonesimulator). Expand @Entry macro inline for xcframework builds. -// See https://forums.swift.org/t/xcodebuild-attempts-to-build-macro-package-with-wrong-arch/76340 -#if OPENSWIFTUI_XCFRAMEWORK_BUILD -extension EnvironmentValues { - var textShape: TextShape { - get { self[__Key_textShape.self] } - set { self[__Key_textShape.self] = newValue } - } - private struct __Key_textShape: EnvironmentKey { - static var defaultValue: TextShape { .bounds } - } -} -#else extension EnvironmentValues { @Entry var textShape: TextShape = .bounds } -#endif From 87fb0d0a8cde8603bcdba82c4f877c3c2f781abc Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 16 Aug 2026 13:31:50 +0800 Subject: [PATCH 3/3] Move macro package to Macros directory --- {Subpackages/OpenSwiftUIMacros => Macros}/.gitignore | 0 {Subpackages/OpenSwiftUIMacros => Macros}/Package.swift | 0 .../Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift | 0 .../Sources/OpenSwiftUIMacros/EntryMacro.swift | 0 .../Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift | 0 .../Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift | 0 Package.swift | 2 +- Scripts/test.sh | 2 +- 8 files changed, 2 insertions(+), 2 deletions(-) rename {Subpackages/OpenSwiftUIMacros => Macros}/.gitignore (100%) rename {Subpackages/OpenSwiftUIMacros => Macros}/Package.swift (100%) rename {Subpackages/OpenSwiftUIMacros => Macros}/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift (100%) rename {Subpackages/OpenSwiftUIMacros => Macros}/Sources/OpenSwiftUIMacros/EntryMacro.swift (100%) rename {Subpackages/OpenSwiftUIMacros => Macros}/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift (100%) rename {Subpackages/OpenSwiftUIMacros => Macros}/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift (100%) diff --git a/Subpackages/OpenSwiftUIMacros/.gitignore b/Macros/.gitignore similarity index 100% rename from Subpackages/OpenSwiftUIMacros/.gitignore rename to Macros/.gitignore diff --git a/Subpackages/OpenSwiftUIMacros/Package.swift b/Macros/Package.swift similarity index 100% rename from Subpackages/OpenSwiftUIMacros/Package.swift rename to Macros/Package.swift diff --git a/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift b/Macros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift similarity index 100% rename from Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift rename to Macros/Sources/OpenSwiftUIMacros/EntryDefaultValueMacro.swift diff --git a/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryMacro.swift b/Macros/Sources/OpenSwiftUIMacros/EntryMacro.swift similarity index 100% rename from Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/EntryMacro.swift rename to Macros/Sources/OpenSwiftUIMacros/EntryMacro.swift diff --git a/Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift b/Macros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift similarity index 100% rename from Subpackages/OpenSwiftUIMacros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift rename to Macros/Sources/OpenSwiftUIMacros/OpenSwiftUIMacrosPlugin.swift diff --git a/Subpackages/OpenSwiftUIMacros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift b/Macros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift similarity index 100% rename from Subpackages/OpenSwiftUIMacros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift rename to Macros/Tests/OpenSwiftUIMacrosTests/EntryMacroTests.swift diff --git a/Package.swift b/Package.swift index bad996f68..792c09887 100644 --- a/Package.swift +++ b/Package.swift @@ -758,7 +758,7 @@ let package = Package( .package(url: "https://github.com/apple/swift-numerics", from: "1.0.3"), // Keep the host-only macro implementation outside this package so // target-platform tests do not link it into their test bundles. - .package(path: "Subpackages/OpenSwiftUIMacros"), + .package(name: "OpenSwiftUIMacros", path: "Macros"), ], targets: [ openSwiftUISPITarget, diff --git a/Scripts/test.sh b/Scripts/test.sh index 637416c16..5132b0fae 100755 --- a/Scripts/test.sh +++ b/Scripts/test.sh @@ -16,4 +16,4 @@ if [[ "$(uname)" == "Linux" ]] && command -v swiftly &> /dev/null && [[ -z "$OPE fi swift test -swift test --package-path Subpackages/OpenSwiftUIMacros +swift test --package-path Macros