cocoapods-packager-mls 1.5.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +5 -0
  4. data/.rubocop-cocoapods.yml +71 -0
  5. data/.rubocop.yml +38 -0
  6. data/.travis.yml +17 -0
  7. data/Gemfile +12 -0
  8. data/Gemfile.lock +131 -0
  9. data/LICENSE +22 -0
  10. data/README.md +42 -0
  11. data/Rakefile +29 -0
  12. data/cocoapods-packager.gemspec +22 -0
  13. data/lib/cocoapods-packager/builder.rb +457 -0
  14. data/lib/cocoapods-packager/framework.rb +66 -0
  15. data/lib/cocoapods-packager/mangle.rb +32 -0
  16. data/lib/cocoapods-packager/pod_utils.rb +324 -0
  17. data/lib/cocoapods-packager/spec_builder.rb +171 -0
  18. data/lib/cocoapods-packager/symbols.rb +42 -0
  19. data/lib/cocoapods-packager/tal_installer.rb +33 -0
  20. data/lib/cocoapods-packager/tal_target_validator.rb +62 -0
  21. data/lib/cocoapods-packager/user_interface/build_failed_report.rb +15 -0
  22. data/lib/cocoapods_packager.rb +5 -0
  23. data/lib/cocoapods_plugin.rb +16 -0
  24. data/lib/pod/command/package.rb +243 -0
  25. data/scripts/lstconst.sh +9 -0
  26. data/scripts/lstsym.sh +8 -0
  27. data/spec/command/error_spec.rb +81 -0
  28. data/spec/command/package_spec.rb +420 -0
  29. data/spec/command/subspecs_spec.rb +30 -0
  30. data/spec/fixtures/Archs.podspec +13 -0
  31. data/spec/fixtures/Builder.podspec +25 -0
  32. data/spec/fixtures/CPDColors.podspec +19 -0
  33. data/spec/fixtures/FH.podspec +18 -0
  34. data/spec/fixtures/KFData.podspec +73 -0
  35. data/spec/fixtures/LibraryConsumerDemo/.gitignore +22 -0
  36. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/project.pbxproj +311 -0
  37. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  38. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/xcshareddata/xcschemes/LibraryConsumer.xcscheme +100 -0
  39. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/AppDelegate.h +17 -0
  40. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/AppDelegate.m +27 -0
  41. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/Info.plist +40 -0
  42. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/main.m +16 -0
  43. data/spec/fixtures/LibraryConsumerDemo/Podfile +5 -0
  44. data/spec/fixtures/LibraryDemo.podspec +14 -0
  45. data/spec/fixtures/LocalSources/LICENSE +0 -0
  46. data/spec/fixtures/LocalSources/LocalNikeKit.h +4 -0
  47. data/spec/fixtures/LocalSources/LocalNikeKit.m +9 -0
  48. data/spec/fixtures/LocalSources/LocalNikeKit.podspec +19 -0
  49. data/spec/fixtures/NikeKit.podspec +19 -0
  50. data/spec/fixtures/OpenSans.podspec +18 -0
  51. data/spec/fixtures/PackagerTest/.gitignore +21 -0
  52. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/project.pbxproj +507 -0
  53. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  54. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/xcshareddata/xcschemes/PackagerTest.xcscheme +110 -0
  55. data/spec/fixtures/PackagerTest/PackagerTest.xcworkspace/contents.xcworkspacedata +1 -0
  56. data/spec/fixtures/PackagerTest/PackagerTest/CPDAppDelegate.h +15 -0
  57. data/spec/fixtures/PackagerTest/PackagerTest/CPDAppDelegate.m +49 -0
  58. data/spec/fixtures/PackagerTest/PackagerTest/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  59. data/spec/fixtures/PackagerTest/PackagerTest/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  60. data/spec/fixtures/PackagerTest/PackagerTest/PackagerTest-Info.plist +38 -0
  61. data/spec/fixtures/PackagerTest/PackagerTest/PackagerTest-Prefix.pch +16 -0
  62. data/spec/fixtures/PackagerTest/PackagerTest/en.lproj/InfoPlist.strings +2 -0
  63. data/spec/fixtures/PackagerTest/PackagerTest/main.m +18 -0
  64. data/spec/fixtures/PackagerTest/PackagerTestTests/PackagerTestTests-Info.plist +22 -0
  65. data/spec/fixtures/PackagerTest/PackagerTestTests/PackagerTestTests.m +34 -0
  66. data/spec/fixtures/PackagerTest/PackagerTestTests/en.lproj/InfoPlist.strings +2 -0
  67. data/spec/fixtures/PackagerTest/Podfile +10 -0
  68. data/spec/fixtures/PackagerTest/Podfile.lock +36 -0
  69. data/spec/fixtures/Weakly.podspec +13 -0
  70. data/spec/fixtures/a.podspec +19 -0
  71. data/spec/fixtures/foo-bar.podspec +19 -0
  72. data/spec/fixtures/layer-client-messaging-schema.podspec +13 -0
  73. data/spec/integration/project_spec.rb +70 -0
  74. data/spec/spec_helper.rb +79 -0
  75. data/spec/unit/pod/utils_spec.rb +58 -0
  76. data/spec/unit/specification/builder_spec.rb +62 -0
  77. data/spec/unit/specification/spec_builder_spec.rb +61 -0
  78. data/spec/unit/user_interface/build_failed_report_spec.rb +11 -0
  79. metadata +223 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6179c1f055ede76350a7583aade0cb58f852883ee4bbac44d9039e7e44c9c854
