> On Dec 20, 2015, at 3:51 PM, Daniel Dunbar <daniel_dun...@apple.com> wrote:
> 
>> 
>> On Dec 17, 2015, at 1:40 PM, Tom Sheffler via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>> I’m learning about Swift on Linux and using modules to wrap C libraries.  
>> One of the things I wanted to do was use libdispatch with blocks from Swift. 
>>  I thought it would be easy to use a module to wrap <dispatch/dispatch.h>.
>> 
>> I made a module called “CDispatch” with a module.modulemap like this
>> 
>> =======
>> module CDispatch [system] {
>>     header "/usr/include/dispatch/dispatch.h"
>>     export *
>>     link "dispatch"
>> }
>> ========
>> 
>> Then I created a little demo project called gcd4 whose Source/main.swift 
>> prints some things and then uses a dispatch queue and a block to print a 
>> message after 2 seconds delay.
>> 
>> =========
>> CDispatch.dispatch_after(time, queue, {
>>     print("Delayed!")
>> })
>> ========
>> 
>> The entire project is checked in at https://github.com/sheffler/gcd4 
>> <https://github.com/sheffler/gcd4>
>> and the CDispatch module is checked in at 
>> https://github.com/sheffler/CDispatch <https://github.com/sheffler/CDispatch>
>> 
>> If I try to “swift build” the project, it almost works but reports that 
>> dispatch_after is not found.  It seems that this function is not defined if 
>> the “blocks" feature is not provided at compilation time.
>> 
>> ========
>> Compiling Swift Module 'gcd4' (1 sources)
>> /home/sheffler/swift/gcd4/Sources/main.swift:42:1: error: module 'CDispatch' 
>> has no member named 'dispatch_after'
>> CDispatch.dispatch_after(time, queue, {
>> ^~~~~~~~~ ~~~~~~~~~~~~~~
>> <unknown>:0: error: build had 1 command failures
>> swift-build: exit(1): 
>> ["/home/sheffler/src/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin/swift-build-tool",
>>  "-f", "/home/sheffler/swift/gcd4/.build/debug/gcd4.o/llbuild.yaml”]
>> ========
>> 
>> I got the demo program to work by first using “swift build” to retrieve the 
>> CDispatch module, and then manually running the compiler like this (and 
>> including the “-Xcc -fblocks” arguments)
>> 
>> swiftc -v -o gcd4 Sources/main.swift -I .build/debug -j8 -Onone -g -Xcc 
>> -fblocks -Xcc -F-module-map=Packages/CDispatch-1.0.0/module.modulemap -I 
>> Packages/CDispatch-1.0.0 -I /usr/local/include
>> 
>> This is all pretty neat!  I’ve got blocks, dispatch queues and ARC on 
>> Ubuntu.  I have one question and one remark.
>> 
>> - Am i missing something about how to create the CDispatch module?  Why 
>> can’t “swift build” build this?
> 
> This is mostly an oversight, the libdispatch port has been coming up and you 
> are perhaps the first person to try to integrate all of these things.

It’s not normal, i know.  I’m looking forward to using blocks/dispatch on Linux 
for a media project.

> 
> I'm not sure yet exactly how we should resolve this, it might be the case 
> that swiftc should just default to enabling blocks support in the Clang 
> importer. In any case, can you open a specific bug in JIRA for this issue?

I’ll add the issue.

> 
>> - Creating Git repositories for simple modules that wrap a single library 
>> and include a header file or two seems like too much.  I would love to have 
>> been able to create a sub-directory in my project with a modulemap that 
>> includes <dispatch/dispatch.h> and links libdispatch.so
> 
> There will be an easier avenue to getting this working once we have some 
> amount of C support in the package manager.
> 
> Even then, one pro of encouraging the separate definition of module map 
> packages is so that they can be used by other people. It is cumbersome until 
> we have a the ecosystem of those packages (and easy ways for people to find 
> them), but it would be worse if they never ever ended up being shared.

I think the package manager direction for Swift is great actually.  I just took 
the opportunity to share some of my early experiences whil I had the chance.

> 
>  - Daniel
> 
>> 
>> Thanks
>> Tom
>> 
>> P.S. - I tried to make this easy to check out and compile
>> 
>> 
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to