================================================== This works: ==================================================
First I need openSSL from Swift, that I have done with COpenSsl: Package.swift: import PackageDescription let package = Package( name: "COpenSsl", pkgConfig: "openssl" ) module.modulemap: module COpenSsl [system] { header "/usr/local/include/openssl/ssl.h" header "/usr/local/include/openssl/err.h" header "/usr/local/include/openssl/crypto.h" header "/usr/local/include/openssl/evp.h" header "/usr/local/include/openssl/x509v3.h" export * } And then import this into Swift with: import COpenSsl ================================================== This does not work ================================================== Package.swift for the C-glue code: import PackageDescription let package = Package( name: "OpenSsl", dependencies: [ .Package(url: "https://github.com/Swiftrien/COpenSsl", "0.1.0") ] ) OpenSsl.h: (In Sources/include) // #import "openssl/ssl.h" // #import "openssl/x509.h" // #import "openssl/x509v3.h" @import COpenSsl; void sslCtxSetTlsExtServernameCallback(SSL_CTX *ctx, int (*cb)(SSL *, int *, void *), void *arg); void skGeneralNamePopFree(STACK_OF(GENERAL_NAME) *san_names); OpenSsl.c: (In Sources) #include "OpenSsl.h" void sslCtxSetTlsExtServernameCallback(SSL_CTX *ctx, int (*cb)(SSL *, int *, void *), void *arg) { SSL_CTX_set_tlsext_servername_arg(ctx, arg); SSL_CTX_set_tlsext_servername_callback(ctx, cb); } void skGeneralNamePopFree(STACK_OF(GENERAL_NAME) *san_names) { sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free); } The @import COpenSsl; statement does not work. Nor do the normal includes. Hence the compilation fails. Maybe the import statement is wrong? is there another way to do this? Regards, Rien Site: http://balancingrock.nl Blog: http://swiftrien.blogspot.com Github: http://github.com/Swiftrien Project: http://swiftfire.nl > On 22 Jan 2017, at 06:25, Daniel Dunbar <daniel_dun...@apple.com> wrote: > > What is the glue code you need? > > You can define a C/Obj-C target in the same Swift package, and then use it > from your Swift targets. See: > > https://github.com/apple/swift-package-manager/blob/master/Documentation/Reference.md#source-layouts > for more information. > > - Daniel > >> On Jan 21, 2017, at 2:24 AM, Rien via swift-users <swift-users@swift.org> >> wrote: >> >> The thing I was missing is the “system module”.. found it now though ;-) >> >> So far so good, I want to put that little glue code I need in its own >> module. However I cannot find how to specify the import search path. >> >> “swift build -I /usr/local/include/“ does not work (unknown command -I) >> >> And pkgConfig cannot be used on a non-system module. >> >> But without specifying the import search path, SPM cannot compile the c-code. >> >> Any suggestions? >> >> Regards, >> Rien >> >> Site: http://balancingrock.nl >> Blog: http://swiftrien.blogspot.com >> Github: http://github.com/Swiftrien >> Project: http://swiftfire.nl >> >> >> >> >>> On 20 Jan 2017, at 19:48, Rien via swift-users <swift-users@swift.org> >>> wrote: >>> >>> I may be missing something here, so please bear with me... >>> >>> The client of the lib only has to see the headers that describe the lib, >>> not the headers of the files that were used to create the lib. >>> Or are you referring to a case were the lib also exposes the headers of the >>> libs that were used to create the lib? >>> >>> Additional info: >>> In my particular case I use openSSL and have created a few Swift operations >>> that use (wrap) openSSL. My lib does not expose openSSL to the client of >>> the lib. >>> I did have to create a 2 line c-function for a callback. That function is >>> not exposed to the lib client. But this two line function is the reason for >>> the “mixed language” target. >>> Ideally no client should use openSSL directly, but it cannot be prevent of >>> course that a client links its own files to openSSL using his own bridging >>> file. >>> >>> Regards, >>> Rien >>> >>> Site: http://balancingrock.nl >>> Blog: http://swiftrien.blogspot.com >>> Github: http://github.com/Swiftrien >>> Project: http://swiftfire.nl >>> >>> >>> >>> >>>> On 20 Jan 2017, at 18:39, Jordan Rose <jordan_r...@apple.com> wrote: >>>> >>>> Hi, Rien. Libraries don’t support bridging headers because the client of >>>> the library has to be able to import the header, and arbitrary bridging >>>> headers may conflict. (This is actually the primary purpose of modules for >>>> Objective-C: to declare a group of headers that are self-contained—besides >>>> what other modules they import—and can therefore be imported earlier or >>>> later without difficulty.) The compiler will mildly try to stop you from >>>> doing this if it can figure out you’re building a library, but it’s a bad >>>> idea no matter what. Even if everything appears to compile fine, it’s >>>> likely you’ll get inscrutable errors when trying te debug anything that >>>> uses your library. >>>> >>>> The particular difference between Xcode-created frameworks and >>>> SwiftPM-generated libraries is that Xcode frameworks are set up to be >>>> mixed-source, using the Objective-C public umbrella header in place of a >>>> bridging header. SwiftPM doesn’t support mixed-source targets. (Since I >>>> don’t work on SwiftPM myself I don’t know if there are any public plans to >>>> do so.) >>>> >>>> The recommended solution is to group your Objective-C headers into modules >>>> (usually just frameworks) and import them that way, rather than to jam >>>> them in via a bridging header. >>>> >>>> Sorry for the trouble, >>>> Jordan >>>> >>>> >>>>> On Jan 20, 2017, at 08:49, Rien via swift-users <swift-users@swift.org> >>>>> wrote: >>>>> >>>>> I noticed something strange about Xcode and SPM concerning the capability >>>>> to generate Libraries. >>>>> >>>>> When I try to create a Library in Xcode and then want to add an >>>>> Objective-C bridging header, that is denied. It claims that bridging is >>>>> not supported for Libraries. >>>>> >>>>> When I create an Xcode project through the SPM (with “swift package >>>>> generate-xcodeproj”) then I can use bridging headers, even though the end >>>>> result is a library. >>>>> >>>>> Question: Is this a viable work around? or are there hidden dangers that >>>>> might not be immediately apparent? >>>>> >>>>> As a side note: SPM complains about multiple languages and currently only >>>>> supports pure Swift modules. >>>>> This creates the strange situation that I now use SPM to create an xcode >>>>> project and then use Xcode to create bridged mixed language libraries. >>>>> >>>>> Regards, >>>>> Rien >>>>> >>>>> Site: http://balancingrock.nl >>>>> Blog: http://swiftrien.blogspot.com >>>>> Github: http://github.com/Swiftrien >>>>> Project: http://swiftfire.nl >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> swift-users mailing list >>>>> swift-users@swift.org >>>>> https://lists.swift.org/mailman/listinfo/swift-users >>>> >>> >>> _______________________________________________ >>> swift-users mailing list >>> swift-users@swift.org >>> https://lists.swift.org/mailman/listinfo/swift-users >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users