motion-pods 0.9.0
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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +148 -0
- data/lib/motion-pods.rb +40 -0
- data/lib/motion/cocoapods/main.rb +404 -0
- data/lib/motion/pods/main.rb +404 -0
- data/lib/motion/pods/version.rb +29 -0
- data/lib/motion/project/monkeypatches.rb +56 -0
- data/lib/tasks/pod.rb +74 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2ada6ff4d269e04e5ef9bd2ede61b10232aeabec
|
4
|
+
data.tar.gz: 3bbd3158532a32ad3dadc55715e0d27c334f0ed4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 77f2c28c6ef48cd0589456b58f4b3721506483279f550db6fafbae44f6e8d16a36da3d83b6f3b286023611d1541a863a7f04374473ceff4d61f76818a0d65271
|
7
|
+
data.tar.gz: 3c5ee632d125711e0ad98b89b6489dfbc7f4ad35cf70c1664a43c2e1523657a7efef095d7fb34a1c036592d0e937fcf18441ff7cdedbe3339580677e1148c0e6
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012-2015, HipByte (lrz@hipbyte.com) and contributors.
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
14
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
15
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
16
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
17
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
18
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
19
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
20
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
21
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
22
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
# motion-pods
|
2
|
+
[](https://rubygems.org/gems/motion-pods)
|
3
|
+
[](https://travis-ci.org/jbender/motion-pods)
|
4
|
+
[](https://codeclimate.com/github/jbender/motion-pods)
|
5
|
+
|
6
|
+
A fork of [motion-cocoapods](https://github.com/HipByte/motion-cocoapods), motion-pods allows RubyMotion projects to integrate with the
|
7
|
+
[CocoaPods](https://cocoapods.org/) dependency manager.
|
8
|
+
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
```
|
13
|
+
$ [sudo] gem install motion-pods
|
14
|
+
```
|
15
|
+
|
16
|
+
Or if you use Bundler:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
gem 'motion-pods'
|
20
|
+
```
|
21
|
+
|
22
|
+
|
23
|
+
## Setup
|
24
|
+
|
25
|
+
1. Edit the `Rakefile` of your RubyMotion project and add the following require
|
26
|
+
line:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
require 'rubygems'
|
30
|
+
require 'motion-pods'
|
31
|
+
```
|
32
|
+
|
33
|
+
2. Still in the `Rakefile`, set your dependencies using the same language as
|
34
|
+
you would do in [Podfiles](https://guides.cocoapods.org/syntax/podfile.html).
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Motion::Project::App.setup do |app|
|
38
|
+
# ...
|
39
|
+
app.pods do
|
40
|
+
pod 'AFNetworking'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
3. If this is the first time using CocoaPods on your machine, you'll need to
|
46
|
+
let CocoaPods do some setup work with the following command:
|
47
|
+
|
48
|
+
```
|
49
|
+
$ [bundle exec] pod setup
|
50
|
+
```
|
51
|
+
|
52
|
+
|
53
|
+
## Tasks
|
54
|
+
|
55
|
+
To tell motion-pods to download your dependencies, run the following rake
|
56
|
+
task:
|
57
|
+
|
58
|
+
```
|
59
|
+
$ [bundle exec] rake pod:install
|
60
|
+
```
|
61
|
+
|
62
|
+
That’s all. The build system will properly download the given pods and their
|
63
|
+
dependencies. On the next build of your application it will pod the pods and
|
64
|
+
link them to your application executable.
|
65
|
+
|
66
|
+
If the `vendor/Podfile.lock` file exists, this will be used to install specific
|
67
|
+
versions. To update the versions, use the following rake task:
|
68
|
+
|
69
|
+
```
|
70
|
+
$ [bundle exec] rake pod:update
|
71
|
+
```
|
72
|
+
|
73
|
+
## Options
|
74
|
+
|
75
|
+
If necessary, you can pass `vendor_project` options to the `pods` configuration
|
76
|
+
method. These options are described [here](http://www.rubymotion.com/developer-center/guides/project-management/#_vendoring_3rd_party_libraries).
|
77
|
+
For instance, to only generate BridgeSupport metadata for a single pod, which
|
78
|
+
might be needed if a dependency that you’re not using directly is causing issues
|
79
|
+
(such as C++ headers), you can specify that like so:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Motion::Project::App.setup do |app|
|
83
|
+
app.pods :headers_dir => 'Headers/AFNetworking' do
|
84
|
+
pod 'AFNetworking'
|
85
|
+
# ...
|
86
|
+
end
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
By default the output of CocoaPods doing its work is silenced. If, however, you
|
91
|
+
would like to see the output, you can set the `COCOAPODS_VERBOSE` env variable:
|
92
|
+
|
93
|
+
```
|
94
|
+
$ [bundle exec] rake pod:install COCOAPODS_VERBOSE=1
|
95
|
+
```
|
96
|
+
|
97
|
+
As part of the install and update tasks, the specification repostories will get
|
98
|
+
updated. You can disable this with the `COCOAPODS_NO_REPO_UPDATE` env variable:
|
99
|
+
|
100
|
+
```
|
101
|
+
$ [bundle exec] rake pod:install COCOAPODS_NO_REPO_UPDATE=1
|
102
|
+
```
|
103
|
+
|
104
|
+
|
105
|
+
## Contribute
|
106
|
+
|
107
|
+
1. Setup a local development environment.
|
108
|
+
|
109
|
+
```
|
110
|
+
$ git clone git://github.com/jbender/motion-pods.git
|
111
|
+
$ cd motion-pods
|
112
|
+
$ [bundle exec] rake bootstrap
|
113
|
+
```
|
114
|
+
|
115
|
+
2. Verify that all the tests are passing.
|
116
|
+
|
117
|
+
```
|
118
|
+
$ [bundle exec] rake spec
|
119
|
+
```
|
120
|
+
|
121
|
+
3. Create your patch and send a
|
122
|
+
[pull-request](https://help.github.com/send-pull-requests/).
|
123
|
+
|
124
|
+
|
125
|
+
## License
|
126
|
+
|
127
|
+
Copyright (c) 2012-2015, HipByte (lrz@hipbyte.com) and contributors.
|
128
|
+
All rights reserved.
|
129
|
+
|
130
|
+
Redistribution and use in source and binary forms, with or without
|
131
|
+
modification, are permitted provided that the following conditions are met:
|
132
|
+
|
133
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
134
|
+
list of conditions and the following disclaimer.
|
135
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
136
|
+
this list of conditions and the following disclaimer in the documentation
|
137
|
+
and/or other materials provided with the distribution.
|
138
|
+
|
139
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
140
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
141
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
142
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
143
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
144
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
145
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
146
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
147
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
148
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/lib/motion-pods.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Copyright (c) 2012, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
unless defined?(Motion::Project::Config)
|
26
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
27
|
+
end
|
28
|
+
|
29
|
+
# External dependencies
|
30
|
+
require 'xcodeproj'
|
31
|
+
require 'cocoapods'
|
32
|
+
require 'yaml'
|
33
|
+
|
34
|
+
# Gem files
|
35
|
+
require 'motion/pods/version'
|
36
|
+
require 'motion/pods/main'
|
37
|
+
require 'tasks/pod'
|
38
|
+
|
39
|
+
# Monkeypatch Motion::Project to add CocoaPod methods
|
40
|
+
require 'motion/project/monkeypatches'
|
@@ -0,0 +1,404 @@
|
|
1
|
+
# Copyright (c) 2012-2014, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
module Motion
|
26
|
+
class CocoaPods
|
27
|
+
PODS_ROOT = 'vendor/Pods'
|
28
|
+
TARGET_NAME = 'RubyMotion'
|
29
|
+
PUBLIC_HEADERS_ROOT = File.join(PODS_ROOT, 'Headers/Public')
|
30
|
+
PODS_ROOT_MATCHER = /(\$\(PODS_ROOT\))|(\$\{PODS_ROOT\})/
|
31
|
+
SUPPORT_FILES = File.join(PODS_ROOT, "Target Support Files/Pods-#{TARGET_NAME}")
|
32
|
+
|
33
|
+
attr_accessor :podfile
|
34
|
+
|
35
|
+
def initialize(config, vendor_options)
|
36
|
+
@config = config
|
37
|
+
@vendor_options = vendor_options
|
38
|
+
|
39
|
+
platform =
|
40
|
+
case @config.deploy_platform
|
41
|
+
when 'MacOSX' then :osx
|
42
|
+
when 'iPhoneOS' then :ios
|
43
|
+
when 'AppleTVOS' then :tvos
|
44
|
+
when 'WatchOS' then :watchos
|
45
|
+
else App.fail "Unknown CocoaPods platform: #{@config.deploy_platform}"
|
46
|
+
end
|
47
|
+
|
48
|
+
@podfile = Pod::Podfile.new(Pathname.new(Rake.original_dir) + 'Rakefile') {}
|
49
|
+
@podfile.platform(platform, config.deployment_target)
|
50
|
+
@podfile.target(TARGET_NAME)
|
51
|
+
cocoapods_config.podfile = @podfile
|
52
|
+
cocoapods_config.skip_repo_update = true
|
53
|
+
cocoapods_config.installation_root = Pathname.new(File.expand_path(config.project_dir)) + 'vendor'
|
54
|
+
|
55
|
+
if cocoapods_config.verbose = !!ENV["COCOAPODS_VERBOSE"]
|
56
|
+
require 'claide'
|
57
|
+
end
|
58
|
+
|
59
|
+
configure_project
|
60
|
+
end
|
61
|
+
|
62
|
+
# Adds the Pods project to the RubyMotion config as a vendored project and
|
63
|
+
#
|
64
|
+
def configure_project
|
65
|
+
@config.resources_dirs << resources_dir.to_s
|
66
|
+
|
67
|
+
# TODO: replace this all once Xcodeproj has the proper xcconfig parser.
|
68
|
+
return unless xcconfig_hash && ldflags
|
69
|
+
configure_xcconfig
|
70
|
+
end
|
71
|
+
|
72
|
+
# DSL
|
73
|
+
#-------------------------------------------------------------------------#
|
74
|
+
|
75
|
+
def source(source)
|
76
|
+
@podfile.source(source)
|
77
|
+
end
|
78
|
+
|
79
|
+
def pod(*name_and_version_requirements, &block)
|
80
|
+
@podfile.pod(*name_and_version_requirements, &block)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Deprecated.
|
84
|
+
def dependency(*name_and_version_requirements, &block)
|
85
|
+
@podfile.dependency(*name_and_version_requirements, &block)
|
86
|
+
end
|
87
|
+
|
88
|
+
def post_install(&block)
|
89
|
+
@podfile.post_install(&block)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Installation
|
93
|
+
#-------------------------------------------------------------------------#
|
94
|
+
|
95
|
+
def pods_installer
|
96
|
+
@installer ||= Pod::Installer.new(
|
97
|
+
cocoapods_config.sandbox,
|
98
|
+
@podfile,
|
99
|
+
cocoapods_config.lockfile
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Performs a CocoaPods Installation.
|
104
|
+
#
|
105
|
+
# For now we only support one Pods target, this will have to be expanded
|
106
|
+
# once we work on more spec support.
|
107
|
+
#
|
108
|
+
# Let RubyMotion re-generate the BridgeSupport file whenever the list of
|
109
|
+
# installed pods changes.
|
110
|
+
#
|
111
|
+
def install!(update)
|
112
|
+
pods_installer.update = update
|
113
|
+
pods_installer.installation_options.integrate_targets = false
|
114
|
+
pods_installer.install!
|
115
|
+
install_resources
|
116
|
+
copy_cocoapods_env_and_prefix_headers
|
117
|
+
end
|
118
|
+
|
119
|
+
# TODO: this probably breaks in cases like resource bundles etc, need to test.
|
120
|
+
def install_resources
|
121
|
+
FileUtils.rm_rf(resources_dir)
|
122
|
+
FileUtils.mkdir_p(resources_dir)
|
123
|
+
resources.each { |file| install_resource(file, resources_dir) }
|
124
|
+
end
|
125
|
+
|
126
|
+
def install_resource(file, resources_dir)
|
127
|
+
FileUtils.cp_r(file, resources_dir) if file.exist?
|
128
|
+
rescue ArgumentError => exc
|
129
|
+
raise unless exc.message =~ /same file/
|
130
|
+
end
|
131
|
+
|
132
|
+
def copy_cocoapods_env_and_prefix_headers
|
133
|
+
headers = Dir.glob([
|
134
|
+
"#{PODS_ROOT}/*.h",
|
135
|
+
"#{PODS_ROOT}/*.pch",
|
136
|
+
"#{PODS_ROOT}/Target Support Files/**/*.h",
|
137
|
+
"#{PODS_ROOT}/Target Support Files/**/*.pch"
|
138
|
+
])
|
139
|
+
|
140
|
+
headers.each do |header|
|
141
|
+
src = File.basename(header)
|
142
|
+
dst = src.sub(/\.pch$/, ".h")
|
143
|
+
dst_path = File.join(PUBLIC_HEADERS_ROOT, "____#{dst}")
|
144
|
+
|
145
|
+
next if File.exist?(dst_path)
|
146
|
+
|
147
|
+
FileUtils.mkdir_p(PUBLIC_HEADERS_ROOT)
|
148
|
+
FileUtils.cp(header, dst_path)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Helpers
|
153
|
+
#-------------------------------------------------------------------------#
|
154
|
+
|
155
|
+
# This is the output that gets shown in `rake config`, so it should be
|
156
|
+
# short and sweet.
|
157
|
+
#
|
158
|
+
def inspect
|
159
|
+
cocoapods_config
|
160
|
+
.lockfile
|
161
|
+
.to_hash["PODS"]
|
162
|
+
.map { |pod| pod.is_a?(Hash) ? pod.keys.first : pod }
|
163
|
+
.inspect
|
164
|
+
end
|
165
|
+
|
166
|
+
def cocoapods_config
|
167
|
+
Pod::Config.instance
|
168
|
+
end
|
169
|
+
|
170
|
+
def analyzer
|
171
|
+
Pod::Installer::Analyzer.new(
|
172
|
+
cocoapods_config.sandbox,
|
173
|
+
@podfile,
|
174
|
+
cocoapods_config.lockfile
|
175
|
+
)
|
176
|
+
end
|
177
|
+
|
178
|
+
def pods_xcconfig
|
179
|
+
path =
|
180
|
+
Pathname.new(@config.project_dir) +
|
181
|
+
SUPPORT_FILES +
|
182
|
+
"Pods-#{TARGET_NAME}.release.xcconfig"
|
183
|
+
Xcodeproj::Config.new(path) if path.exist?
|
184
|
+
end
|
185
|
+
|
186
|
+
def xcconfig_hash
|
187
|
+
return unless pods_xcconfig
|
188
|
+
|
189
|
+
@xcconfig_hash ||= pods_xcconfig.to_hash
|
190
|
+
end
|
191
|
+
|
192
|
+
# Do not copy `.framework` bundles, these should be handled through RM's
|
193
|
+
# `embedded_frameworks` config attribute.
|
194
|
+
#
|
195
|
+
def resources
|
196
|
+
resources = []
|
197
|
+
resource_path =
|
198
|
+
Pathname.new(@config.project_dir) +
|
199
|
+
SUPPORT_FILES +
|
200
|
+
"Pods-#{TARGET_NAME}-resources.sh"
|
201
|
+
|
202
|
+
File.open(resource_path) { |f|
|
203
|
+
f.each_line do |line|
|
204
|
+
matched = line.match(/install_resource\s+(.*)/)
|
205
|
+
|
206
|
+
next unless matched
|
207
|
+
|
208
|
+
path = (matched[1].strip)[1..-2]
|
209
|
+
|
210
|
+
path.sub!("${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}", ".build")
|
211
|
+
|
212
|
+
next if File.extname(path) == ".framework"
|
213
|
+
|
214
|
+
resources << Pathname.new(@config.project_dir) + PODS_ROOT + path
|
215
|
+
end
|
216
|
+
}
|
217
|
+
resources.uniq
|
218
|
+
end
|
219
|
+
|
220
|
+
def resources_dir
|
221
|
+
Pathname.new(@config.project_dir) + PODS_ROOT + "Resources"
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
|
226
|
+
def configure_xcconfig
|
227
|
+
lib_search_paths, lib_search_path_flags = parse_search_paths_and_flags
|
228
|
+
|
229
|
+
# Get the name of all static libraries that come pre-built with pods
|
230
|
+
@pre_built_static_libs =
|
231
|
+
lib_search_paths.map { |path| static_libraries_in_path(path) }.flatten
|
232
|
+
|
233
|
+
# Collect the Pod products
|
234
|
+
pods_libs, libs_to_compile = categorize_libs(lib_search_path_flags)
|
235
|
+
|
236
|
+
@config.libs.concat(libs_to_compile.compact)
|
237
|
+
@config.libs.uniq!
|
238
|
+
|
239
|
+
@header_dirs = ["Headers/Public"]
|
240
|
+
|
241
|
+
case @config.deploy_platform
|
242
|
+
when "MacOSX" then configure_for_osx(framework_search_paths)
|
243
|
+
when "iPhoneOS" then configure_for_iphone(framework_search_paths)
|
244
|
+
end
|
245
|
+
|
246
|
+
@config.frameworks.concat(frameworks)
|
247
|
+
@config.frameworks.uniq!
|
248
|
+
|
249
|
+
@config.weak_frameworks.concat(weak_frameworks)
|
250
|
+
@config.weak_frameworks.uniq!
|
251
|
+
|
252
|
+
@config.vendor_project(PODS_ROOT, :xcode, {
|
253
|
+
:target => "Pods-#{TARGET_NAME}",
|
254
|
+
:headers_dir => "{#{@header_dirs.join(',')}}",
|
255
|
+
:products => pods_libs.map { |lib_name| "lib#{lib_name}.a" },
|
256
|
+
:allow_empty_products => (pods_libs.empty? ? true : false),
|
257
|
+
}.merge(@vendor_options))
|
258
|
+
end
|
259
|
+
|
260
|
+
def categorize_libs(lib_search_path_flags)
|
261
|
+
pods_libs = []
|
262
|
+
libs_to_compile = []
|
263
|
+
|
264
|
+
linked_libraries.each do |library|
|
265
|
+
path = parsed_library_path(library, lib_search_path_flags)
|
266
|
+
|
267
|
+
case path
|
268
|
+
when String then libs_to_compile << path
|
269
|
+
when :pod then pods_libs << library
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
[pods_libs.flatten, libs_to_compile]
|
274
|
+
end
|
275
|
+
|
276
|
+
def configure_for_iphone(framework_search_paths)
|
277
|
+
pods_root = cocoapods_config.installation_root + "Pods"
|
278
|
+
# If we would really specify these as ‘frameworks’ then the linker
|
279
|
+
# would not link the archive into the application, because it does not
|
280
|
+
# see any references to any of the symbols in the archive. Treating it
|
281
|
+
# as a static library (which it is) with `-ObjC` fixes this.
|
282
|
+
#
|
283
|
+
framework_search_paths.each do |framework_search_path|
|
284
|
+
frameworks.reject! do |framework|
|
285
|
+
path = File.join(framework_search_path, "#{framework}.framework")
|
286
|
+
if File.exist?(path)
|
287
|
+
@config.libs << "-ObjC '#{File.join(path, framework)}'"
|
288
|
+
# This is needed until (and if) CocoaPods links framework
|
289
|
+
# headers into `Headers/Public` by default:
|
290
|
+
#
|
291
|
+
# https://github.com/CocoaPods/CocoaPods/pull/2722
|
292
|
+
#
|
293
|
+
header_dir = Pathname.new(path) + "Headers"
|
294
|
+
@header_dirs << header_dir.realpath.relative_path_from(pods_root).to_s
|
295
|
+
true
|
296
|
+
else
|
297
|
+
false
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def configure_for_osx(framework_search_paths)
|
304
|
+
@config.framework_search_paths.concat(framework_search_paths)
|
305
|
+
@config.framework_search_paths.uniq!
|
306
|
+
|
307
|
+
framework_search_paths.each do |framework_search_path|
|
308
|
+
frameworks.reject! do |framework|
|
309
|
+
path = File.join(framework_search_path, "#{framework}.framework")
|
310
|
+
if File.exist?(path)
|
311
|
+
@config.embedded_frameworks << path
|
312
|
+
true
|
313
|
+
else
|
314
|
+
false
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def frameworks
|
321
|
+
ldflags.scan(/-framework\s+"?([^\s"]+)"?/).map { |match| match[0] }
|
322
|
+
end
|
323
|
+
|
324
|
+
def framework_search_paths
|
325
|
+
search_paths = xcconfig_hash["FRAMEWORK_SEARCH_PATHS"]
|
326
|
+
|
327
|
+
return [] unless search_paths
|
328
|
+
|
329
|
+
search_paths.strip!
|
330
|
+
|
331
|
+
return [] if search_paths.empty?
|
332
|
+
|
333
|
+
framework_search_paths = []
|
334
|
+
|
335
|
+
search_paths.scan(/"([^"]+)"/) do |search_path|
|
336
|
+
path = search_path.first.gsub!(PODS_ROOT_MATCHER, "#{@config.project_dir}/#{PODS_ROOT}")
|
337
|
+
framework_search_paths << path if path
|
338
|
+
end
|
339
|
+
|
340
|
+
# If we couldn't parse any search paths, then presumably nothing was properly quoted, so
|
341
|
+
# fallback to just assuming the whole value is one path.
|
342
|
+
if framework_search_paths.empty?
|
343
|
+
path = search_paths.gsub!(PODS_ROOT_MATCHER, "#{@config.project_dir}/#{PODS_ROOT}")
|
344
|
+
framework_search_paths << path if path
|
345
|
+
end
|
346
|
+
|
347
|
+
framework_search_paths
|
348
|
+
end
|
349
|
+
|
350
|
+
def ldflags
|
351
|
+
xcconfig_hash["OTHER_LDFLAGS"]
|
352
|
+
end
|
353
|
+
|
354
|
+
def linked_libraries
|
355
|
+
ldflags.scan(/-l"?([^\s"]+)"?/)
|
356
|
+
end
|
357
|
+
|
358
|
+
def parse_search_paths_and_flags
|
359
|
+
flags = xcconfig_hash["LIBRARY_SEARCH_PATHS"] || ""
|
360
|
+
|
361
|
+
search_paths = []
|
362
|
+
|
363
|
+
flags = flags.split(/\s/).map do |path|
|
364
|
+
next if path =~ /(\$\(inherited\))|(\$\{inherited\})/
|
365
|
+
|
366
|
+
path.gsub!(
|
367
|
+
/(\$\(PODS_ROOT\))|(\$\{PODS_ROOT\})/,
|
368
|
+
File.join(@config.project_dir, PODS_ROOT)
|
369
|
+
)
|
370
|
+
|
371
|
+
search_paths << path.delete('"')
|
372
|
+
|
373
|
+
'-L ' << path
|
374
|
+
end
|
375
|
+
|
376
|
+
[search_paths, flags.compact.join(' ')]
|
377
|
+
end
|
378
|
+
|
379
|
+
def parsed_library_path(library, lib_search_path_flags)
|
380
|
+
lib_name = library[0]
|
381
|
+
|
382
|
+
return unless lib_name
|
383
|
+
|
384
|
+
# For CocoaPods 0.37.x or below. This block is marked as deprecated.
|
385
|
+
if lib_name.start_with?('Pods-')
|
386
|
+
:pod
|
387
|
+
elsif @pre_built_static_libs.include?("lib#{lib_name}.a")
|
388
|
+
"#{lib_search_path_flags} -ObjC -l#{lib_name}"
|
389
|
+
elsif File.exist?("/usr/lib/lib#{lib_name}.dylib")
|
390
|
+
"/usr/lib/lib#{lib_name}.dylib"
|
391
|
+
else
|
392
|
+
:pod
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def static_libraries_in_path(path)
|
397
|
+
Dir[File.join(path, "**/*.a")].map { |f| File.basename(f) }
|
398
|
+
end
|
399
|
+
|
400
|
+
def weak_frameworks
|
401
|
+
ldflags.scan(/-weak_framework\s+([^\s]+)/).map { |match| match[0] }
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
@@ -0,0 +1,404 @@
|
|
1
|
+
# Copyright (c) 2012-2014, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
module Motion
|
26
|
+
class Pods
|
27
|
+
PODS_ROOT = 'vendor/Pods'
|
28
|
+
TARGET_NAME = 'RubyMotion'
|
29
|
+
PUBLIC_HEADERS_ROOT = File.join(PODS_ROOT, 'Headers/Public')
|
30
|
+
PODS_ROOT_MATCHER = /(\$\(PODS_ROOT\))|(\$\{PODS_ROOT\})/
|
31
|
+
SUPPORT_FILES = File.join(PODS_ROOT, "Target Support Files/Pods-#{TARGET_NAME}")
|
32
|
+
|
33
|
+
attr_accessor :podfile
|
34
|
+
|
35
|
+
def initialize(config, vendor_options)
|
36
|
+
@config = config
|
37
|
+
@vendor_options = vendor_options
|
38
|
+
|
39
|
+
platform =
|
40
|
+
case @config.deploy_platform
|
41
|
+
when 'MacOSX' then :osx
|
42
|
+
when 'iPhoneOS' then :ios
|
43
|
+
when 'AppleTVOS' then :tvos
|
44
|
+
when 'WatchOS' then :watchos
|
45
|
+
else App.fail "Unknown CocoaPods platform: #{@config.deploy_platform}"
|
46
|
+
end
|
47
|
+
|
48
|
+
@podfile = Pod::Podfile.new(Pathname.new(Rake.original_dir) + 'Rakefile') {}
|
49
|
+
@podfile.platform(platform, config.deployment_target)
|
50
|
+
@podfile.target(TARGET_NAME)
|
51
|
+
cocoapods_config.podfile = @podfile
|
52
|
+
cocoapods_config.skip_repo_update = true
|
53
|
+
cocoapods_config.installation_root = Pathname.new(File.expand_path(config.project_dir)) + 'vendor'
|
54
|
+
|
55
|
+
if cocoapods_config.verbose = !!ENV["COCOAPODS_VERBOSE"]
|
56
|
+
require 'claide'
|
57
|
+
end
|
58
|
+
|
59
|
+
configure_project
|
60
|
+
end
|
61
|
+
|
62
|
+
# Adds the Pods project to the RubyMotion config as a vendored project and
|
63
|
+
#
|
64
|
+
def configure_project
|
65
|
+
@config.resources_dirs << resources_dir.to_s
|
66
|
+
|
67
|
+
# TODO: replace this all once Xcodeproj has the proper xcconfig parser.
|
68
|
+
return unless xcconfig_hash && ldflags
|
69
|
+
configure_xcconfig
|
70
|
+
end
|
71
|
+
|
72
|
+
# DSL
|
73
|
+
#-------------------------------------------------------------------------#
|
74
|
+
|
75
|
+
def source(source)
|
76
|
+
@podfile.source(source)
|
77
|
+
end
|
78
|
+
|
79
|
+
def pod(*name_and_version_requirements, &block)
|
80
|
+
@podfile.pod(*name_and_version_requirements, &block)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Deprecated.
|
84
|
+
def dependency(*name_and_version_requirements, &block)
|
85
|
+
@podfile.dependency(*name_and_version_requirements, &block)
|
86
|
+
end
|
87
|
+
|
88
|
+
def post_install(&block)
|
89
|
+
@podfile.post_install(&block)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Installation
|
93
|
+
#-------------------------------------------------------------------------#
|
94
|
+
|
95
|
+
def pods_installer
|
96
|
+
@installer ||= Pod::Installer.new(
|
97
|
+
cocoapods_config.sandbox,
|
98
|
+
@podfile,
|
99
|
+
cocoapods_config.lockfile
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Performs a CocoaPods Installation.
|
104
|
+
#
|
105
|
+
# For now we only support one Pods target, this will have to be expanded
|
106
|
+
# once we work on more spec support.
|
107
|
+
#
|
108
|
+
# Let RubyMotion re-generate the BridgeSupport file whenever the list of
|
109
|
+
# installed pods changes.
|
110
|
+
#
|
111
|
+
def install!(update)
|
112
|
+
pods_installer.update = update
|
113
|
+
pods_installer.installation_options.integrate_targets = false
|
114
|
+
pods_installer.install!
|
115
|
+
install_resources
|
116
|
+
copy_cocoapods_env_and_prefix_headers
|
117
|
+
end
|
118
|
+
|
119
|
+
# TODO: this probably breaks in cases like resource bundles etc, need to test.
|
120
|
+
def install_resources
|
121
|
+
FileUtils.rm_rf(resources_dir)
|
122
|
+
FileUtils.mkdir_p(resources_dir)
|
123
|
+
resources.each { |file| install_resource(file, resources_dir) }
|
124
|
+
end
|
125
|
+
|
126
|
+
def install_resource(file, resources_dir)
|
127
|
+
FileUtils.cp_r(file, resources_dir) if file.exist?
|
128
|
+
rescue ArgumentError => exc
|
129
|
+
raise unless exc.message =~ /same file/
|
130
|
+
end
|
131
|
+
|
132
|
+
def copy_cocoapods_env_and_prefix_headers
|
133
|
+
headers = Dir.glob([
|
134
|
+
"#{PODS_ROOT}/*.h",
|
135
|
+
"#{PODS_ROOT}/*.pch",
|
136
|
+
"#{PODS_ROOT}/Target Support Files/**/*.h",
|
137
|
+
"#{PODS_ROOT}/Target Support Files/**/*.pch"
|
138
|
+
])
|
139
|
+
|
140
|
+
headers.each do |header|
|
141
|
+
src = File.basename(header)
|
142
|
+
dst = src.sub(/\.pch$/, ".h")
|
143
|
+
dst_path = File.join(PUBLIC_HEADERS_ROOT, "____#{dst}")
|
144
|
+
|
145
|
+
next if File.exist?(dst_path)
|
146
|
+
|
147
|
+
FileUtils.mkdir_p(PUBLIC_HEADERS_ROOT)
|
148
|
+
FileUtils.cp(header, dst_path)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Helpers
|
153
|
+
#-------------------------------------------------------------------------#
|
154
|
+
|
155
|
+
# This is the output that gets shown in `rake config`, so it should be
|
156
|
+
# short and sweet.
|
157
|
+
#
|
158
|
+
def inspect
|
159
|
+
cocoapods_config
|
160
|
+
.lockfile
|
161
|
+
.to_hash["PODS"]
|
162
|
+
.map { |pod| pod.is_a?(Hash) ? pod.keys.first : pod }
|
163
|
+
.inspect
|
164
|
+
end
|
165
|
+
|
166
|
+
def cocoapods_config
|
167
|
+
Pod::Config.instance
|
168
|
+
end
|
169
|
+
|
170
|
+
def analyzer
|
171
|
+
Pod::Installer::Analyzer.new(
|
172
|
+
cocoapods_config.sandbox,
|
173
|
+
@podfile,
|
174
|
+
cocoapods_config.lockfile
|
175
|
+
)
|
176
|
+
end
|
177
|
+
|
178
|
+
def pods_xcconfig
|
179
|
+
path =
|
180
|
+
Pathname.new(@config.project_dir) +
|
181
|
+
SUPPORT_FILES +
|
182
|
+
"Pods-#{TARGET_NAME}.release.xcconfig"
|
183
|
+
Xcodeproj::Config.new(path) if path.exist?
|
184
|
+
end
|
185
|
+
|
186
|
+
def xcconfig_hash
|
187
|
+
return unless pods_xcconfig
|
188
|
+
|
189
|
+
@xcconfig_hash ||= pods_xcconfig.to_hash
|
190
|
+
end
|
191
|
+
|
192
|
+
# Do not copy `.framework` bundles, these should be handled through RM's
|
193
|
+
# `embedded_frameworks` config attribute.
|
194
|
+
#
|
195
|
+
def resources
|
196
|
+
resources = []
|
197
|
+
resource_path =
|
198
|
+
Pathname.new(@config.project_dir) +
|
199
|
+
SUPPORT_FILES +
|
200
|
+
"Pods-#{TARGET_NAME}-resources.sh"
|
201
|
+
|
202
|
+
File.open(resource_path) { |f|
|
203
|
+
f.each_line do |line|
|
204
|
+
matched = line.match(/install_resource\s+(.*)/)
|
205
|
+
|
206
|
+
next unless matched
|
207
|
+
|
208
|
+
path = (matched[1].strip)[1..-2]
|
209
|
+
|
210
|
+
path.sub!("${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}", ".build")
|
211
|
+
|
212
|
+
next if File.extname(path) == ".framework"
|
213
|
+
|
214
|
+
resources << Pathname.new(@config.project_dir) + PODS_ROOT + path
|
215
|
+
end
|
216
|
+
}
|
217
|
+
resources.uniq
|
218
|
+
end
|
219
|
+
|
220
|
+
def resources_dir
|
221
|
+
Pathname.new(@config.project_dir) + PODS_ROOT + "Resources"
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
|
226
|
+
def configure_xcconfig
|
227
|
+
lib_search_paths, lib_search_path_flags = parse_search_paths_and_flags
|
228
|
+
|
229
|
+
# Get the name of all static libraries that come pre-built with pods
|
230
|
+
@pre_built_static_libs =
|
231
|
+
lib_search_paths.map { |path| static_libraries_in_path(path) }.flatten
|
232
|
+
|
233
|
+
# Collect the Pod products
|
234
|
+
pods_libs, libs_to_compile = categorize_libs(lib_search_path_flags)
|
235
|
+
|
236
|
+
@config.libs.concat(libs_to_compile.compact)
|
237
|
+
@config.libs.uniq!
|
238
|
+
|
239
|
+
@header_dirs = ["Headers/Public"]
|
240
|
+
|
241
|
+
case @config.deploy_platform
|
242
|
+
when "MacOSX" then configure_for_osx(framework_search_paths)
|
243
|
+
when "iPhoneOS" then configure_for_iphone(framework_search_paths)
|
244
|
+
end
|
245
|
+
|
246
|
+
@config.frameworks.concat(frameworks)
|
247
|
+
@config.frameworks.uniq!
|
248
|
+
|
249
|
+
@config.weak_frameworks.concat(weak_frameworks)
|
250
|
+
@config.weak_frameworks.uniq!
|
251
|
+
|
252
|
+
@config.vendor_project(PODS_ROOT, :xcode, {
|
253
|
+
:target => "Pods-#{TARGET_NAME}",
|
254
|
+
:headers_dir => "{#{@header_dirs.join(',')}}",
|
255
|
+
:products => pods_libs.map { |lib_name| "lib#{lib_name}.a" },
|
256
|
+
:allow_empty_products => (pods_libs.empty? ? true : false),
|
257
|
+
}.merge(@vendor_options))
|
258
|
+
end
|
259
|
+
|
260
|
+
def categorize_libs(lib_search_path_flags)
|
261
|
+
pods_libs = []
|
262
|
+
libs_to_compile = []
|
263
|
+
|
264
|
+
linked_libraries.each do |library|
|
265
|
+
path = parsed_library_path(library, lib_search_path_flags)
|
266
|
+
|
267
|
+
case path
|
268
|
+
when String then libs_to_compile << path
|
269
|
+
when :pod then pods_libs << library
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
[pods_libs.flatten, libs_to_compile]
|
274
|
+
end
|
275
|
+
|
276
|
+
def configure_for_iphone(framework_search_paths)
|
277
|
+
pods_root = cocoapods_config.installation_root + "Pods"
|
278
|
+
# If we would really specify these as ‘frameworks’ then the linker
|
279
|
+
# would not link the archive into the application, because it does not
|
280
|
+
# see any references to any of the symbols in the archive. Treating it
|
281
|
+
# as a static library (which it is) with `-ObjC` fixes this.
|
282
|
+
#
|
283
|
+
framework_search_paths.each do |framework_search_path|
|
284
|
+
frameworks.reject! do |framework|
|
285
|
+
path = File.join(framework_search_path, "#{framework}.framework")
|
286
|
+
if File.exist?(path)
|
287
|
+
@config.libs << "-ObjC '#{File.join(path, framework)}'"
|
288
|
+
# This is needed until (and if) CocoaPods links framework
|
289
|
+
# headers into `Headers/Public` by default:
|
290
|
+
#
|
291
|
+
# https://github.com/CocoaPods/CocoaPods/pull/2722
|
292
|
+
#
|
293
|
+
header_dir = Pathname.new(path) + "Headers"
|
294
|
+
@header_dirs << header_dir.realpath.relative_path_from(pods_root).to_s
|
295
|
+
true
|
296
|
+
else
|
297
|
+
false
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def configure_for_osx(framework_search_paths)
|
304
|
+
@config.framework_search_paths.concat(framework_search_paths)
|
305
|
+
@config.framework_search_paths.uniq!
|
306
|
+
|
307
|
+
framework_search_paths.each do |framework_search_path|
|
308
|
+
frameworks.reject! do |framework|
|
309
|
+
path = File.join(framework_search_path, "#{framework}.framework")
|
310
|
+
if File.exist?(path)
|
311
|
+
@config.embedded_frameworks << path
|
312
|
+
true
|
313
|
+
else
|
314
|
+
false
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def frameworks
|
321
|
+
ldflags.scan(/-framework\s+"?([^\s"]+)"?/).map { |match| match[0] }
|
322
|
+
end
|
323
|
+
|
324
|
+
def framework_search_paths
|
325
|
+
search_paths = xcconfig_hash["FRAMEWORK_SEARCH_PATHS"]
|
326
|
+
|
327
|
+
return [] unless search_paths
|
328
|
+
|
329
|
+
search_paths.strip!
|
330
|
+
|
331
|
+
return [] if search_paths.empty?
|
332
|
+
|
333
|
+
framework_search_paths = []
|
334
|
+
|
335
|
+
search_paths.scan(/"([^"]+)"/) do |search_path|
|
336
|
+
path = search_path.first.gsub!(PODS_ROOT_MATCHER, "#{@config.project_dir}/#{PODS_ROOT}")
|
337
|
+
framework_search_paths << path if path
|
338
|
+
end
|
339
|
+
|
340
|
+
# If we couldn't parse any search paths, then presumably nothing was properly quoted, so
|
341
|
+
# fallback to just assuming the whole value is one path.
|
342
|
+
if framework_search_paths.empty?
|
343
|
+
path = search_paths.gsub!(PODS_ROOT_MATCHER, "#{@config.project_dir}/#{PODS_ROOT}")
|
344
|
+
framework_search_paths << path if path
|
345
|
+
end
|
346
|
+
|
347
|
+
framework_search_paths
|
348
|
+
end
|
349
|
+
|
350
|
+
def ldflags
|
351
|
+
xcconfig_hash["OTHER_LDFLAGS"]
|
352
|
+
end
|
353
|
+
|
354
|
+
def linked_libraries
|
355
|
+
ldflags.scan(/-l"?([^\s"]+)"?/)
|
356
|
+
end
|
357
|
+
|
358
|
+
def parse_search_paths_and_flags
|
359
|
+
flags = xcconfig_hash["LIBRARY_SEARCH_PATHS"] || ""
|
360
|
+
|
361
|
+
search_paths = []
|
362
|
+
|
363
|
+
flags = flags.split(/\s/).map do |path|
|
364
|
+
next if path =~ /(\$\(inherited\))|(\$\{inherited\})/
|
365
|
+
|
366
|
+
path.gsub!(
|
367
|
+
/(\$\(PODS_ROOT\))|(\$\{PODS_ROOT\})/,
|
368
|
+
File.join(@config.project_dir, PODS_ROOT)
|
369
|
+
)
|
370
|
+
|
371
|
+
search_paths << path.delete('"')
|
372
|
+
|
373
|
+
'-L ' << path
|
374
|
+
end
|
375
|
+
|
376
|
+
[search_paths, flags.compact.join(' ')]
|
377
|
+
end
|
378
|
+
|
379
|
+
def parsed_library_path(library, lib_search_path_flags)
|
380
|
+
lib_name = library[0]
|
381
|
+
|
382
|
+
return unless lib_name
|
383
|
+
|
384
|
+
# For CocoaPods 0.37.x or below. This block is marked as deprecated.
|
385
|
+
if lib_name.start_with?('Pods-')
|
386
|
+
:pod
|
387
|
+
elsif @pre_built_static_libs.include?("lib#{lib_name}.a")
|
388
|
+
"#{lib_search_path_flags} -ObjC -l#{lib_name}"
|
389
|
+
elsif File.exist?("/usr/lib/lib#{lib_name}.dylib")
|
390
|
+
"/usr/lib/lib#{lib_name}.dylib"
|
391
|
+
else
|
392
|
+
:pod
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def static_libraries_in_path(path)
|
397
|
+
Dir[File.join(path, "**/*.a")].map { |f| File.basename(f) }
|
398
|
+
end
|
399
|
+
|
400
|
+
def weak_frameworks
|
401
|
+
ldflags.scan(/-weak_framework\s+([^\s]+)/).map { |match| match[0] }
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright (c) 2012-2013, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
module Motion
|
26
|
+
class Pods
|
27
|
+
VERSION = '0.9.0'
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2012-2014, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
module Motion
|
26
|
+
module Project
|
27
|
+
class Config
|
28
|
+
variable :pods
|
29
|
+
|
30
|
+
def pods(vendor_options = {}, &block)
|
31
|
+
@pods ||= Motion::Pods.new(self, vendor_options)
|
32
|
+
@pods.instance_eval(&block) if block
|
33
|
+
@pods
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class App
|
38
|
+
class << self
|
39
|
+
def build_with_cocoapods(platform, opts = {})
|
40
|
+
unless File.exist?(Motion::Pods::PODS_ROOT)
|
41
|
+
$stderr.puts(
|
42
|
+
"[!] No CocoaPods dependencies found in " \
|
43
|
+
"#{Motion::Pods::PODS_ROOT}, run the " \
|
44
|
+
"`[bundle exec] rake pod:install` task."
|
45
|
+
)
|
46
|
+
exit 1
|
47
|
+
end
|
48
|
+
build_without_cocoapods(platform, opts)
|
49
|
+
end
|
50
|
+
|
51
|
+
alias_method "build_without_cocoapods", "build"
|
52
|
+
alias_method "build", "build_with_cocoapods"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/tasks/pod.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (c) 2012-2014, Laurent Sansonetti <lrz@hipbyte.com>
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
14
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
17
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
18
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
20
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
21
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
22
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
23
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
namespace :pod do
|
26
|
+
task :update_spec_repos do
|
27
|
+
if ENV['COCOCAPODS_NO_UPDATE']
|
28
|
+
$stderr.puts(
|
29
|
+
'[!] The COCOCAPODS_NO_UPDATE env variable has been deprecated, use ' \
|
30
|
+
'COCOAPODS_NO_REPO_UPDATE instead.'
|
31
|
+
)
|
32
|
+
ENV['COCOAPODS_NO_REPO_UPDATE'] = '1'
|
33
|
+
end
|
34
|
+
|
35
|
+
show_output = !ENV['COCOAPODS_NO_REPO_UPDATE_OUTPUT']
|
36
|
+
|
37
|
+
unless ENV['COCOAPODS_NO_REPO_UPDATE']
|
38
|
+
Pod::SourcesManager.update(nil, show_output)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Download and integrate newly added pods"
|
43
|
+
task :install => :update_spec_repos do
|
44
|
+
# TODO: Should ideally not have to be controller manually.
|
45
|
+
Pod::UserInterface.title_level = 1
|
46
|
+
|
47
|
+
pods = App.config.pods
|
48
|
+
|
49
|
+
# TODO: fix this, see https://git.io/vae3Z
|
50
|
+
need_install = (pods.analyzer.needs_install? rescue true)
|
51
|
+
|
52
|
+
# TODO: Should ideally not have to be controller manually.
|
53
|
+
Pod::UserInterface.title_level = 0
|
54
|
+
|
55
|
+
pods.install!(false) if need_install
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Update outdated pods"
|
59
|
+
task :update => :update_spec_repos do
|
60
|
+
pods = App.config.pods
|
61
|
+
pods.install!(true)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
namespace :clean do
|
66
|
+
# This gets appended to the already existing clean:all task.
|
67
|
+
task :all do
|
68
|
+
dir = Motion::Pods::PODS_ROOT
|
69
|
+
if File.exist?(dir)
|
70
|
+
App.info 'Delete', dir
|
71
|
+
rm_rf dir
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-pods
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Laurent Sansonetti
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cocoapods
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0.beta.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0.beta.4
|
27
|
+
description: motion-cocoapods allows RubyMotion projects to have access to the CocoaPods
|
28
|
+
dependency manager.
|
29
|
+
email: lrz@hipbyte.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- LICENSE
|
35
|
+
- README.md
|
36
|
+
- lib/motion-pods.rb
|
37
|
+
- lib/motion/cocoapods/main.rb
|
38
|
+
- lib/motion/pods/main.rb
|
39
|
+
- lib/motion/pods/version.rb
|
40
|
+
- lib/motion/project/monkeypatches.rb
|
41
|
+
- lib/tasks/pod.rb
|
42
|
+
homepage: http://www.rubymotion.com
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.4.8
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: CocoaPods integration for RubyMotion projects
|
66
|
+
test_files: []
|