Running 'swift build' crashes with segmentation fault when dependency name equals project's name - swift

Example:
> mkdir myProject && cd myProject
> swift package init --type executable
Edit Package.swift (added 1 dependency):
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "myProject",
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/someone/myProject.git", from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "myProject",
dependencies: []),
]
)
Build it:
> swift build
Segmentation fault (core dumped)
Environment
Ubuntu 16.04 LTS
Swift version 4.1-dev (LLVM 260a172ffb, Clang cd84be6c42, Swift 05b1b2be7c)
Is anyone aware if this was recently introduced and/or is happening with other versions of swift?

It is a bug:
Swift Bug SR-7597
https://bugs.swift.org/browse/SR-7597

Related

Runtime error with Xcode-generated project from SPM (dyld: Library not loaded, incompatible library version)

I'm building a command line tool with the Swift Package Manager, using Ink as a dependency.
I'm following this article by John Sundell for reference, and I managed to get the tool to compile and run with swift build -c release.
I also generated a corresponding Xcode project with swift package generate-xcodeproj, so that I can use the debugger and work more effectively.
However, whenever I try to run my tool from Xcode, I get this error:
dyld: Library not loaded: /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink
Referenced from: /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox
Reason: Incompatible library version: HIToolbox requires version 1.0.0 or later, but Ink provides version 0.0.0
Program ended with exit code: 9
For reference, here's my Package.swift:
import PackageDescription
let package = Package(
name: "SwiftSiteGen",
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(
url: "https://github.com/johnsundell/files.git",
from: "4.0.0"
),
.package(
url: "https://github.com/johnsundell/Ink.git",
from: "0.1.3"
),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "SwiftSiteGen",
dependencies: ["SwiftSiteGenCore"]),
.target(name: "SwiftSiteGenCore",
dependencies: ["Files", "Ink"]),
.testTarget(
name: "SwiftSiteGenTests",
dependencies: ["SwiftSiteGen"]),
]
)
I'm running on Xcode 11.2.1, on macOS 10.14.4.
Since running swiftc build works, I feel that the problem is with Xcode trying to use dynamic frameworks rather than static libraries. Possibly related question here.
Are there some Xcode project settings I need to change to make this work?
Verified Solution
Do not run swift package generate-xcodeproj.
Instead, just open Package.swift directly in Xcode.
That way, all packages are statically linked.

Swift Package Manager: dependency iOS version

I'm trying to build swift package with external dependency (CoreStore) with xCode11 beta 7. My package is targeted for iOS11+, it's declared in Package.swift:
// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "Storages",
platforms: [.iOS(.v11)],
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "Storages",
targets: ["Storages"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "https://github.com/JohnEstropia/CoreStore.git", from: "6.3.0")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "Storages",
dependencies: [.product(name: "CoreStore")]),
.testTarget(
name: "StoragesTests",
dependencies: ["Storages"]),
]
)
However, when I build it dependency builds without iOS version specified, so I get compatibility errors:
"'uniquenessConstraints' is only available in iOS 9.0 or newer" and so on.
How can I fix it? Looks like it's xCode11 bug, but I'm not sure.
On my machine, adding the platforms: parameter to the manifest solved it. For example:
let package = Package(
name: "MyLibrary",
platforms: [.iOS("13.0")],
// ...
I'm not sure is it xCode bug or not, however with Swift Package Manager and xCode 11 you have to clearly specify iOS version when use #available check. Not matter if library is targeted for iOS 10+ or not, instead of
if #available(macOS 10.11, *) {
info.append(("uniquenessConstraints", self.uniquenessConstraints))
}
you should use
if #available(macOS 10.11, iOS 9.0, *) {
info.append(("uniquenessConstraints", self.uniquenessConstraints))
}
Pull request was posted:
https://github.com/JohnEstropia/CoreStore/pull/341
First, you need to add a platform parameter and fill it out with the supported platform versions. Then, you need to clear derived data in your host app. After that, try adding the spm framework again.
I had the same thing where I didn't add the platform parameter at first and it was giving me so many "'xxx' is only available in iOS 9.0 or newer" errors in my host app. Hopefully that fixes it for you.

Swift Package Manager executable app, set deployment target

