Yesterday, I started playing around with Swift 5.2 on Linux (Ubuntu 20.04). This is mostly motivated by my desire to see if I can create a Swift module for the Godot engine. I started - as you’re supposed to - by using the Swift Package Manager to create a new package. The final form of this package is supposed to be a dynamic shared library, one that will be loaded by the game engine. However, in the interest of faster iteration, I created the package as an application rather than a library for initial testing. Once I was satisfied with the initial testing, I changed the product from .application to .library, added a type: .dynamic and expected that would suffice.

However, running swift build continued to produce a binary instead of producing a dynamic library (.dynlib, .dll or .so). The desired .so file was missing. I tried debugging it by creating a brand new package structured as a library from the get-go, and swift build correctly produced a .so file for that. The Package.swift files for both packages were virtually identical. After an hour or so, I discovered that the main difference was the name of the swift source file in the packages. In the package I’d created first - the one that started as an application and then turned into a library - the source file was named main.swift. In the second package - the one that was a library from the outset - the source file was named MyPackage.swift.

I renamed the file in the first package from main.swift to MyPackage.swift, and swift build magically started producing a MyPackage.so shared library.

Tagged: