[swift-build-dev] Allowing further module organization

Daniel Dunbar daniel_dunbar at apple.com
Tue Apr 19 14:53:31 CDT 2016


Just to make sure I understand, the idea here is that


- Sources
- Sources/A
- Sources/A/B
- Sources/A/C

produces two modules, B & C, because A has no sources in it directly (following the convention for Sources/ itself)?

Following the SwiftPM example, why do you want BuildNode and BuildDescription to be separate modules?

The biggest problem I see here is that modules may mean different things to different people, and they have significant semantic meaning (since they change visibility). If I compare to LLVM, for example, the individual equivalent of a "module" is typically quite large. That leads to occasionally wanting to subdivide the sources of the module into subfolders without changing which module they contribute to, which I think this proposal would require?

 - Daniel

> On Apr 19, 2016, at 12:42 PM, Max Howell via swift-build-dev <swift-build-dev at swift.org> wrote:
> 
> SwiftPM is a pioneer for SwiftPM, and thus we have many modules. For some of these modules I’d like to split them out even more eg:
> 
> - Sources
>     - Build
> 
> Build is a module, but really I’d like:
> 
> - Sources
>     - Build
>         - BuildNode
>         - BuildDescription
> 
> If I do this currently I still will end up with one module: `Build`, this is how the module layout rules that SwiftPM uses work. But instead I’d like Build to be purely an organizational folder and to get two modules *BuildNode* and *BuildDescription*.
> 
> I’d like to propose some method to allow further organization, but without ruining our existing rules.
> 
> I’d also like to propose tightening up our rules a little.
> 
> —————————
> 
> One clear way to accomplish the first goal is to extend the rules and say empty folders are not considered modules.
> 
> I am unhappy with this however, already there are easy ways to completely transform the build of a package, and the rules we have are somewhat confusing, one can see this in newcomer questions on StackOverflow.
> 
> For example:
> 
> - Foo
>     - Sources
>         - Bar
>             - main.swift
> 
> Will build a single executable called `Bar`. However if one accidentally creates a new swift file:
> 
> - Foo
>     - Sources
>         - baz.swift
>         - Bar
>             - main.swift
> 
> Then you will get a single executable called baz, or more likely a compile error. Diagnosing this is currently an exercise in frustration (though we could improve this with better diagnostics when compiles fail, eg. we could output the modules structure we inferred).
> 
> To prevent these transformations we could just tighten up our rules.
> 
> If one browses swift packages online there is a clear preference towards a root `Sources` directory.
> 
> Thus I propose we only allow
> 
> A Sources directory with sub folders for modules
> A Sources directory with sources directly in the Sources directory and NO sub folders
> 
> Any other options become errors.
> 
> If we then extend the same rules to modules then there will be no surprising behavior. At first I resisted this idea as folders are for organization, however in the new world of SwiftPM *modules* are for organization.
> 
> Modules have internal accessibility modifiers that allow powerful architectural designs. Modules have a defined public interface that maps onto folder organizational practices better than 
> 
> However this prohibits eg:
> 
> - NetEngine/
>     - CommonCode.swift
>     - HTTP/
>         - foo.swift
>     - HTTPS/
>         - bar.swift
> 
> And perhaps thus is overly restrictive. Though my argument is that HTTP and HTTPS would be better off being their own modules: it would encourage true encapsulation and a better code architecture.
> 
> I am unsure and thus am opening a discussion here. Certainly there are other ways to accomplish the goals here so please let us know what you think a better solution (or not) would be. Thanks for your time.
> 
> Max
> _______________________________________________
> swift-build-dev mailing list
> swift-build-dev at swift.org
> 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/20160419/7a74a961/attachment.html>


More information about the swift-build-dev mailing list