I'm using Swift Package Manager to create a macOS executable. When I use things that aren't available in all macOS versions I get compile errors. Two big examples are URL(fileURLWithPath: filePath, relativeTo: directoryToSearch) and url.hasDirectoryPath.
When building with swift build I get error: 'init(fileURLWithPath:relativeTo:)' is only available on OS X 10.11 or newer errors. I don't care about any old OS versions, as it's just a personal tool. How can I set the deployment target to be 10.14 so I don't have to sprinkle checks all through out my code?
I found https://hirschmann.io/swift-package-manager/ which talks about this issue. However it's solution is creating an xcconfig file with the deployment target set and using swift package generate-xcodeproj --xcconfig-overrides ./main.xcconfig to apply it to the generated Xcode project. While it does work, it only works for the Xcode project, so if I just want to do swift build to get the free standing executable to use outside of Xcode then I can't.
My package file was auto generated by swift package init --type executable and hasn't been changed.
// swift-tools-version:4.2
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "swift_converter",
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "swift_converter",
dependencies: []),
.testTarget(
name: "swift_converterTests",
dependencies: ["swift_converter"]),
]
)
This may not help you right now, but the upcoming Swift 5.0 will include the ability to specify the deployment target in the package manifest, using a syntax like this:
...
platforms: [
.macOS(.v10_13), .iOS(.v12),
],
...
(The same is true for some other common build settings.)
Until then, you can override the default deployment target via command line arguments like this:
$ swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"
You'll have to include these arguments in every call to swift build, swift run, swift test.

Product dependency not found — only before Swift 4.2

I'm maintaining two Swift Package Manager projects on GitHub. One of them, DiceKit, depends on the other, ProtocolKit. They are also both using a swift-tools-version of 4.0.
DiceKit has continuous integration set up with Travis CI, shown here. It is tested on both macOS and Linux, on Swift 4.0, 4.0.2, 4.0.3, 4.1, 4.1.1, 4.1.2, 4.1.3, and 4.2. However, the tests on every version except 4.2 are failing, while the tests on 4.2 succeed.
Here's the error from the macOS Swift 4.0 log:
$ swift test
error: dependency graph is unresolvable; found these conflicting requirements:
Dependencies:
https://github.com/Samasaur1/ProtocolKit.git # 1.0.0..<2.0.0
error: product dependency 'ProtocolKit' not found
Fetching https://github.com/Samasaur1/ProtocolKit.git
However, on the Swift 4.2 log, fetching the dependencies is successful:
$ swift test
Fetching https://github.com/Samasaur1/ProtocolKit.git
Completed resolution in 1.44s
Cloning https://github.com/Samasaur1/ProtocolKit.git
Resolving https://github.com/Samasaur1/ProtocolKit.git at 1.0.2
Compile Swift Module 'ProtocolKit' (1 sources)
Compile Swift Module 'DiceKit' (3 sources)
Compile Swift Module 'DiceKitTests' (4 sources)
For reference, here is the Package.swift file for DiceKit:
// swift-tools-version:4.0
// Managed by ice
import PackageDescription
let package = Package(
name: "DiceKit",
products: [
.library(name: "DiceKit", targets: ["DiceKit"]),
],
dependencies: [
.package(url: "https://github.com/Samasaur1/ProtocolKit.git", from: "1.0.0"),
],
targets: [
.target(name: "DiceKit", dependencies: ["ProtocolKit"]),
.testTarget(name: "DiceKitTests", dependencies: ["DiceKit"]),
]
)
And here is the one for ProtocolKit:
// swift-tools-version:4.0
// Managed by ice
import PackageDescription
let package = Package(
name: "ProtocolKit",
products: [
.library(name: "ProtocolKit", targets: ["ProtocolKit"]),
],
targets: [
.target(name: "ProtocolKit", dependencies: []),
.testTarget(name: "ProtocolKitTests", dependencies: ["ProtocolKit"]),
]
)
I'm at my wit's end about this, and I'd really appreciate any help you all can give. Thanks in advance!

How to add executable in Xcode that can be run by the Swift Package Manager?

I used SPM to initialize the package and then generated xcodeproj for editing in Xcode. I added an executable in Xcode but SPM isn't picking it up when building. If I run generate-xcodeproj again using SPM, the executable product is gone. I looked into the .build folder and the executable isn't there. Right now this is my Package.swift:
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "Swerver",
products: [
.library(
name: "Swerver",
targets: ["Swerver"]),
],
dependencies: [
.package(url: "https://github.com/IBM-Swift/BlueSocket.git", from: "1.0.8"),
],
targets: [
.target(
name: "Swerver",
dependencies: [
"Socket"
],
path: "Sources/SwerverCore"),
.testTarget(
name: "SwerverTests",
dependencies: ["Swerver"]),
]
)
You can't add an executable in Xcode and have it picked up by the Swift Package Manager. You need to add it in the Package.swift file and regenerate the Xcode project.
Alternatively, add the executable to a new project that references the generated project.