Skip to content
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

The Swift build system can sometimes skip necessary rebuilds and result in link errors when using local packages. #7715

Open
1 task done
omochi opened this issue Jun 26, 2024 · 0 comments
Labels

Comments

@omochi
Copy link
Contributor

omochi commented Jun 26, 2024

Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc?

  • Confirmed reproduction steps with SwiftPM CLI. The description text must include reproduction steps with either of command-line SwiftPM commands, swift build, swift test, swift package etc.

Description

The conditions under which this issue occurs are complex, but we were able to create a project that reproduces it. You can reproduce it with the following repository:

https://github.com/omochi/swift-deps-rebuild-bug

Follow these steps to reproduce the issue:

$ git clone https://github.com/omochi/swift-deps-rebuild-bug
$ cd swift-deps-rebuild-bug
$ ./repro.bash

If a link error appears at the end of the script execution, the issue has occurred.

Below, the repository structure and the script’s process are explained.

This project consists of two packages:
the AppPackage package, which implements the main application,
and the ToyboxPackage package, which is referenced as a dependency via a local relative path.

Initially, AppPackage can be built with $ swift build.

Next, add b: Int = 0 as an argument to ToyboxCore.toyDebug.
Since this is a source-compatible change, it is expected that AppPackage can be built again without modification using $ swift build.

However, in practice, a link error occurs as shown below:

error: link command failed with exit code 1 (use -v to see invocation)
Undefined symbols for architecture arm64:
  "ToyboxCore.toyDebug(a: Swift.Int) -> ()", referenced from:
      AppModule.App.main() -> () in App.swift.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: fatalError
[9/14] Linking app

In this state, you cannot proceed without performing $ swift package clean.
In a practical setting, this breaks incremental builds and forces a rebuild of thousands of files, which is very inconvenient.

Expected behavior

In an originally buildable project, after making source-compatible changes, running $ swift build again should succeed.

Actual behavior

Link errors may occur.

Steps to reproduce

$ git clone https://github.com/omochi/swift-deps-rebuild-bug
$ cd swift-deps-rebuild-bug
$ ./repro.bash

Swift Package Manager version/commit hash

Swift Package Manager - Swift 5.10.0-dev

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

swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0

Darwin omochi-mbp.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:14:38 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6020 arm64

@omochi omochi added the bug label Jun 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant