swiftlang/swift-package-manager

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

omochi opened this issue · 0 comments

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