[swift-build-dev] [swift-users] Importing C system libraries

Kelvin Ma kelvinsthirteen at gmail.com
Tue Mar 28 23:53:51 CDT 2017


After a lot of wasted effort I’ve found that for some reason only the SPM
is capable of linking Swift code with Linux’s system libraries which are
all compiled with gcc, which apparently doesn’t get along too well with
clang.

All I want is to be able to import a system library without making an empty
git repository…

What I want to do:

main.swift:
    import <zlib.h>

What I have to do instead:

    ~$ cd ../CZlib
    ~$ git add -A
    ~$ git commit -m "who cares"
    ~$ git tag 1.0.0
    ~$ cd ../My_actual_project
    ~$ rm .build -r
    ~$ swift build
    ~$ cd ../CZlib
    ~$ git tag 1.0.0 --force
    ~$ cd ../My_actual_project
    ~$ rm .build -r
    ~$ swift build


On Tue, Mar 28, 2017 at 7:36 PM, Michael Ilseman <milseman at apple.com> wrote:

> This is into uncharted territory for me, but it seems you’re building with
> SwiftPM. You’ll probably want to configure extra compiler flags if that’s
> possible. You could also bite the bullet and build your C libraries with
> SwiftPM as well. Hopefully someone on swift-build-dev can help you out.
>
> CC-ing Ankit
>
>
> On Mar 28, 2017, at 5:09 PM, Kelvin Ma <kelvinsthirteen at gmail.com> wrote:
>
> How do I compile a project with many modules? My tree looks like this:
>
> <Selection_001.png>
>>
> On Tue, Mar 28, 2017 at 12:47 PM, Michael Ilseman <milseman at apple.com>
> wrote:
>
>> Sure! In this example, I have built libgit2. I have a directory called
>> Git, and inside that I have the following module map:
>>
>> module Git [system] {
>>        header "<my path>/libgit2/include/git2.h"
>>        export *
>> }
>>
>> When I run, I use:
>>
>> swift -I <path-to-“Git”-directory> -L <path-to-built-libgit2> -lgit2
>> foo.swift
>>
>> inside foo.swift I can:
>>
>> import Git
>> // … use libGit2
>>
>>
>> Read more about how to write a more appropriate module.map file for your
>> purposes at https://clang.llvm.org/docs/Modules.html. For example, you
>> might be able to define link flags inside the module.map, use umbrella
>> directories, submodules, etc.
>>
>>
>>
>> On Mar 28, 2017, at 6:27 AM, Kelvin Ma <kelvinsthirteen at gmail.com> wrote:
>>
>> Can you give an example?
>>
>> On Mon, Mar 27, 2017 at 3:59 PM, Michael Ilseman <milseman at apple.com>
>> wrote:
>>
>>> Sure. At a low level, you can create a module.map file and use -L/-l
>>> flags in your invocation of Swift. If you want to do so at a higher level,
>>> then perhaps SwiftPM can. CCing swift-build-dev for the SwiftPM part.
>>>
>>>
>>> > On Mar 26, 2017, at 3:20 PM, Kelvin Ma via swift-users <
>>> swift-users at swift.org> wrote:
>>> >
>>> > Idk if this has been asked before, but is there a way to import C
>>> libraries into a Swift project without creating a local git repo?
>>> Preferably something similar to C where you can just `#include` headers and
>>> then specify the link flags (in Package.swift?)
>>> >
>>> > It’s getting very cumbersome to make a bunch of empty git repos just
>>> to use libglfw or libcairo.
>>> > _______________________________________________
>>> > swift-users mailing list
>>> > swift-users at swift.org
>>> > https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-build-dev/attachments/20170328/25eb56cf/attachment.html>


More information about the swift-build-dev mailing list