<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Imho CFooBridge is unnecessary, bridging code can be added to CFoo itself.</div><div class="">For example, in CCurl some methods which can't be called directly from Swift</div><div class="">have additional wrappers in shim.h:</div><div class=""><br class=""></div><div class=""><a href="https://github.com/IBM-Swift/CCurl" class="">https://github.com/IBM-Swift/CCurl</a></div><div class=""><br class=""></div><div class="">In module.modulemap shim.h is used instead of system header,</div><div class="">and the system header is included in shim.h.</div><br class=""><div class="">
<div class="">Regards,</div><div class="">Andrey</div><br class="Apple-interchange-newline">

</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On 02 Aug 2016, at 06:51, Omri Mor &lt;<a href="mailto:omri50@gmail.com" class="">omri50@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">That isn’t quite what I mean.<div class=""><br class=""></div><div class="">There’s a system-level library, in say /usr/local/lib/libfoo.dylib (or libfoo.so on Linux), with a header in /usr/local/include/foo.h.</div><div class="">foo.h has complex macros that cannot be imported into Swift, so they need a C wrapper/bridge.</div><div class="">This is, say, foo_bridge.c and foo_bridge.h, where the source code defines global variables and functions, as necessary, to replace the macros and the header file has extern variables and function declarations. This must be compiled into a library that itself links with libfoo.</div><div class="">To use libfoo from Swift, it must be linked with foo_bridge so that it can use the macro replacements.</div><div class=""><br class=""></div><div class="">Currently, I can create a package called CFoo and one called CFooBridge that depends on CFoo, and have Swift code (e.g. a Swift wrapper called Foo) depend on CFooBridge. However, this is not ideal. I would prefer that the bridging code is within the CFoo package, as using CFoo without the bridging code is impossible from Swift. It is this that I have not figured out how to do, or if it is possible.</div><div class=""><br class=""></div><div class="">Omri<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jul 24, 2016, at 09:12, Andrey Fidrya &lt;<a href="mailto:af@zabiyaka.com" class="">af@zabiyaka.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">It's possible to declare multiple submodules in Package.swift. For example:</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">import PackageDescription</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">let package = Package(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; name: "SQLite.swift",</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; targets: [</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; Target(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: "SQLite",</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dependencies: [</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Target(name: "CSQLite")</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; Target(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: "CSQLite")</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; ]</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">)</span></div></div><div class=""><br class=""></div><div class="">Sources/CSQLite/ contains sqlite3.c, module.map etc</div><div class="">Source/SQLite/ - contains Swift code.</div><div class=""><br class=""></div>--<br class=""><div class="">
<div class="">Andrey</div><br class="Apple-interchange-newline">

</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On 15 Jul 2016, at 20:56, Omri Mor via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I’m trying to link some Swift code a C library. I have generated a Swift package for the library, but the library cannot be <i class="">directly</i>&nbsp;used from Swift – it relies on some complex macros that cannot be imported.<div class="">I’ve created C code and header files that replace these macros with variables and functions (where applicable). I’d like to be able to have this code within the package for the library and have the C code be compiled so that Swift code is linked with both it and the library.</div><div class=""><br class=""></div><div class="">I think I can have the C code be in a different package and have the library package depend on it, but I’d prefer to avoid that – using the library from Swift is <i class="">impossible</i>&nbsp;without the C bridge, so it should be part of the same package.</div><div class=""><br class=""></div><div class="">Is this possible?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Omri Mor</div></div>_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-users" class="">https://lists.swift.org/mailman/listinfo/swift-users</a><br class=""></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></body></html>