[swift-build-dev] importing a *local* native dependency
Rick Ballard
rballard at apple.com
Sat Jan 2 14:01:24 CST 2016
Hi Drew,
This use case – facilitating packages that include pre-built binaries – is not one that we want to support right now. For the foreseeable future we'd really like to stick to source-based distribution, as discussed in https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageManagerCommunityProposal.md#source-based-distribution.
Your proposal for dependencies on subpaths within a repo is one that we might consider at some point independent of this problem, but we'd need a better driving reason to do so. (We've had some discussions internally about whether to enforce that each package lives at the top level of a repo, vs supporting repos that contains multiple packages, and, at least for now, I think we'd like to have a repo per package). Your second proposal, for custom include paths, seems really specific to supporting pre-built binaries, so I don't think that aligns with our goals.
Our "Future Features" list does include "Support for Other Build Systems" (https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageManagerCommunityProposal.md#support-for-other-build-systems), so long-term I think I'd like to see us develop a proposal for that as the solution to your problem here.
So at the moment, I don't think I would want to accept a PR for either of these proposals. But I really appreciate your bringing this up.
Thank you,
- Rick
> On Dec 25, 2015, at 8:22 AM, Drew Crawford via swift-build-dev <swift-build-dev at swift.org> wrote:
>
> Just to be clear...
>
> If I PRed one or both of these, it would be rejected?
>
> I'm going to cook up some solution in any case, it's a question of whether I should be gearing up to distribute and maintain a long term fork. It's undesirable since it complicates upstreaming further work I do in my tree.
>
> But it will be unavoidable if I need a solution before you want to design it, which sounds like it may be the present situation.
>
> Sent from my iPhone
>
> On Dec 25, 2015, at 9:36 AM, Max Howell <max.howell at apple.com <mailto:max.howell at apple.com>> wrote:
>
>> This fulls under our "mixed targets" future plan.
>>
>> For now I think you'll not be able to use swiftpm at all. Sorry :(
>>
>> On Dec 25, 2015, at 3:19 AM, Drew Crawford via swift-build-dev <swift-build-dev at swift.org <mailto:swift-build-dev at swift.org>> wrote:
>>
>>> I'm trying to package a Swift library. This Swift library is tightly coupled to a native library. By "tightly coupled" here I really mean that only half the library is written in Swift, and the other half, as an implementation detail, is in some other language.
>>>
>>> You *probably* do not have a build environment for this other language just lying around, so my plan (actually, my current practice) is to distribute binaries of the non-Swift part, just checked into source control, and then link against them with a module map. Yes, I realize this isn't portable, but neither is anything else in this project, so I'll save that particular surprise for another day.
>>>
>>> The trouble is, swiftpm wants there to be some "other" repo called `CFoo` containing only a modulemap with paths that point to... /usr/local I guess? <https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md> But
>>>
>>> 1. There is no other repo
>>> 2. You have not installed the non-Swift half of my library to /usr/local
>>> 3. You do not want to link against "some" version of the binary blob you have lying around from times past. You want to link against exactly the one I give you, because the work is versioned as a whole.
>>>
>>> I see two solutions to this problem.
>>>
>>> # Non-URL dependencies
>>>
>>> Behind this door, I can write a Package.swift like this:
>>>
>>> let package = Package(
>>> name: "Foo",
>>> dependencies: [
>>> .Package(path: "CFoo"),
>>> ],
>>> )
>>>
>>> The semantic of this is that Foo depends on a package CFoo that is merely a folder in the current repository (e.g., we do not need to clone it from somewhere else).
>>>
>>> In my case CFoo would contain a module.map and a binary blob, but in the general case it is any arbitrary kind of package.
>>>
>>> This solves my three problems since 1) There's only one repo, 2) The binary is located with repo-based paths, 3) You're linking against the particular CFoo distributed in the repository.
>>>
>>> # Custom include paths
>>>
>>> Another possibility goes like this:
>>>
>>> let package = Package(
>>> name: "Foo",
>>> extraIncludePaths: ["CFoo"]
>>> )
>>>
>>> The semantic of this is that we pass `-I CFoo` to swiftc (e.g. that is emitted into `other-args` of llbuild.yaml)
>>>
>>> In my case CFoo contains a module.map and a binary blob, but in the general case it contains any kind of header path that a package may want to import.
>>>
>>> There are certainly other possibilities besides these two, I'm just suggesting them because they seem straightforward based on my poking around in the sourcecode today.
>>>
>>> I am happy to contrib either of these (or something else proposed) but would like to achieve consensus on a design instead of PRing by surprise.
>>>
>>> _______________________________________________
>>> swift-build-dev mailing list
>>> swift-build-dev at swift.org <mailto:swift-build-dev at 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-dev at swift.org <mailto:swift-build-dev at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-build-dev <https://lists.swift.org/mailman/listinfo/swift-build-dev>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-build-dev/attachments/20160102/90ea4937/attachment.html>
More information about the swift-build-dev
mailing list