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
0
1.1k
Bringing CocoaPods to Linux
Talk on build systems and abstracting them inside CocoaPods. Given at NSSpain 2015. 🍷
Boris Bügling
September 16, 2015
Tweet
Share
More Decks by Boris Bügling
See All by Boris Bügling
Testing ⌚️ Apps and Other Extensions
neonichu
1
4.6k
Cross-platform Swift
neonichu
4
18k
Building better API clients in Swift
neonichu
1
300
Cross-platform Swift
neonichu
3
910
Swift Package Manager
neonichu
2
330
Swift Package Manager
neonichu
0
53
📺
neonichu
0
2k
Cross-Platform Swift
neonichu
0
85
Swift Package Manager
neonichu
6
4.3k
Other Decks in Programming
See All in Programming
CursorとDevinが仲間!?AI駆動で新規プロダクト開発に挑んだ3ヶ月を振り返る / A Story of New Product Development with Cursor and Devin
rkaga
5
1.3k
AIコーディングの理想と現実
tomohisa
38
40k
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
120
Storybookの情報をMCPサーバー化する
shota_tech
3
1.4k
リアーキテクチャの現場で向き合う 既存サービスの読み解きと設計判断
ymiyamu
0
140
generative-ai-use-cases(GenU)の推しポイント ~2025年4月版~
hideg
1
430
ビカム・ア・コパイロット
ymd65536
1
160
OpenTelemetryで始めるベンダーフリーなobservability / Vendor-free observability starting with OpenTelemetry
seike460
PRO
0
120
Instrumentsを使用した アプリのパフォーマンス向上方法
hinakko
0
250
VitestのIn-Source Testingが便利
taro28
9
2.5k
파급효과: From AI to Android Development
l2hyunwoo
0
170
Road to Ruby for A Linguistics Nerd
hayat01sh1da
PRO
0
370
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
The Cost Of JavaScript in 2023
addyosmani
49
7.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.7k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Scaling GitHub
holman
459
140k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Facilitating Awesome Meetings
lara
54
6.4k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
The Invisible Side of Design
smashingmag
299
50k
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