Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Bringing CocoaPods to Linux
Search
Boris Bügling
September 16, 2015
Programming
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Bringing CocoaPods to Linux
Talk on build systems and abstracting them inside CocoaPods. Given at NSSpain 2015. 🍷
Boris Bügling
September 16, 2015
More Decks by Boris Bügling
See All by Boris Bügling
Testing ⌚️ Apps and Other Extensions
neonichu
1
4.7k
Cross-platform Swift
neonichu
4
18k
Building better API clients in Swift
neonichu
1
350
Cross-platform Swift
neonichu
3
960
Swift Package Manager
neonichu
2
370
Swift Package Manager
neonichu
0
84
📺
neonichu
0
2k
Cross-Platform Swift
neonichu
0
140
Swift Package Manager
neonichu
6
4.4k
Other Decks in Programming
See All in Programming
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
510
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
160
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
130
Inside Stream API
skrb
1
700
Contextとはなにか
chiroruxx
1
310
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.3k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
Webフレームワークの ベンチマークについて
yusukebe
0
160
Oxcを導入して開発体験が向上した話
yug1224
4
310
スマートグラスで並列バイブコーディング
hyshu
0
130
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Paper Plane
katiecoart
PRO
1
51k
For a Future-Friendly Web
brad_frost
183
10k
Facilitating Awesome Meetings
lara
57
7k
The Curse of the Amulet
leimatthew05
1
13k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The browser strikes back
jonoalderson
0
1.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
Transcript
Bringing CocoaPods to Linux NSSpain, September 2015 Boris Bügling -
@NeoNacho
CocoaPods dependency management ✅
Contentful content management ✅
Xcode?
Agenda 4 Why? 4 Xcode's build system 4 How does
CocoaPods interact with it? 4 Alternatives 4 Plan
None
None
None
No Xcode on Linux
Xcode is broken
ya tu sabes
Quora Post from early 2014
Just two examples 4 Archiving watchOS 2.0 apps 4 CLANG_ENABLE_MODULES
[Xcode 7 beta] Linking dual (iphoneos and watchos) frameworks with
same product name causes archive to fail http://openradar.appspot.com/22392501
None
CLANG_ENABLE_MODULES
Enables the use of modules for system APIs. System headers
are imported as semantic modules instead of raw headers.
"system APIs" == any framework outside your target !
None
Bring back CocoaPods to its core and move rest (e.g.
Xcode integration) into plugins. #2729 From October 2014 https://github.com/CocoaPods/CocoaPods/issues/ 2729
Solve everyday problems for Cocoa and Xcode developers.
Let's face it, programming sucks.
Xcode's build system
4 Fairly old (Xcode3Core.ideplugin) 4 Entirely based on mtimes 4
Poorly documented
De-facto documentation 4 http://pewpewthespells.com/blog/ managing_xcode.html 4 http://pewpewthespells.com/blog/ buildsettings.html
Xcode project files !"#
Tomorrow 16:30 - 17:00 Grant Paul - Making Sense of
Xcode
How does CocoaPods interact with it?
4 Pods project 4 Integration into the user project 4
Linting
Pods project 4 Generated by our Xcodeproj gem 4 Targets
for all Pods 4 XCConfig files
Private XCConfig #include "ContentfulDeliveryAPI.xcconfig" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS =
"${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ContentfulDeliveryAPI" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bypass" "${PODS_ROOT}/Headers/Public/CGLMail" "${PODS_ROOT}/Headers/Public/ContentfulDeliveryAPI" "${PODS_ROOT}/Headers/Public/ContentfulDialogs" "${PODS_ROOT}/Headers/Public/ContentfulPersistence" "${PODS_ROOT}/Headers/Public/ContentfulStyle" "${PODS_ROOT}/Headers/Public/DDPageControl" "${PODS_ROOT}/Headers/Public/EDColor" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatter" "${PODS_ROOT}/Headers/Public/LatoFont" "${PODS_ROOT}/Headers/Public/TSMiniWebBrowser@dblock" OTHER_LDFLAGS = ${CONTENTFULDELIVERYAPI_OTHER_LDFLAGS} -ObjC PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES
Build settings 4 GCC_PREPROCESSOR_DEFINITIONS 4 HEADER_SEARCH_PATHS 4 OTHER_LDFLAGS
None
User project 4 Optional integration (--no-integrate) 4 Implicit target dependencies
4 XCConfig files
Public XCConfig CONTENTFULDELIVERYAPI_OTHER_LDFLAGS = -framework "MapKit" -framework "UIKit"
If you edit OTHER_LDFLAGS in your project, settings will be
copied.
Build phases
Linting 4 Shells out to xcodebuild
Alternatives
Makefiles
package: $(EXECUTABLE_NAME) $(INFO_PLIST) mkdir -p "$(PRODUCT_NAME).app" @/bin/echo -n 'AAPL' >
"$(PRODUCT_NAME).app/PkgInfo" @$(PLBUDDY) -c 'Print CFBundleSignature' $(INFO_PLIST) \ >> "$(PRODUCT_NAME).app/PkgInfo" cp $(EXECUTABLE_NAME) "$(PRODUCT_NAME).app" $(BASE_DIR)/sh/build_plist $(INFO_PLIST) "$(PRODUCT_NAME).app/Info.plist" $(BASE_DIR)/sh/build_ipa "$(PRODUCT_NAME).app" $(EXECUTABLE_NAME): $(OBJS) $(LD) $(CFLAGS) $(LDFLAGS) -o $@ $^
Makefiles 4 Build rules to transform files (e.g. .m =>
.o) 4 Based on mtimes 4 "Phony" rules which run unconditionally 4 Dependencies to files or other rules 4 Exists everywhere
Rules target: dependencies build step(s)
Execution make [options] [target1 target2 ...]
Buck
None
None
None
None
None
=> no more DerivedData nonsense !
Installation $ brew update $ brew tap facebook/fb $ brew
install --HEAD buck
Quickstart $ buck quickstart --type ios --dest-dir . [...] $
buck build demo_app_ios [...] $ ls buck-out/gen/ios/BuckDemoApp BuckDemoApp.app BuckDemoApp.dSYM
Initial build $ buck build demo_app_ios [...] [-] BUILDING...FINISHED 2.4s
(8/8 JOBS, 8 UPDATED, 0.0% CACHE HITS) Subsequent builds $ buck build demo_app_ios [...] [-] BUILDING...FINISHED 0.0s (1/8 JOBS, 0 UPDATED)
Faster iterations
BUCK apple_binary( [...] ) xcode_project_config( name = 'Hello', src_target =
':Hello', action_config_names={'profile': 'Profile'} )
Source files srcs = [ 'Code/AppDelegate.m' 'Code/ViewController.m', 'Code/main.m', ],
Headers headers = [ 'Code/AppDelegate.h' 'Code/ViewController.h', ],
Linked frameworks frameworks = [ '$SDKROOT/System/Library/Frameworks/Foundation.framework', '$SDKROOT/System/Library/Frameworks/UIKit.framework', ],
Dependencies deps = [ '//Libraries/EXExample:EXExample', ],
Buck does not support Swift !
Plan
Plan 4 Prototype with plugins ! 4 Abstraction for the
build system 4 Mapping for build settings (*_xcconfig attributes) 4 ??? 4 Profit!
Add a new platform
Adding a new platform (tvos)
Gemfile source 'https://rubygems.org' gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch =>
'tvos' gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git', :branch => 'tvos-support' gem 'xcodeproj', :git => 'https://github.com/CocoaPods/Xcodeproj.git', :branch => 'tvos-support' Usage: $ bundle exec pod install
Xcode is a leaky abstraction, try to learn what's underneath
it.
Thanks!
https://www.facebook.com/events/ 1495505997428211/ _ @NeoNacho
[email protected]
http://buegling.com/talks