Yep, we need to have better support for system packages. Unfortunately it is 
not covered in the Swift 4 Package Manager roadmap 
<https://lists.swift.org/pipermail/swift-evolution-announce/2017-January/000307.html>,
 but community driven proposal are always welcomed!

> On 30-Mar-2017, at 12:25 AM, Kelvin Ma <kelvinsthirt...@gmail.com> wrote:
> 
> I agree that portability is valuable and that it’s something that’s lacking 
> in the c/makefile workflow. I just don’t think empty git repositories are the 
> right solution. Perhaps we can get the best of both worlds with something 
> like this in the SwiftPM:
> 
> 
>     .Package(include: "cairo.h", link: "cairo" version: "1.1.4", remote: 
> "git://anongit.freedesktop.org/git/cairo 
> <http://anongit.freedesktop.org/git/cairo>")
> 
> It would search for the cairo lib on local machine in /usr/lib and 
> /usr/local/lib , and if it can’t find it, or if the version doesn’t match, it 
> will then download the C sources from the Cairo project’s *official* git 
> repository and build it for you. Options could be added to specify 
> alternative search paths or user prompts.
> 
> On Wed, Mar 29, 2017 at 12:42 PM, Ankit Aggarwal <ankit_aggar...@apple.com 
> <mailto:ankit_aggar...@apple.com>> wrote:
> I agree that libressl isn't a good example because of the security questions 
> it raises, but libYAML is a good self contained package IMO. With custom 
> targets layout proposal, the forks can be replaced by submodules. The problem 
> with apt-get approach is, it takes away the "portability" from the package 
> and it doesn't work in cases when you don't have full access to the system. 
> That said, we do support this approach upto a certain degree. For e.g., 
> swiftpm allows system package authors to declare hints for installing a 
> system package dependency (via brew or apt-get). The /usr/include, /usr/lib 
> etc are searched by default and non-standard paths are supported using pkg 
> config. See: 
> https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#require-system-libraries
>  
> <https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#require-system-libraries>
> 
>> On 29-Mar-2017, at 10:55 PM, Kelvin Ma <kelvinsthirt...@gmail.com 
>> <mailto:kelvinsthirt...@gmail.com>> wrote:
>> 
>> I don’t think this is a good approach, the libressl 
>> <https://github.com/vapor/clibressl> repo is pretty much just the source 
>> code of the C library copied and pasted into a Swift module. That’s not a 
>> good thing™. The linux build paradigm is, the library maintains its own 
>> *official* source repository, the OS package distributors build it, users 
>> install the built dependencies with `sudo apt-get install libwhatever-dev` 
>> and the project source just builds and links to the library managed by the 
>> system.
>> 
>> Here you have to keep the forked library source up to date with the real 
>> library source, download it from the internet and build the entire project 
>> plus the libraries of which there could be many.
>> 
>> IMO the ideal way to import system libs would be for the user to install the 
>> dependency with `apt`, just as you would for any C program, have the 
>> `include` statements within the project source (like you would for any C 
>> program), and then have the paths to `/usr/include` and `/usr/lib` and 
>> `/usr/local/include` etc in a Makefile (or Package.swift). Usually it’s only 
>> “specialty” libraries like libspiro that people download and build manually, 
>> and even then, it’s downloaded from the Spiro project’s own official 
>> repository, not a third party fork. That’s the “accepted” way to do things, 
>> that linux ecosystems are designed around. Of course, this is very similar 
>> to the modulemap system that currently works in Swift. I just wish 
>> modulemaps could be streamlined a little, maybe combined with the top level 
>> Package.swift.
>> 
>> On Wed, Mar 29, 2017 at 1:03 AM, Ankit Aggarwal <ankit_aggar...@apple.com 
>> <mailto:ankit_aggar...@apple.com>> wrote:
>> 
>>> On 29-Mar-2017, at 11:22 AM, kelvinsthirt...@gmail.com 
>>> <mailto:kelvinsthirt...@gmail.com> wrote:
>>> 
>>> I figured that was the intention, but we can’t be too surprised that 
>>> everyone is maintaining personal modulemap repositories (and polluting 
>>> search results — just try googling for a Swift PNG library!), especially 
>>> when this central repo still doesn’t exist yet.
>> 
>> Yeah thats unfortunate, maybe this will improve once we have an index.
>> 
>>> If Swift ever comes on par with C in terms of being usage and the lingua 
>>> franca of the FOSS world, I can see linux distributions shipping standard 
>>> modulemaps the same way they ship C headers, but you have to admit this is 
>>> years (decades?) away at best.
>>> 
>>> On the flip side of it, it does wonders in terms of motivating people (me 
>>> at least) to start writing pure Swift replacements for some of these C 
>>> libraries (like libpng)…
>> 
>> I think its better to reuse existing libraries than writing from scratch 
>> (unless really needed). A good approach that works is "porting" these 
>> libraries to build with SwiftPM, see: libYAML 
>> <https://github.com/jpsim/Yams>, libressl 
>> <https://github.com/vapor/clibressl>. However, this porting can be difficult 
>> to do right but it should become much easier once we have build settings 
>> support and custom targets layout 
>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170320/034469.html>.
>> 
>>> 
>>> On Mar 29, 2017, at 12:42 AM, Ankit Aggarwal <ankit_aggar...@apple.com 
>>> <mailto:ankit_aggar...@apple.com>> wrote:
>>> 
>>>> I think the idea was that there will be one such repository which other 
>>>> packages can use, that too only until the system libraries start shipping 
>>>> their standard modulemap. I thought we had this written down in our 
>>>> documentation somewhere but couldn't find it.
>>>> 
>>>> Maybe Daniel can expand on this.
>>>> 
>>>> On Wed, Mar 29, 2017 at 10:48 AM, Kelvin Ma via swift-build-dev 
>>>> <swift-build-...@swift.org <mailto:swift-build-...@swift.org>> wrote:
>>>> This worked! Thanks! But why is having empty git repositories strewn about 
>>>> the “correct” way? System libraries should be imported from within the 
>>>> project, as they are in C. You have to admit it’s getting quite silly that 
>>>> Swift devs keep repositories like these 
>>>> <https://github.com/kelvin13/swift-zlib> on our github accounts. That zlib 
>>>> repository contains exactly ten lines of code. I used to have 6 or 7 repos 
>>>> like that one up there before I got rid of them and switched to local 
>>>> repos. 
>>>> 
>>>> On Wed, Mar 29, 2017 at 12:03 AM, Ankit Aggarwal <ankit_aggar...@apple.com 
>>>> <mailto:ankit_aggar...@apple.com>> wrote:
>>>> In this case, these are just umbrella headers. If your modulemap contains 
>>>> absolute path to the header, then you don't need the header files, but 
>>>> SwiftPM will probably warn about this. Note that this is a "hack" to have 
>>>> system packages inside a single repository. The correct way is to have 
>>>> system package as a separate published package which you only need to do 
>>>> once.
>>>> 
>>>>> On 29-Mar-2017, at 10:26 AM, Kelvin Ma <kelvinsthirt...@gmail.com 
>>>>> <mailto:kelvinsthirt...@gmail.com>> wrote:
>>>>> 
>>>>> I will try this, but why are the header files inside the Sources 
>>>>> directory? System headers should live in /usr/include…
>>>>> 
>>>>> On Tue, Mar 28, 2017 at 11:48 PM, Ankit Aggarwal 
>>>>> <ankit_aggar...@apple.com <mailto:ankit_aggar...@apple.com>> wrote:
>>>>> Hi,
>>>>> 
>>>>> Apologies for not replying to this earlier. 
>>>>> 
>>>>> You can have multiple targets in a single package. Each target can either 
>>>>> be Swift or C-family. The type of target is determined by the sources 
>>>>> contained in it (*.c/*.cpp etc means C target, *.swift means Swift 
>>>>> target). So if you want to create multiple C targets, this layout should 
>>>>> work:
>>>>> 
>>>>> Package.swift
>>>>> Sources/
>>>>>     Bitmap
>>>>>     Cubify
>>>>>     Cairo/anchor.c <---- This is just an empty file to tell SwiftPM that 
>>>>> this is a C target.
>>>>>     Cairo/include/Cairo.h
>>>>>     Cairo/include/module.modulemap
>>>>>     GLFW/anchor.c
>>>>>     GLFW/include/GLFW.h
>>>>>     GLFW/include/module.modulemap
>>>>> 
>>>>> The modulemap is automatically generated, if not provided. This is a 
>>>>> package which contains two targets (one C and one Swift): 
>>>>> https://github.com/jpsim/Yams <https://github.com/jpsim/Yams>
>>>>> 
>>>>> If you need to pass a bunch of compiler flags, you can use SwiftPM's 
>>>>> pkgConfig feature but that will require you to have a separate repository 
>>>>> for Cario and GLFW. You can experiment without creating tags using the 
>>>>> edit feature 
>>>>> <https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#editable-packages>.
>>>>> 
>>>>> PS: You can join SwiftPM slack channel for quicker turn around time: 
>>>>> https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20160530/000497.html
>>>>>  
>>>>> <https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20160530/000497.html>
>>>>> 
>>>>> Thanks,
>>>>> Ankit
>>>>> 
>>>>> 
>>>>> On Wed, Mar 29, 2017 at 6:06 AM, Michael Ilseman via swift-build-dev 
>>>>> <swift-build-...@swift.org <mailto:swift-build-...@swift.org>> 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 <kelvinsthirt...@gmail.com 
>>>>>> <mailto:kelvinsthirt...@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 <milse...@apple.com 
>>>>>> <mailto:milse...@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 
>>>>>> <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 <kelvinsthirt...@gmail.com 
>>>>>>> <mailto:kelvinsthirt...@gmail.com>> wrote:
>>>>>>> 
>>>>>>> Can you give an example?
>>>>>>> 
>>>>>>> On Mon, Mar 27, 2017 at 3:59 PM, Michael Ilseman <milse...@apple.com 
>>>>>>> <mailto:milse...@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@swift.org <mailto:swift-users@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@swift.org <mailto:swift-users@swift.org>
>>>>>>> > https://lists.swift.org/mailman/listinfo/swift-users 
>>>>>>> > <https://lists.swift.org/mailman/listinfo/swift-users>
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> swift-build-dev mailing list
>>>>> swift-build-...@swift.org <mailto:swift-build-...@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-build-dev 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-build-dev>
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-build-dev mailing list
>>>> swift-build-...@swift.org <mailto:swift-build-...@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-build-dev 
>>>> <https://lists.swift.org/mailman/listinfo/swift-build-dev>
>>>> 
>>>> 
>> 
>> 
> 
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to