4
+ data.tar.gz: 5d69f217b69eeb5fda2f86d58937a3b4255e556ae562ccda1b928779b42e7ada
5
+ SHA512:
6
+ metadata.gz: ecca02e909b0e1ea989571cde0ed7e1576408a8b54176c870637d2942117ba8109ca2948115e0b37c84a02ab19c7226c9648216803d9db0efac6a37442620e64
7
+ data.tar.gz: 0b8da2bd80757881252dd8384f2527456c79a8571bcdf11eb04e8659f4ec90107dafd1c6c28b2d394a2d24d286b7c6657cb0fb3a93c754d937742f3a14917bef
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ coverage
2
+ pkg
3
+ .DS_Store
4
+ .bundle/
5
+ *.gem
@@ -0,0 +1,71 @@
1
+ AllCops:
2
+ Include:
3
+ - Rakefile
4
+ - Gemfile
5
+ - ./*.gemspec
6
+ Exclude:
7
+ - spec/fixtures/**/*
8
+ - vendor/**/*
9
+
10
+ # At the moment not ready to be used
11
+ # https://github.com/bbatsov/rubocop/issues/947
12
+ Documentation:
13
+ Enabled: false
14
+
15
+ #- CocoaPods -----------------------------------------------------------------#
16
+
17
+ # We adopted raise instead of fail.
18
+ SignalException:
19
+ EnforcedStyle: only_raise
20
+
21
+ # They are idiomatic
22
+ AssignmentInCondition:
23
+ Enabled: false
24
+
25
+ # Allow backticks
26
+ AsciiComments:
27
+ Enabled: false
28
+
29
+ # Indentation clarifies logic branches in implementations
30
+ IfUnlessModifier:
31
+ Enabled: false
32
+
33
+ # No enforced convention here.
34
+ SingleLineBlockParams:
35
+ Enabled: false
36
+
37
+ # We only add the comment when needed.
38
+ Encoding:
39
+ Enabled: false
40
+
41
+ #- CocoaPods support for Ruby 1.8.7 ------------------------------------------#
42
+
43
+ HashSyntax:
44
+ EnforcedStyle: hash_rockets
45
+
46
+ Lambda:
47
+ Enabled: false
48
+
49
+ DotPosition:
50
+ EnforcedStyle: trailing
51
+
52
+ #- CocoaPods specs -----------------------------------------------------------#
53
+
54
+ # Allow for `should.match /regexp/`.
55
+ AmbiguousRegexpLiteral:
56
+ Exclude:
57
+ - spec/**/*
58
+
59
+ # Allow `object.should == object` syntax.
60
+ Void:
61
+ Exclude:
62
+ - spec/**/*
63
+
64
+ ClassAndModuleChildren:
65
+ Exclude:
66
+ - spec/**/*
67
+
68
+ UselessComparison:
69
+ Exclude:
70
+ - spec/**/*
71
+
data/.rubocop.yml ADDED
@@ -0,0 +1,38 @@
1
+ inherit_from:
2
+ - .rubocop-cocoapods.yml
3
+
4
+ #- Core -----------------------------------------------------------------------
5
+
6
+ AllCops:
7
+ Exclude:
8
+ - spec/**/*
9
+ - spec/fixtures/**/*
10
+ - vendor/**/*
11
+
12
+ Style/Tab:
13
+ Enabled: false
14
+
15
+ LineLength:
16
+ Enabled: false
17
+
18
+ ClassLength:
19
+ Enabled: false
20
+
21
+ MethodLength:
22
+ Enabled: false
23
+
24
+ Metrics/AbcSize:
25
+ Enabled: false
26
+
27
+ Metrics/CyclomaticComplexity:
28
+ Enabled: false
29
+
30
+ Metrics/PerceivedComplexity:
31
+ Enabled: false
32
+
33
+ Metrics/ParameterLists:
34
+ Enabled: false
35
+
36
+ Style/SpecialGlobalVars:
37
+ EnforcedStyle: use_perl_names
38
+
data/.travis.yml ADDED
@@ -0,0 +1,17 @@
1
+ osx_image: xcode10.1
2
+ language: objective-c
3
+ cache: bundler
4
+
5
+ before_install:
6
+ - bundle install
7
+ - bundle exec pod repo update --silent
8
+
9
+ env:
10
+ - TASK=rubocop
11
+ - TASK="rake spec:unit"
12
+ - TASK="rake spec:integration"
13
+ - TASK="rake spec:command"
14
+
15
+ script:
16
+ - bundle exec $TASK
17
+
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'bacon'
7
+ gem 'mocha-on-bacon'
8
+ gem 'mocha'
9
+ gem 'prettybacon'
10
+ gem 'coveralls', :require => false
11
+ gem 'rubocop'
12
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,131 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ cocoapods-packager-tal (1.5.0.10)
5
+ cocoapods (>= 1.5.3, < 2.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ CFPropertyList (3.0.0)
11
+ activesupport (4.2.11.1)
12
+ i18n (~> 0.7)
13
+ minitest (~> 5.1)
14
+ thread_safe (~> 0.3, >= 0.3.4)
15
+ tzinfo (~> 1.1)
16
+ ast (2.4.0)
17
+ atomos (0.1.3)
18
+ bacon (1.2.0)
19
+ claide (1.0.2)
20
+ cocoapods (1.5.3)
21
+ activesupport (>= 4.0.2, < 5)
22
+ claide (>= 1.0.2, < 2.0)
23
+ cocoapods-core (= 1.5.3)
24
+ cocoapods-deintegrate (>= 1.0.2, < 2.0)
25
+ cocoapods-downloader (>= 1.2.0, < 2.0)
26
+ cocoapods-plugins (>= 1.0.0, < 2.0)
27
+ cocoapods-search (>= 1.0.0, < 2.0)
28
+ cocoapods-stats (>= 1.0.0, < 2.0)
29
+ cocoapods-trunk (>= 1.3.0, < 2.0)
30
+ cocoapods-try (>= 1.1.0, < 2.0)
31
+ colored2 (~> 3.1)
32
+ escape (~> 0.0.4)
33
+ fourflusher (~> 2.0.1)
34
+ gh_inspector (~> 1.0)
35
+ molinillo (~> 0.6.5)
36
+ nap (~> 1.0)
37
+ ruby-macho (~> 1.1)
38
+ xcodeproj (>= 1.5.7, < 2.0)
39
+ cocoapods-core (1.5.3)
40
+ activesupport (>= 4.0.2, < 6)
41
+ fuzzy_match (~> 2.0.4)
42
+ nap (~> 1.0)
43
+ cocoapods-deintegrate (1.0.4)
44
+ cocoapods-downloader (1.2.2)
45
+ cocoapods-plugins (1.0.0)
46
+ nap
47
+ cocoapods-search (1.0.0)
48
+ cocoapods-stats (1.1.0)
49
+ cocoapods-trunk (1.3.1)
50
+ nap (>= 0.8, < 2.0)
51
+ netrc (~> 0.11)
52
+ cocoapods-try (1.1.0)
53
+ colored2 (3.1.2)
54
+ concurrent-ruby (1.1.5)
55
+ coveralls (0.8.23)
56
+ json (>= 1.8, < 3)
57
+ simplecov (~> 0.16.1)
58
+ term-ansicolor (~> 1.3)
59
+ thor (>= 0.19.4, < 2.0)
60
+ tins (~> 1.6)
61
+ docile (1.3.2)
62
+ escape (0.0.4)
63
+ fourflusher (2.0.1)
64
+ fuzzy_match (2.0.4)
65
+ gh_inspector (1.1.3)
66
+ i18n (0.9.5)
67
+ concurrent-ruby (~> 1.0)
68
+ jaro_winkler (1.5.3)
69
+ json (2.2.0)
70
+ metaclass (0.0.4)
71
+ minitest (5.11.3)
72
+ mocha (1.9.0)
73
+ metaclass (~> 0.0.1)
74
+ mocha-on-bacon (0.2.3)
75
+ mocha (>= 0.13.0)
76
+ molinillo (0.6.6)
77
+ nanaimo (0.2.6)
78
+ nap (1.1.0)
79
+ netrc (0.11.0)
80
+ parallel (1.17.0)
81
+ parser (2.6.3.0)
82
+ ast (~> 2.4.0)
83
+ prettybacon (0.0.2)
84
+ bacon (~> 1.2)
85
+ rainbow (3.0.0)
86
+ rake (12.3.2)
87
+ rubocop (0.73.0)
88
+ jaro_winkler (~> 1.5.1)
89
+ parallel (~> 1.10)
90
+ parser (>= 2.6)
91
+ rainbow (>= 2.2.2, < 4.0)
92
+ ruby-progressbar (~> 1.7)
93
+ unicode-display_width (>= 1.4.0, < 1.7)
94
+ ruby-macho (1.4.0)
95
+ ruby-progressbar (1.10.1)
96
+ simplecov (0.16.1)
97
+ docile (~> 1.1)
98
+ json (>= 1.8, < 3)
99
+ simplecov-html (~> 0.10.0)
100
+ simplecov-html (0.10.2)
101
+ term-ansicolor (1.7.1)
102
+ tins (~> 1.0)
103
+ thor (0.20.3)
104
+ thread_safe (0.3.6)
105
+ tins (1.21.1)
106
+ tzinfo (1.2.5)
107
+ thread_safe (~> 0.1)
108
+ unicode-display_width (1.6.0)
109
+ xcodeproj (1.11.0)
110
+ CFPropertyList (>= 2.3.3, < 4.0)
111
+ atomos (~> 0.1.3)
112
+ claide (>= 1.0.2, < 2.0)
113
+ colored2 (~> 3.1)
114
+ nanaimo (~> 0.2.6)
115
+
116
+ PLATFORMS
117
+ ruby
118
+
119
+ DEPENDENCIES
120
+ bacon
121
+ bundler (~> 1.3)
122
+ cocoapods-packager-tal!
123
+ coveralls
124
+ mocha
125
+ mocha-on-bacon
126
+ prettybacon
127
+ rake
128
+ rubocop
129
+
130
+ BUNDLED WITH
131
+ 1.17.3
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ This project is licensed under the MIT license.
2
+
3
+ Copyright (c) 2014 Kyle Fuller, Boris Bügling and CocoaPods Dev Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # CocoaPods Packager
2
+
3
+ [![Build Status](http://img.shields.io/travis/CocoaPods/cocoapods-packager/master.svg?style=flat)](https://travis-ci.org/CocoaPods/cocoapods-packager)
4
+ [![Coverage Status](https://img.shields.io/coveralls/CocoaPods/cocoapods-packager.svg)](https://coveralls.io/r/CocoaPods/cocoapods-packager?branch=master)
5
+ [![Gem Version](http://img.shields.io/gem/v/cocoapods-packager.svg?style=flat)](http://badge.fury.io/rb/cocoapods-packager)
6
+ [![Code Climate](http://img.shields.io/codeclimate/github/CocoaPods/cocoapods-packager.svg?style=flat)](https://codeclimate.com/github/CocoaPods/cocoapods-packager)
7
+
8
+ CocoaPods plugin which allows you to generate a framework or static library from a podspec.
9
+
10
+ This plugin is for CocoaPods *developers*, who need to distribute their Pods not only via CocoaPods, but also as frameworks or static libraries for people who do not use Pods.
11
+
12
+ ## Why should I use Pods if I'm targeting developers who don't use Pods?
13
+
14
+ There are still a number of advantages to developing against a `podspec`, even if your public distribution is closed-source:
15
+
16
+ 1. You can easily use the Pod in-house in an open-source style. This makes step-by-step debugging and multi-project development a breeze.
17
+ 2. You can pull in third-party dependencies using CocoaPods. (CocoaPods Packager is even capable of mangling symbols to improve compatibility with any symbols that might appear in the integrating app.)
18
+ 3. You can declaratively specify build settings (e.g. frameworks, compiler flags) in your `podspec`. This is easier to maintain and replicate than build settings embedded in your Xcode project.
19
+
20
+ ## Installation
21
+
22
+ ```sh
23
+ $ gem install cocoapods-packager-mls
24
+ ```
25
+
26
+ or add a line to your Gemfile:
27
+
28
+ ```ruby
29
+ gem "cocoapods-packager-mls"
30
+ ```
31
+
32
+ then run `bundle install`.
33
+
34
+ This installs Packager as a CocoaPods plugin.
35
+
36
+ ## Usage
37
+
38
+ ```bash
39
+ $ pod package KFData.podspec
40
+ ```
41
+
42
+ See also `pod --help`.
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ def specs(dir)
4
+ FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ')
5
+ end
6
+
7
+ namespace :spec do
8
+ desc 'Runs the unit specs'
9
+ task :unit do
10
+ sh "bundle exec bacon #{specs('unit/**')}"
11
+ end
12
+
13
+ desc 'Runs the integration specs'
14
+ task :integration do
15
+ sh "bundle exec bacon #{specs('integration/**')}"
16
+ end
17
+
18
+ desc 'Runs the command specs'
19
+ task :command do
20
+ sh "bundle exec bacon #{specs('command/**')}"
21
+ end
22
+
23
+ desc 'Runs all the specs'
24
+ task :all do
25
+ sh "bundle exec bacon #{specs('**')}"
26
+ end
27
+ end
28
+
29
+ task :default => 'spec:all'
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cocoapods_packager.rb'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'cocoapods-packager-mls'
8
+ spec.version = Pod::Packager::VERSION
9
+ spec.authors = ['Kyle Fuller', 'Boris Bügling']
10
+ spec.summary = 'CocoaPods plugin which allows you to generate a framework or static library from a podspec.'
11
+ spec.homepage = 'https://github.com/Minlison/cocoapods-packager.git'
12
+ spec.license = 'MIT'
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_dependency "cocoapods", '>= 1.5.3', '< 2.0'
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ end
@@ -0,0 +1,457 @@
1
+ module Pod
2
+ class Builder
3
+ def initialize(platform, static_installer, source_dir, static_sandbox_root, dynamic_sandbox_root, public_headers_root, spec, embedded, mangle, dynamic, config, bundle_identifier, exclude_deps, xcconfig = nil, force_enable_module = false)
4
+ @platform = platform
5
+ @static_installer = static_installer
6
+ @source_dir = source_dir
7
+ @static_sandbox_root = static_sandbox_root
8
+ @dynamic_sandbox_root = dynamic_sandbox_root
9
+ @public_headers_root = public_headers_root
10
+ @spec = spec
11
+ @embedded = embedded
12
+ @mangle = mangle
13
+ @dynamic = dynamic
14
+ @config = config
15
+ @xcconfig = xcconfig
16
+ @bundle_identifier = bundle_identifier
17
+ @exclude_deps = exclude_deps
18
+ @force_enable_module = force_enable_module
19
+
20
+ @file_accessors = @static_installer.pod_targets.select { |t| t.pod_name == @spec.name }.flat_map(&:file_accessors)
21
+ end
22
+
23
+ def build(package_type)
24
+ case package_type
25
+ when :static_library
26
+ build_static_library
27
+ when :static_framework
28
+ build_static_framework
29
+ when :dynamic_framework
30
+ build_dynamic_framework
31
+ end
32
+ end
33
+
34
+ def build_static_library
35
+ UI.puts("Building static library #{@spec} with configuration #{@config}")
36
+
37
+ defines = compile
38
+ build_sim_libraries(defines)
39
+
40
+ platform_path = Pathname.new(@platform.name.to_s)
41
+ platform_path.mkdir unless platform_path.exist?
42
+
43
+ output = platform_path + "lib#{@spec.name}.a"
44
+
45
+ if @platform.name == :ios
46
+ build_static_library_for_ios(output)
47
+ else
48
+ build_static_library_for_mac(output)
49
+ end
50
+ end
51
+
52
+ def build_static_framework
53
+ UI.puts("Building static framework #{@spec} with configuration #{@config}")
54
+
55
+ defines = compile
56
+ build_sim_libraries(defines)
57
+
58
+ create_framework
59
+ output = @fwk.versions_path + Pathname.new(@spec.name)
60
+
61
+ if @platform.name == :ios
62
+ build_static_library_for_ios(output)
63
+ else
64
+ build_static_library_for_mac(output)
65
+ end
66
+
67
+ copy_headers
68
+ copy_license
69
+ copy_resources
70
+ end
71
+
72
+ def link_embedded_resources
73
+ target_path = @fwk.root_path + Pathname.new('Resources')
74
+ target_path.mkdir unless target_path.exist?
75
+
76
+ Dir.glob(@fwk.resources_path.to_s + '/*').each do |resource|
77
+ resource = Pathname.new(resource).relative_path_from(target_path)
78
+ `ln -sf #{resource} #{target_path}`
79
+ end
80
+ end
81
+
82
+ def build_dynamic_framework
83
+ UI.puts("Building dynamic framework #{@spec} with configuration #{@config}")
84
+
85
+ defines = compile
86
+ build_sim_libraries(defines)
87
+
88
+ if @bundle_identifier
89
+ defines = "#{defines} PRODUCT_BUNDLE_IDENTIFIER='#{@bundle_identifier}'"
90
+ end
91
+
92
+ output = "#{@dynamic_sandbox_root}/build/#{@spec.name}.framework/#{@spec.name}"
93
+
94
+ clean_directory_for_dynamic_build
95
+ if @platform.name == :ios
96
+ build_dynamic_framework_for_ios(defines, output)
97
+ else
98
+ build_dynamic_framework_for_mac(defines, output)
99
+ end
100
+
101
+ copy_resources
102
+ end
103
+
104
+ def build_dynamic_framework_for_ios(defines, output)
105
+ # Specify frameworks to link and search paths
106
+ linker_flags = static_linker_flags_in_sandbox
107
+ defines = "#{defines} OTHER_LDFLAGS='$(inherited) #{linker_flags.join(' ')}'"
108
+
109
+ # Build Target Dynamic Framework for both device and Simulator
110
+ device_defines = "#{defines} LIBRARY_SEARCH_PATHS=\"#{Dir.pwd}/#{@static_sandbox_root}/build\""
111
+ device_options = ios_build_options << ' -sdk iphoneos'
112
+ xcodebuild(device_defines, device_options, 'build', @spec.name.to_s, @dynamic_sandbox_root.to_s)
113
+
114
+ sim_defines = "#{defines} LIBRARY_SEARCH_PATHS=\"#{Dir.pwd}/#{@static_sandbox_root}/build-sim\" ONLY_ACTIVE_ARCH=NO"
115
+ xcodebuild(sim_defines, '-sdk iphonesimulator', 'build-sim', @spec.name.to_s, @dynamic_sandbox_root.to_s)
116
+
117
+ # Combine architectures
118
+ `lipo #{@dynamic_sandbox_root}/build/#{@spec.name}.framework/#{@spec.name} #{@dynamic_sandbox_root}/build-sim/#{@spec.name}.framework/#{@spec.name} -create -output #{output}`
119
+
120
+ FileUtils.mkdir(@platform.name.to_s)
121
+ `mv #{@dynamic_sandbox_root}/build/#{@spec.name}.framework #{@platform.name}`
122
+ `mv #{@dynamic_sandbox_root}/build/#{@spec.name}.framework.dSYM #{@platform.name}`
123
+ end
124
+
125
+ def build_dynamic_framework_for_mac(defines, _output)
126
+ # Specify frameworks to link and search paths
127
+ linker_flags = static_linker_flags_in_sandbox
128
+ defines = "#{defines} OTHER_LDFLAGS=\"#{linker_flags.join(' ')}\""
129
+
130
+ # Build Target Dynamic Framework for osx
131
+ defines = "#{defines} LIBRARY_SEARCH_PATHS=\"#{Dir.pwd}/#{@static_sandbox_root}/build\""
132
+ xcodebuild(defines, nil, 'build', @spec.name.to_s, @dynamic_sandbox_root.to_s)
133
+
134
+ FileUtils.mkdir(@platform.name.to_s)
135
+ `mv #{@dynamic_sandbox_root}/build/#{@spec.name}.framework #{@platform.name}`
136
+ `mv #{@dynamic_sandbox_root}/build/#{@spec.name}.framework.dSYM #{@platform.name}`
137
+ end
138
+
139
+ def build_sim_libraries(defines)
140
+ if @platform.name == :ios
141
+ xcodebuild(defines, '-sdk iphonesimulator', 'build-sim')
142
+ end
143
+ end
144
+
145
+ def build_static_library_for_ios(output)
146
+ static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-sim') + vendored_libraries
147
+ libs = ios_architectures.map do |arch|
148
+ library = "#{@static_sandbox_root}/build/package-#{arch}.a"
149
+ `libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
150
+ library
151
+ end
152
+
153
+ `lipo -create -output #{output} #{libs.join(' ')}`
154
+ end
155
+
156
+ def build_static_library_for_mac(output)
157
+ static_libs = static_libs_in_sandbox + vendored_libraries
158
+ `libtool -static -o #{output} #{static_libs.join(' ')}`
159
+ end
160
+
161
+ def build_with_mangling(options)
162
+ UI.puts 'Mangling symbols'
163
+ defines = Symbols.mangle_for_pod_dependencies(@spec.name, @static_sandbox_root)
164
+ defines << ' ' << @spec.consumer(@platform).compiler_flags.join(' ')
165
+
166
+ UI.puts 'Building mangled framework'
167
+ xcodebuild(defines, options)
168
+ defines
169
+ end
170
+
171
+ def clean_directory_for_dynamic_build
172
+ # Remove static headers to avoid duplicate declaration conflicts
173
+ FileUtils.rm_rf("#{@static_sandbox_root}/Headers/Public/#{@spec.name}")
174
+ FileUtils.rm_rf("#{@static_sandbox_root}/Headers/Private/#{@spec.name}")
175
+
176
+ # Equivalent to removing derrived data
177
+ FileUtils.rm_rf('Pods/build')
178
+ end
179
+
180
+ def compile
181
+ defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'"
182
+ defines << ' ' << @spec.consumer(@platform).compiler_flags.join(' ')
183
+ # not used
184
+ # info_file_path = @static_sandbox_root
185
+ # if @dynamic
186
+ # info_file_path = @dynamic_sandbox_root
187
+ # end
188
+ # info_file_path += "/Target Support Files/Pods-packager/Info.plist"
189
+ # info_file = Pod::Generator::InfoPlistFile.new(@spec.version, @platform)
190
+ # info_file.save_as(Pathname.new(info_file_path))
191
+ # defines << "INFOPLIST_FILE=Target\\ Support\\ Files/Pods-packager/Info.plist"
192
+ # not used
193
+ if @platform.name == :ios
194
+ options = ios_build_options
195
+ end
196
+
197
+ xcodebuild(defines, options)
198
+
199
+ if @mangle
200
+ return build_with_mangling(options)
201
+ end
202
+
203
+ defines
204
+ end
205
+
206
+ def create_module_header_if_enabled
207
+ if @force_enable_module
208
+ headers_source_root = "#{@public_headers_root}/#{@spec.name}"
209
+ framework_headers = []
210
+ normal_headers = []
211
+ Dir.glob("#{headers_source_root}/**/*.h").each { |h|
212
+ header_import_name = File.basename(h)
213
+ framework_headers << "#import <#{@spec.name}/#{header_import_name}>"
214
+ normal_headers << "#import \"#{header_import_name}\""
215
+ }
216
+ module_header = <<HEADER
217
+ #ifdef __OBJC__
218
+ #import <UIKit/UIKit.h>
219
+ #else
220
+ #ifndef FOUNDATION_EXPORT
221
+ #if defined(__cplusplus)
222
+ #define FOUNDATION_EXPORT extern "C"
223
+ #else
224
+ #define FOUNDATION_EXPORT extern
225
+ #endif
226
+ #endif
227
+ #endif
228
+
229
+ static NSString *const #{@spec.name}VersionString = @"#{@spec.version}";
230
+ static double const #{@spec.name}VersionNumber = #{@spec.version.to_s.to_f};
231
+
232
+ #if __has_include(<#{@spec.name}/#{@spec.name}.h>)
233
+ #{framework_headers.join("\n")}
234
+ #else
235
+ #{normal_headers.join("\n")}
236
+ #endif
237
+ HEADER
238
+ File.write("#{@fwk.headers_path}/#{@spec.name}.h", module_header)
239
+ end
240
+ end
241
+
242
+ def copy_headers
243
+ headers_source_root = "#{@public_headers_root}/#{@spec.name}"
244
+
245
+ Dir.glob("#{headers_source_root}/**/*.h").
246
+ each { |h| `ditto #{h} #{@fwk.headers_path}/#{h.sub(headers_source_root, '')}` }
247
+
248
+ # If custom 'module_map' is specified add it to the framework distribution
249
+ # otherwise check if a header exists that is equal to 'spec.name', if so
250
+ # create a default 'module_map' one using it.
251
+ if !@spec.module_map.nil?
252
+ module_map_file = @file_accessors.flat_map(&:module_map).first
253
+ module_map = File.read(module_map_file) if Pathname(module_map_file).exist?
254
+ elsif File.exist?("#{@public_headers_root}/#{@spec.name}/#{@spec.name}.h") || @force_enable_module
255
+ module_map = <<MAP
256
+ framework module #{@spec.name} {
257
+ umbrella header "#{@spec.name}.h"
258
+
259
+ export *
260
+ module * { export * }
261
+ }
262
+ MAP
263
+ end
264
+
265
+ create_module_header_if_enabled
266
+
267
+ unless module_map.nil?
268
+ @fwk.module_map_path.mkpath unless @fwk.module_map_path.exist?
269
+ File.write("#{@fwk.module_map_path}/module.modulemap", module_map)
270
+ end
271
+ end
272
+
273
+ def copy_license
274
+ license_file = @spec.license[:file] || 'LICENSE'
275
+ license_file = Pathname.new("#{@static_sandbox_root}/#{@spec.name}/#{license_file}")
276
+ FileUtils.cp(license_file, '.') if license_file.exist?
277
+ end
278
+
279
+ def copy_vendored_libs
280
+
281
+ if @dynamic
282
+ else
283
+ vendored_frameworks = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
284
+ expand_paths(spec.consumer(@platform).vendored_frameworks)
285
+ end.compact.uniq
286
+
287
+ if vendored_frameworks.count > 0
288
+ vendored_frameworks_path = "ios"
289
+ if !File.exist?(vendored_frameworks_path)
290
+ FileUtils.mkdir_p vendored_frameworks_path
291
+ end
292
+ `cp -rp #{vendored_frameworks.join(' ')} #{vendored_frameworks_path}`
293
+ end
294
+
295
+ vendored_libraries = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
296
+ expand_paths(spec.consumer(@platform).vendored_libraries)
297
+ end.compact.uniq
298
+
299
+ if vendored_libraries.count > 0
300
+ vendored_libraries_path = "ios"
301
+ if !File.exist?(vendored_libraries_path)
302
+ FileUtils.mkdir_p vendored_libraries_path
303
+ end
304
+ `cp -rp #{vendored_libraries.join(' ')} #{vendored_libraries_path}`
305
+ end
306
+ end
307
+ end
308
+
309
+ def copy_resources
310
+ copy_vendored_libs
311
+ bundles = Dir.glob("#{@static_sandbox_root}/build/*.bundle")
312
+ if @dynamic
313
+ resources_path = "ios/#{@spec.name}.framework"
314
+ `cp -rp #{@static_sandbox_root}/build/*.bundle #{resources_path} 2>&1`
315
+ else
316
+ `cp -rp #{@static_sandbox_root}/build/*.bundle #{@fwk.resources_path} 2>&1`
317
+ dependency_names = @static_installer.podfile.dependencies.map(&:name)
318
+ resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
319
+ if (dependency_names & [spec.name, @spec.name]).any?
320
+ expand_paths(spec.consumer(@platform).resources)
321
+ end
322
+ end.compact.uniq
323
+ if resources.count > 0
324
+ `cp -rp #{resources.join(' ')} #{@fwk.resources_path}`
325
+ end
326
+ end
327
+ end
328
+
329
+ def create_framework
330
+ @fwk = Framework::Tree.new(@spec.name, @platform.name.to_s, @embedded)
331
+ @fwk.make
332
+ end
333
+
334
+ def dependency_count
335
+ count = @spec.dependencies.count
336
+
337
+ @spec.subspecs.each do |subspec|
338
+ count += subspec.dependencies.count
339
+ end
340
+
341
+ count
342
+ end
343
+
344
+ def expand_paths(path_specs)
345
+ path_specs.map do |path_spec|
346
+ Dir.glob(File.join(@source_dir, path_spec))
347
+ end
348
+ end
349
+
350
+ def static_libs_in_sandbox(build_dir = 'build')
351
+ if @exclude_deps
352
+ UI.puts 'Excluding dependencies'
353
+ Dir.glob("#{@static_sandbox_root}/#{build_dir}/lib#{@spec.name}.a")
354
+ else
355
+ Dir.glob("#{@static_sandbox_root}/#{build_dir}/lib*.a")
356
+ end
357
+ end
358
+
359
+ def vendored_libraries
360
+ if @vendored_libraries
361
+ @vendored_libraries
362
+ end
363
+ file_accessors = if @exclude_deps
364
+ @file_accessors
365
+ else
366
+ @static_installer.pod_targets.flat_map(&:file_accessors)
367
+ end
368
+ libs = file_accessors.flat_map(&:vendored_static_frameworks).map { |f| f + f.basename('.*') } || []
369
+ libs += file_accessors.flat_map(&:vendored_static_libraries)
370
+ @vendored_libraries = libs.compact.map(&:to_s)
371
+ @vendored_libraries
372
+ end
373
+
374
+ def static_linker_flags_in_sandbox
375
+ linker_flags = static_libs_in_sandbox.map do |lib|
376
+ lib.slice!('lib')
377
+ lib_flag = lib.chomp('.a').split('/').last
378
+ "-l#{lib_flag}"
379
+ end
380
+ linker_flags.reject { |e| e == "-l#{@spec.name}" || e == '-lPods-packager' }
381
+ end
382
+
383
+ def ios_build_options
384
+ "ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
385
+ end
386
+
387
+ def ios_architectures
388
+ archs = %w(x86_64 i386 arm64 armv7 armv7s)
389
+ vendored_libraries.each do |library|
390
+ archs = `lipo -info #{library}`.split & archs
391
+ end
392
+ archs
393
+ end
394
+
395
+ def xcodebuild(defines = '', args = '', build_dir = 'build', target = 'Pods-packager', project_root = @static_sandbox_root, config = @config)
396
+ if defined?(Pod::DONT_CODESIGN)
397
+ args = "#{args} CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO"
398
+ end
399
+ #
400
+ command = "xcodebuild #{defines} #{args}"
401
+ command += " CONFIGURATION_BUILD_DIR=#{build_dir} GENERATE_MASTER_OBJECT_FILE=NO"
402
+
403
+ if @dynamic
404
+ archive_path = "#{build_dir}/archive/#{config}"
405
+ if !File.exist?(archive_path)
406
+ FileUtils.mkdir_p(archive_path)
407
+ end
408
+ command += " -archivePath #{archive_path}/#{target}.xcarchive"
409
+
410
+ dsym_path = "#{build_dir}/dsym/#{config}"
411
+ if !File.exist?(dsym_path)
412
+ FileUtils.mkdir_p(dsym_path)
413
+ end
414
+ command += " DEBUG_INFORMATION_FORMAT=\"dwarf-with-dsym\""
415
+ command += " DWARF_DSYM_FOLDER_PATH=#{dsym_path}"
416
+ command += " DWARF_DSYM_FILE_NAME=#{target}.dSYM"
417
+
418
+ driver_path = "#{build_dir}/driver/#{config}"
419
+ if !File.exist?(driver_path)
420
+ FileUtils.mkdir_p(driver_path)
421
+ end
422
+ command += " -derivedDataPath=#{driver_path}"
423
+ end
424
+
425
+ command += " clean build -configuration #{config}"
426
+ command += " -target #{target}"
427
+ command += " -UseNewBuildSystem=NO"
428
+
429
+ if !@xcconfig.nil? && File.exist?(@xcconfig)
430
+ command += " -xcconfig #{@xcconfig}"
431
+ end
432
+
433
+ command += " -project #{project_root}/Pods.xcodeproj"
434
+
435
+
436
+ command += " 2>&1"
437
+ puts "===== build command ======"
438
+ puts command
439
+ puts "===== build command ======"
440
+ # command = "xcodebuild #{defines} #{args} GENERATE_MASTER_OBJECT_FILE=YES CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{config} -target #{target} -project #{project_root}/Pods.xcodeproj 2>&1"
441
+ # command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{config} -target #{target} -project #{project_root}/Pods.xcodeproj > #{Dir.pwd}/build.log 2>&1"
442
+
443
+ output = `#{command}`.lines.to_a
444
+
445
+ if $?.exitstatus != 0
446
+ puts UI::BuildFailedReport.report(command, output)
447
+
448
+ # Note: We use `Process.exit` here because it fires a `SystemExit`
449
+ # exception, which gives the caller a chance to clean up before the
450
+ # process terminates.
451
+ #
452
+ # See http://ruby-doc.org/core-1.9.3/Process.html#method-c-exit
453
+ Process.exit
454
+ end
455
+ end
456
+ end
457
+ end