Question: After generate-xcodeproj, what Xcode settings are needed to statically link a Swift Package Library into a simple command line executable … similar to what is produced by corresponding swift build?
Goal: Produce a statically linked executable with Xcode like what is produced by swift build from the command line … for the same module product.
The issue is that the generate-xcodeproj produced project creates a dynamically linked product (not expected) while swift build produces a statically linked product (as expected).
Example: Consider two Swift Manager Packages (SPM) packages:
- static library:
TinkerEvalStaticLib⇗ withswift package init --type libraryas the starting point. - command line executable:
TinkerEvalStaticCli⇗ withswift package init --type executableas the starting point.
TinkerEvalStaticLib is simple and expressly set to a type .static.
TinkerEvalStaticLib.swift
public class TinkerEvalStaticLib {
public static func printSomething() -> String {
let s = "Library says, 'Hello.'"
print(s)
return s
}
} Package.swift
…
products: [
.library(name: "TinkerEvalStaticLib",
type: .static, // expressly set to be a static library
…TinkerEvalStaticCli is also simple and has TinkerEvalStaticLib as a dependency.
main.swift
import TinkerEvalStaticLib
let _ = TinkerEvalStaticLib.printSomething() Package.swift
…
name: "TinkerEvalStaticCli",
dependencies: [
.package(
url: "git@github.com:VaporExamplesLab/TinkerEvalStaticLib.git",
.branch("master") ),
],
…Observation:
- In the
TinkerEvalStaticClidirectory,swift buildwill create a standalone relocatable, statically linked executable.
prompt> ./TinkerEvalStaticCli_spm
Library says, 'Hello.'
- However, the Xcode project created with
swift package generate-xcodeprojcreates a dynamically linked executable that requires the separate library.
prompt> ./TinkerEvalStaticCli_xc
dyld: Library not loaded: @rpath/TinkerEvalStaticLib.framework/Versions/A/TinkerEvalStaticLib
Referenced from: /Users/…/./TinkerEvalStaticCli_xc
Reason: image not found
Abort trap: 6
Note: One would expect that an swift package generate-xcodeproj generated Xcode project would build a static linked binary (instead of a dynamic linked binary) similar to the static linked binary produced by the corresponding swift build. So, this question is for a workaround to a current SPM generate-xcodeproj limitation.