I'm trying to move a functioning Xcode project to SwiftPM. The original project builds the C library as a static library, then my Swift library statically links to that, and everything is okay. When someone uses the Swift library, all of the symbols that were original C enums are available in the Swift application using the Swift library.
This isn't working for me when I try to migrate this to a pure SwiftPM package. None of the original symbols are present.
Here is my Package.swift:
// swift-tools-version:5.3 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "SwLibTidy", products: [ .library( name: "CLibTidy", targets: ["CLibTidy"]), .library( name: "SwLibTidy", targets: ["SwLibTidy"]), .executable( name: "Console", targets: ["Console"]), ], dependencies: , targets: [ .target( name: "CLibTidy" , dependencies:  , path: "Sources/CLibTidy" , exclude: ["version.txt"] , cSettings: [ .define("LIBTIDY_VERSION", to: #""1.2.3""#, nil), .define("RELEASE_DATE", to: #""2021/07/12""#, nil) ] ), .target( name: "SwLibTidy", dependencies: ["CLibTidy"], path: "Sources/SwLibTidy" ), .target( name: "Console", dependencies: ["SwLibTidy"], path: "Sources/Console" ), // .testTarget( // name: "SwLibTidyTests", // dependencies: ["CLibTidy", "SwLibTidy"] // ), ] )
Basically, I build
CLibTidy using vendored source code. I've manually created
module.modulemap for now, but it's fine, because when I build
SwLibTidy, it has access to everything that I've declared in the module.modulemap, including the critical
SwLibTidy builds fine, and I can use everything I defined in my
.swift files, and everything brought in via the modulemap is fine.
When I try to run tests or my simple console test app, none of values that were originally enums are visible, i.e., "Cannot find 'whatever' in scope." Sample main.swift file exhibiting this:
import Foundation import SwLibTidy let i = tidyOptGetInt( tdoc, TidyAccessibilityCheckLevel )
If I "Jump to Definition" of the
import SwLibTidy file, the fake Swift header-like file indeed doesn't show my missing enums. If do the same to the
import CLibTidy in my SwLibTidy.swift file, I can see where all of my enums have been properly brought in as a combination of struct plus public vars.
But why aren't these definitions being exposed by my SwLibTidy? Why does it work in a non-SwiftPM project when I build a static lib from the C code first? And most importantly, is there anything I can do to make this work?
I'd like to keep this self contained, and let SwiftPM run the C-compiler, rather than refactor this to use a system library, or try binary targets. Basically, plug and play for anyone who would include it.
Any suggestions? Many thanks in advance!