Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bringing CocoaPods to Linux

Bringing CocoaPods to Linux

Talk on build systems and abstracting them inside CocoaPods. Given at NSSpain 2015. 🍷

Boris Bügling

September 16, 2015
Tweet

More Decks by Boris Bügling

Other Decks in Programming

Transcript

  1. Agenda 4 Why? 4 Xcode's build system 4 How does

    CocoaPods interact with it? 4 Alternatives 4 Plan
  2. [Xcode 7 beta] Linking dual (iphoneos and watchos) frameworks with

    same product name causes archive to fail http://openradar.appspot.com/22392501
  3. Enables the use of modules for system APIs. System headers

    are imported as semantic modules instead of raw headers.
  4. 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
  5. 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
  6. 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 $@ $^
  7. 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
  8. Quickstart $ buck quickstart --type ios --dest-dir . [...] $

    buck build demo_app_ios [...] $ ls buck-out/gen/ios/BuckDemoApp BuckDemoApp.app BuckDemoApp.dSYM
  9. 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)
  10. BUCK apple_binary( [...] ) xcode_project_config( name = 'Hello', src_target =

    ':Hello', action_config_names={'profile': 'Profile'} )
  11. Plan 4 Prototype with plugins ! 4 Abstraction for the

    build system 4 Mapping for build settings (*_xcconfig attributes) 4 ??? 4 Profit!
  12. 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