Umbrella Directories
framework module UsefulFramework {
umbrella "HeadersDirectory"
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 20
Slide 21
Slide 21 text
Explicit Submodules
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 21
Slide 22
Slide 22 text
Explicit Submodules
framework module UsefulFramework {
umbrella header "UsefulFramework.h"
explicit module ForSubclassEyesOnly {
header "ComplicatedTextField_subclass.h"
}
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 22
Slide 23
Slide 23 text
Private Headers
framework module UsefulFramework {
umbrella header "UsefulFramework.h"
private header "PrivateHashMapImpl.h"
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 23
Slide 24
Slide 24 text
Textual Headers
framework module UsefulFramework {
umbrella header "UsefulFramework.h"
textual header "AssertMacros.h"
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 24
Slide 25
Slide 25 text
Requires
framework module UsefulFramework {
umbrella header "UsefulFramework.h"
requires objc_arc, blocks, !altivec
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 25
Slide 26
Slide 26 text
Conflicts
framework module UsefulFramework {
umbrella header "UsefulFramework.h"
conflict PointlessFramework, "we do something more useful than that framework"
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 26
Slide 27
Slide 27 text
Automatic Module Map Discovery
$ tree include
include
!"" baking.h
!"" cake.h
!"" cookie.h
!"" module.modulemap
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 27
Slide 28
Slide 28 text
Relative Paths
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 28
Slide 29
Slide 29 text
Relative Paths
framework module UsefulFramework {
header "UsefulFramework.h"
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 29
Slide 30
Slide 30 text
Modules & Swift
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 30
Slide 31
Slide 31 text
But my Swift code doesn't have headers...
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 31
Slide 32
Slide 32 text
But my Swift code doesn't have headers...
It does
!
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 32
Slide 33
Slide 33 text
swiftc Understands .swiftmodule Files
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 33
Slide 34
Slide 34 text
The Mixed Framework Process
1. Compile all .swift files
2. Generate ModuleName-Swift.h in the (empty) .framework
3. "Extend" existing module map with .Swift submodule
4. Compile .m files
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 34
Slide 35
Slide 35 text
Extended Module Maps
module ModuleName.Swift {
header "ModuleName-Swift.h"
requires objc
}
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 35
Slide 36
Slide 36 text
Same-Module Imports
Superclass.m
#import
Subclass.swift
// nothing to import!
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 36
Slide 37
Slide 37 text
Same-Module Imports
swiftc Useful.swift
-module-name UsefulFramework
-import-underlying-module
-emit-module
-emit-objc-header
-Xcc -fmodule-map-file="UsefulFramework.modulemap"
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 37
Slide 38
Slide 38 text
Swift Static Libraries in CocoaPods
All of the changes needed:
https://github.com/CocoaPods/CocoaPods/pull/6966
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 38
Slide 39
Slide 39 text
Are Modules the Future?
• Tied to headers
• Swift module stability
• Still confusing
• Better than C
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 39
Slide 40
Slide 40 text
Some Resources
• Clang Docs
https://clang.llvm.org/docs/Modules.html
• Clang Source
https://github.com/llvm-mirror/clang/blob/master/include/clang/
Basic/Module.h
• CocoaPods Source
https://github.com/CocoaPods/CocoaPods/blob/master/lib/
cocoapods/generator/module_map.rb
• Trial & Error
Exploring Clang Modules – Samuel Giddins @ try! Swift Tokyo 2018 40
Slide 41
Slide 41 text
@segiddins
Mobile Developer Experience @ Square
Exploring Clang Modules
41