Slide 1

Slide 1 text

Building Swift Static Libraries Samuel Giddins 1

Slide 2

Slide 2 text

@segiddins Mobile Developer Experience @ Square CocoaPods Core Contributor 2 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 3

Slide 3 text

Mobile Developer Experience ⇢Owns the build system, dependency manager, interface with CI ⇢Maintains the (open source) tools used to build the app ⇢Keeps developers as productive as possible ⇢Cross platform: iOS & Android ⇢Develops CocoaPods features 3 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 4

Slide 4 text

CocoaPods @ Square ⇢265 total pods ⇢Swift, Objective-C ⇢Dynamic Frameworks, Static Libraries, Static Frameworks ⇢Monorepo & Multirepo 4 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 5

Slide 5 text

A (Brief) History of Swift Linkage ⇢SwiftyThing.framework From Xcode ⇢ SwiftyThing (as a dynamic library) ⇢libSwiftyThing.a From Swift PM ⇢... And that's it! 5 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 6

Slide 6 text

Until Xcode 9 6 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 7

Slide 7 text

Xcode 9 added the ability to build Swift into static libraries 7 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 8

Slide 8 text

Why static libraries? ⇢Easier to obfuscate / strip dead code ⇢No overhead on app launch ⇢Possible to have true single-file executables 8 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 9

Slide 9 text

Aside: This also means you can now build Swift static frameworks, if you like! 9 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 10

Slide 10 text

What static libraries don't fix: ⇢ABI stability ⇢Module format stability ⇢Clang Modules ⇢Swift compiler performance ⇢Buggy code 10 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 11

Slide 11 text

But: They did allow us to start building Swift pods 11 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 12

Slide 12 text

So, how do these magic new libraries work? 12 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 13

Slide 13 text

Swift Static Libraries, In Practice 13 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 14

Slide 14 text

Swift Static Libraries, In Practice Surprisingly simple! 1. Create an app / command line target 2. Create a static library target 1. Delete Objective-C files 2. Add a Swift file 3. Link the static library into the app 4. Build & Run 5. Profit‽ 14 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 15

Slide 15 text

But: Only if you don't want to use any of the code in the static library in another target 15 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 16

Slide 16 text

So, no profit. 16 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 17

Slide 17 text

The hardest part of building Swift static libraries has been using them 17 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 18

Slide 18 text

Frameworks make importing Swift code easy 18 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 19

Slide 19 text

Importing Swift Code 1. .modulemap 2. Headers 3. .swiftmodule 4. Generated -Swift.h Bridging Header 19 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 20

Slide 20 text

Importing Swift Code Objective-C: $ clang -F path/to/framework -f FrameworkName ... Swift: $ swiftc -F path/to/framework -f FrameworkName ... 20 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 21

Slide 21 text

Importing Swift Code Piece of cake with frameworks! (Seriously, frameworks are amazing) 21 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 22

Slide 22 text

On the other hand: Static librarys Manual integration 22 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 23

Slide 23 text

Aside: Most of this is all trivia I learned integrating Swift static library support into CocoaPods. If I could do it all again, I would've just made static frameworks work and call it a day. 23 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 24

Slide 24 text

Now entering: Compiler 24 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 25

Slide 25 text

Compilers Magic But constructing correct compiler arguments by hand is tedious and error prone and it's 2018 and no one should ever need to do it 25 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 26

Slide 26 text

⚠ Detour into Clang Modules 26 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 27

Slide 27 text

! I gave a talk about this particular, highly painful, subject at try! Swift Tokyo 2018 27 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 28

Slide 28 text

Clang Modules & Swift Modules are highly related 28 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 29

Slide 29 text

For Swift to import Objective-C: ⇢Bridging Header ! ⇢Modules for the imported code For Objective-C to import Swift: ⇢Directly import generated -Swift.h header ⇢Import the generated module 29 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 30

Slide 30 text

Seeing a pattern here? 30 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 31

Slide 31 text

Modules are the lingua franca by which Swift and Objective-C are meant to bridge 31 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 32

Slide 32 text

Modules are created automatically when building frameworks in Xcode 32 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 33

Slide 33 text

This is where the heavy lifting comes in for manually integrating static libraries 33 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 34

Slide 34 text

Clang: $ clang -fmodule-map-path=path/to/Library.modulemap Swift: $ swiftc -Xcc -fmodule-map-path=path/to/Library.modulemap -I dir/of/other/library.swiftmodule 34 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 35

Slide 35 text

This is what enables imports to work Objective-C: @import Library; Swift: import Library 35 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 36

Slide 36 text

Why does being able to use imports matter? ⇢It allows libraries to import other libraries ⇢It gets rid of buggy bridging headers ⇢Modular imports are semantic, and don't need to be tied to particular header names 36 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 37

Slide 37 text

How do I mix Swift & Objective-C in one library? 37 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 38

Slide 38 text

How do I mix Swift & Objective-C in one library? Trivial with frameworks. ⇢Objective-C headers in the module map are immediately usable from Swift ⇢#import from Objective-C 38 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 39

Slide 39 text

How do I mix Swift & Objective-C in one library? ⇢Pass the module map to both clang & swiftc ⇢Pass the path to the generated Objective-C interface to clang ⇢Experience all new compiler segfaults 39 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 40

Slide 40 text

Your developers were so preoccupied with whether or not they could, they didn't stop to think if they should. — Jurassic Park 40 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 41

Slide 41 text

Should I... ⇢Mix Swift & Objective-C? ⇢Mix static libraries & dynamic frameworks? ⇢Mix static libraries & static frameworks? 41 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 42

Slide 42 text

But Samuel, what if that looks like a lot of work? 42 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 43

Slide 43 text

Never fear! We're programmers, so we have pre-written solutions! 43 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 44

Slide 44 text

Pre-written solutions: ⇢Swift Package Manager ⇢CocoaPods ⇢ ❌ Xcode 44 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 45

Slide 45 text

In CocoaPods 45 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 46

Slide 46 text

In CocoaPods ⇢Released in v1.5 ⇢Mixed Swift / Objective-C libraries ⇢Objective-C & Swift can both import from Swift static libraries ⇢Just remove use_frameworks! ⇢You're ! good to go 46 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 47

Slide 47 text

Known Rough Edges ⇢Mixing (precompiled) bridging headers & modules ⇢Swift autocomplete ⇢The path of the Swift generated interface to import ⇢Too many compiler flags ⇢None of this was meant to work in this way. ⇢At all. 47 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 48

Slide 48 text

So, Samuel, if it's all so terrible, why did you add support in CocoaPods and start using it at work? 48 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 49

Slide 49 text

We didn't know what we were getting into. Honestly. 49 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 50

Slide 50 text

Swift is the Future 50 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 51

Slide 51 text

Swift is the Future Being able to write it now, and write libraries with Swift, is worth the tradeoff. It's better than developing a massive hairball or ignoring the future of  platform development. 51 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 52

Slide 52 text

What's next? 52 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018

Slide 53

Slide 53 text

Samuel Giddins @segiddins 53 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018