Skip to content

Following this tutorial generates a compile error on swift 5.9 #3

@DeCarabas

Description

@DeCarabas

When I follow this tutorial, after entering the code in the step entitled "A small application", running swift run MyCLI gives me the following errors:

C:\src\misc\MyCLI>swift run MyCLI
Building for debugging...
error: emit-module command failed with exit code 1 (use -v to see invocation)
C:\src\misc\MyCLI\Sources\MyCLI.swift:3:1: error: 'main' attribute cannot be used in a module that contains top-level code
@main
^
C:\src\misc\MyCLI\Sources\MyCLI.swift:1:1: note: top-level code defined in this source file
import Figlet
^
C:\src\misc\MyCLI\Sources\MyCLI.swift:1:1: note: pass '-parse-as-library' to compiler invocation if this is intentional
import Figlet
^
C:\src\misc\MyCLI\Sources\MyCLI.swift:3:1: error: 'main' attribute cannot be used in a module that contains top-level code
@main
^
C:\src\misc\MyCLI\Sources\MyCLI.swift:1:1: note: top-level code defined in this source file
import Figlet
^
C:\src\misc\MyCLI\Sources\MyCLI.swift:1:1: note: pass '-parse-as-library' to compiler invocation if this is intentional
import Figlet
^
error: fatalError

Here's what my files and whatnot look like:

C:\src\misc\MyCLI>swift --version
Swift version 5.9.1 (swift-5.9.1-RELEASE)
Target: x86_64-unknown-windows-msvc

C:\src\misc\MyCLI>cat Package.swift
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
  name: "MyCLI",
  dependencies: [
    .package(url: "https://github.com/apple/example-package-figlet", branch:"main"),
  ],
  targets: [
    // Targets are the basic building blocks of a package, defining a module or a test suite.
    // Targets can depend on other targets in this package and products from dependencies.
    .executableTarget(
      name: "MyCLI",
      dependencies: [
        .product(name: "Figlet", package: "example-package-figlet"),
      ],
      path: "Sources"),
  ]
)

C:\src\misc\MyCLI>dir Sources
 Volume in drive C is Primary
 Volume Serial Number is 869D-696D

 Directory of C:\src\misc\MyCLI\Sources

11/19/2023  11:11 AM    <DIR>          .
11/19/2023  11:03 AM    <DIR>          ..
11/19/2023  11:04 AM               118 MyCLI.swift
               1 File(s)            118 bytes
               2 Dir(s)  251,722,711,040 bytes free

C:\src\misc\MyCLI>cat Sources\MyCLI.swift
import Figlet

@main
struct FigletTool {
    static func main() {
        Figlet.say("Hello, Swift!")
    }
}

This looks like it might be related to swiftlang/swift#55127; indeed, when I create an empty file next to MyCLI.swift the project runs correctly:

C:\src\misc\MyCLI>touch Sources\empty.swift

C:\src\misc\MyCLI>dir Sources
 Volume in drive C is Primary
 Volume Serial Number is 869D-696D

 Directory of C:\src\misc\MyCLI\Sources

11/19/2023  11:15 AM    <DIR>          .
11/19/2023  11:03 AM    <DIR>          ..
11/19/2023  11:15 AM                 0 empty.swift
11/19/2023  11:04 AM               118 MyCLI.swift
               2 File(s)            118 bytes
               2 Dir(s)  251,721,732,096 bytes free

C:\src\misc\MyCLI>swift run MyCLI
Building for debugging...
lld-link: warning: C:\src\misc\MyCLI\.build\x86_64-unknown-windows-msvc\debug\MyCLI.build\MyCLI.swift.o: locally defined symbol imported: $s6FigletAAO3sayyySSFZ (defined in C:\src\misc\MyCLI\.build\x86_64-unknown-windows-msvc\debug\Figlet.build\Figlet.swift.o) [LNK4217]
[5/5] Linking C:\src\misc\MyCLI\.build\x86_64-unknown-windows-msvc\debug\MyCLI.exe
Build complete! (1.30s)
  _   _          _   _                 ____               _    __   _     _
 | | | |   ___  | | | |   ___         / ___|  __      __ (_)  / _| | |_  | |
 | |_| |  / _ \ | | | |  / _ \        \___ \  \ \ /\ / / | | | |_  | __| | |
 |  _  | |  __/ | | | | | (_) |  _     ___) |  \ V  V /  | | |  _| | |_  |_|
 |_| |_|  \___| |_| |_|  \___/  ( )   |____/    \_/\_/   |_| |_|    \__| (_)
                                |/

Ideally the swift bug would be fixed, but it looks like it's been open since 2020, so at least the tutorial should be fixed to work around this problem?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions