swiftlang / swift-package-manager

The Package Manager for the Swift Programming Language
Apache License 2.0
9.73k stars 1.34k forks source link

References to generated PackageResources for .embedInCode Resources fails in multi-architecture builds #6969

Open marcprux opened 1 year ago

marcprux commented 1 year ago

Description

When a target uses the new 5.9 .embedInCode("Resources") resource type, references to the synthesized PackageResource.Resource_File_Name fail to compile for multi-architecture builds. So swift build works, as does swift build --arch arm64 and swift build --arch x86_64 both succeed, but swift build --arch x86_64 --arch arm64 fails with the error:

Compile EmbedInCodeBug.swift (arm64)
cannot find 'PackageResources' in scope
cannot find 'PackageResources' in scope
Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

Build cancelled

Expected behavior

Multi-architecture builds that reference PackageResources should build without error.

Actual behavior

zap Desktop/EmbedInCodeBug % swift build --arch arm64 --configuration debug       
Building for debugging...
Build complete! (3.35s)

zap Desktop/EmbedInCodeBug % swift build --arch x86_64 --configuration debug       
Building for debugging...
[3/3] Emitting module EmbedInCodeBug
Build complete! (3.72s)

zap Desktop/EmbedInCodeBug % swift build --arch arm64 --arch x86_64 --configuration debug
0%: Compute target dependency graph
Building targets in dependency order
Target dependency graph (4 targets)
0%: Gather provisioning inputs
0%: Create build description
Build description signature: e0aed507d42bf2bc947c76af5ba2f364

Build description path: /Users/marc/Desktop/EmbedInCodeBug/.build/apple/Intermediates.noindex/XCBuildData/e0aed507d42bf2bc947c76af5ba2f364.xcbuilddata

0%: Build stat cache for /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk
0%: Process empty-EmbedInCodeBug_EmbedInCodeBug.plist
0%: Planning Swift module EmbedInCodeBug (x86_64)
0%: Planning Swift module EmbedInCodeBug (arm64)
0%: Emitting module for EmbedInCodeBug
0%: Compiling resource_bundle_accessor.swift
0%: Emitting module for EmbedInCodeBug
0%: Compiling resource_bundle_accessor.swift
0%: Compiling EmbedInCodeBug.swift
0%: Compiling EmbedInCodeBug.swift
0%: Compile EmbedInCodeBug.swift (x86_64)
0%: Compile resource_bundle_accessor.swift (arm64)
0%: Compile resource_bundle_accessor.swift (x86_64)
0%: Compile EmbedInCodeBug.swift (arm64)
cannot find 'PackageResources' in scope
cannot find 'PackageResources' in scope
/Users/marc/Desktop/EmbedInCodeBug/Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

/Users/marc/Desktop/EmbedInCodeBug/Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

Build cancelled

Steps to reproduce

Create a new Swift project that looks like this:

zap Desktop/EmbedInCodeBug % tree
.
├── Package.swift
├── Sources
│   └── EmbedInCodeBug
│       ├── EmbedInCodeBug.swift
│       └── Resources
│           └── Hello_Resources.txt
└── Tests
    └── EmbedInCodeBugTests
        └── EmbedInCodeBugTests.swift

6 directories, 4 files
// Sources/EmbedInCodeBug/EmbedInCodeBug.swift
let embeddedResource = PackageResources.Hello_Resources_txt
// Tests/EmbedInCodeBugTests/EmbedInCodeBugTests.swift
import XCTest
@testable import EmbedInCodeBug

final class EmbedInCodeBugTests: XCTestCase {
    func testExample() throws {
        XCTAssertEqual("Hi there!\n", String(bytes: EmbedInCodeBug.embeddedResource, encoding: .utf8))
    }
}
// swift-tools-version: 5.9
// Package.swift
import PackageDescription

let package = Package(
    name: "EmbedInCodeBug",
    products: [
        .library(
            name: "EmbedInCodeBug",
            targets: ["EmbedInCodeBug"]),
    ],
    targets: [
        .target(
            name: "EmbedInCodeBug", resources: [
            .embedInCode("Resources")
        ]),
        .testTarget(
            name: "EmbedInCodeBugTests",
            dependencies: ["EmbedInCodeBug"]),
    ]
)

Then run:

zap Desktop/EmbedInCodeBug % swift build --arch arm64 --arch x86_64 --configuration debug
0%: Compute target dependency graph
Building targets in dependency order
Target dependency graph (4 targets)
0%: Gather provisioning inputs
0%: Create build description
Build description signature: 4b92bb9be231a26aefaa9eea83d17a79

Build description path: /Users/marc/Desktop/EmbedInCodeBug/.build/apple/Intermediates.noindex/XCBuildData/4b92bb9be231a26aefaa9eea83d17a79.xcbuilddata

0%: Build stat cache for /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk
0%: Process empty-EmbedInCodeBug_EmbedInCodeBug.plist
20%: Planning Swift module EmbedInCodeBug (x86_64)
20%: Planning Swift module EmbedInCodeBug (arm64)
20%: Emitting module for EmbedInCodeBug
20%: Compiling EmbedInCodeBug.swift
20%: Emitting module for EmbedInCodeBug
20%: Compiling resource_bundle_accessor.swift
20%: Compiling resource_bundle_accessor.swift
20%: Compiling EmbedInCodeBug.swift
20%: Compile resource_bundle_accessor.swift (x86_64)
20%: Compile resource_bundle_accessor.swift (arm64)
20%: Compile EmbedInCodeBug.swift (x86_64)
20%: Compile EmbedInCodeBug.swift (arm64)
cannot find 'PackageResources' in scope
cannot find 'PackageResources' in scope
/Users/marc/Desktop/EmbedInCodeBug/Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

/Users/marc/Desktop/EmbedInCodeBug/Sources/EmbedInCodeBug/EmbedInCodeBug.swift:2:24: error: cannot find 'PackageResources' in scope
let embeddedResource = PackageResources.Hello_Resources_txt
                       ^~~~~~~~~~~~~~~~

Build cancelled

Swift Package Manager version/commit hash

No response

Swift & OS version (output of swift --version ; uname -a)

swift-driver version: 1.87.1 Apple Swift version 5.9 (swiftlang-5.9.0.128.108 clang-1500.0.40.1)
Target: arm64-apple-macosx14.0
Darwin zap.local 23.0.0 Darwin Kernel Version 23.0.0: Fri Sep 15 14:41:43 PDT 2023; root:xnu-10002.1.13~1/RELEASE_ARM64_T6000 arm64
neonichu commented 1 year ago

Makes sense, I don't think this was implemented in SwiftPM's XCBuild support.