cocoapods-jxedt 0.0.9

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c38c0828fdaf7acdd4f9aea09b68194af1d2e9e6117ca1c6156618e7b1bc8cd6
4
+ data.tar.gz: 4d19e409eefaa4a2eac16c7c72e6874a2a626c49bf1a20cd216a7d5ef842395c
5
+ SHA512:
6
+ metadata.gz: 6587bbe4ed16a1a0f354b8bb07008399c2031ccf28544e4c75b8180005c5653670fa8d86c8868275fd389b700f8e6d8d18c4fea9c3061742f44e751f47fdcce3
7
+ data.tar.gz: 3968415ded4a515d99569a2f060ae732055233c4c8703048346eaf52a2e0665dd659af92889b11cf959ce78f69d8b92719f68247fc4231133a04501d0ea7b933
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2023 guojiashuang <guojiashuang@58.com>
2
+
3
+ MIT License
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,86 @@
1
+ # cocoapods-jxedt
2
+
3
+ cocoapods-jxedt提供组件二进制链接的功能,你不需要更改podspec源文件,只需要在Podfile文件中配置好use_binary的标识,执行`pod install`的时候就会帮你完成二进制链接的工作。
4
+ 使用cocoapods-jxedt理论上来说可以使你的pods工程编译时间减少到秒级,取决于你怎样配置二进制文件。
5
+
6
+ ## Installation
7
+ ### 使用已发布的插件
8
+
9
+ $ gem install cocoapods-jxedt
10
+
11
+ ### 本地编译插件安装
12
+
13
+ $ rake build
14
+
15
+ $ sudo rake install
16
+
17
+ ## Usage
18
+
19
+ 打开Podfile文件,在合适的位置添加
20
+
21
+ ```
22
+ plugin 'cocoapods-jxedt'
23
+ all_binary!
24
+ binary_dir('../_Prebuild')
25
+ ```
26
+
27
+ ```
28
+ plugin 'cocoapods-jxedt'
29
+ options = {
30
+ 'all_binary': true, # 全部开启bianry,默认false
31
+ 'binary_dir': '../_Prebuild', # binary编译的最终路径,默认为'../_Prebuild'
32
+ 'binary_switch': true, # 二进制开关,设置为关则不hook pre_install过程,默认开
33
+ 'prebuild_job': true, #开启预编译任务,默认开启
34
+ 'excluded_pods': ['WIMPhotoBrowser', 'JXFavoriteLib'], # 排除binary的组件
35
+ 'framework_header_search_enabled': true, # 是否开启binary的header search path功能,默认不开启
36
+ 'configurations': ['Release', 'Debug'], # 支持的configurations,默认只编译Release
37
+ 'xcframework': false, # 编译结果是否为xcframework,默认false
38
+ 'dev_pods_enabled': false, # 开发中的pod是否支持binary,默认false
39
+ 'simulator_build_enabled': false, # 是否编译模拟器,默认不支持
40
+ 'clean_build': false, # build的时候是否clean,默认不clean
41
+ 'build_args': { # 编译的配置
42
+ 'default':["ONLY_ACTIVE_ARCH=NO", "BUILD_LIBRARY_FOR_DISTRIBUTION=YES"],
43
+ 'device':["ARCHS='arm64'"], # "ARCHS='arm64 armv7 armv7s'"
44
+ 'simulator':["ARCHS='x86_64'"] # "ARCHS='arm64 x86_64 i386'
45
+ }
46
+ }
47
+ cocoapods_jxedt_config(options)
48
+ ```
49
+
50
+ 如果只需要某个组件实现二进制的链接,你可以
51
+ ```
52
+ pod 'PodA', :binary => true # 明确的指定某个pod组件支持binary
53
+
54
+ pod 'PodB', :framework_header_search => false # 明确指出某个pod不支持配置framework的`HEADER_SEARCH_PATH`
55
+ ```
56
+
57
+ ## 原理
58
+ ...
59
+ 待完善
60
+
61
+ ## TODO
62
+ - [x] 支持从已有framework文件完成源码和二进制切换
63
+ - [x] 解决依赖的组件被打成framework,头文件依赖的问题
64
+ - [x] 解决源码和二进制切换的问题,现有binary插件均不支持
65
+ - [x] 支持不同环境(Debug、Release)编译时链接不同环境的framework
66
+ - [x] 记录组件的hash(git提交)值,用户校验二进制的源码组件的版本。这个值在podfile.lock文件中
67
+ - [x] 两次install去校验checksum值,确保源码和二进制是对应版本,checksum值校验通过才支持binary
68
+ - [x] 添加是否从header_search_path中查找framework的header(为了兼容"" <> 这种方式引用头文件的问题)
69
+ - [x] 插件支持编译为framework
70
+ - [x] prebuild流程添加到pod的install流程中,形成闭环,使用二进制的时候,发现没有对应的二进制文件,那么可以预编译
71
+ - [x] 添加`pod jxedt options`命令,输出配置文件详细介绍
72
+
73
+ - [ ] 添加`pod jxedt binary`命令,支持命令行打包framework
74
+ - [ ] 支持配置git地址做编译结果缓存
75
+ - [ ] 支持缓存的fetch和push
76
+ - [ ] 支持多线程下载
77
+
78
+ ## 已知问题
79
+ 1. 不支持framework中有xib文件,如果pod仓库中有xib文件且不在bundle中,需要设置:binary=>false
80
+ 2. 不支持多个target依赖同一个pod时,target的platform版本不一致的情况
81
+ 3. 不支持同一个pod,多个target且使用了不同的subspec
82
+ 4. framework_header_search_enabled不支持使用`#if __has_include(<FrameworkA/Header.h>)`方式设置的组件,如果有会出现重复定义的错误。如YYImage、YYWebImage等
83
+
84
+ ## 感谢
85
+
86
+ 感谢[cocoapods-binary](https://github.com/leavez/cocoapods-binary)和[cocoapods-binary-cache](https://github.com/grab/cocoapods-binary-cache)的作者,因为看了他们的源码之后受到了启发。
@@ -0,0 +1,303 @@
1
+ require_relative 'helper/podfile_options'
2
+ require_relative 'helper/names'
3
+
4
+
5
+ # NOTE:
6
+ # This file will only be loaded on normal pod install step
7
+ # so there's no need to check is_prebuild_stage
8
+
9
+
10
+
11
+ # Provide a special "download" process for prebuilded pods.
12
+ #
13
+ # As the frameworks is already exsited in local folder. We
14
+ # just create a symlink to the original target folder.
15
+ #
16
+ module Pod
17
+ class Installer
18
+ class PodSourceInstaller
19
+
20
+ def install_for_prebuild!(standard_sanbox)
21
+ check_sandbox = Jxedt::Sandbox.from_sandbox(standard_sanbox)
22
+ target_names = check_sandbox.existed_target_names(self.name)
23
+
24
+ def walk(path, &action)
25
+ return unless path.exist?
26
+ path.children.each do |child|
27
+ result = action.call(child, &action)
28
+ if child.directory?
29
+ walk(child, &action) if result
30
+ end
31
+ end
32
+ end
33
+ def make_link(source, target)
34
+ source = Pathname.new(source)
35
+ target = Pathname.new(target)
36
+ target.parent.mkpath unless target.parent.exist?
37
+ relative_source = source.relative_path_from(target.parent)
38
+ FileUtils.ln_sf(relative_source, target)
39
+ end
40
+ def mirror_with_symlink(source, basefolder, target_folder)
41
+ relative_path = source.relative_path_from(basefolder)
42
+ match_configuration = Jxedt.config.support_configurations.join('|')
43
+ if relative_path.to_s =~ /^(#{match_configuration})\/.*/
44
+ new_relative_path = relative_path.to_s.gsub!(/^(#{match_configuration})/) { |match| "#{Jxedt.config.xcconfig_configuration_alias}-#{match}" }
45
+ target = Pathname.new("#{target_folder}/#{new_relative_path}")
46
+ make_link(source, target)
47
+ else
48
+ target = Pathname.new("#{target_folder}/#{relative_path}")
49
+ make_link(source, target)
50
+ end
51
+ end
52
+
53
+ target_names.each do |name|
54
+
55
+ # symbol link copy all substructure
56
+ real_file_folder = check_sandbox.framework_folder_path_for_target_name(name)
57
+
58
+ # If have only one platform, just place int the root folder of this pod.
59
+ # If have multiple paths, we use a sperated folder to store different
60
+ # platform frameworks. e.g. AFNetworking/AFNetworking-iOS/AFNetworking.framework
61
+
62
+ target_folder = standard_sanbox.pod_dir(self.name) + "_Prebuild"
63
+ target_folder.rmtree if target_folder.exist?
64
+ target_folder.mkpath
65
+
66
+
67
+ walk(real_file_folder) do |child|
68
+ source = child
69
+ # only make symlink to file and `.framework` folder
70
+ if child.directory? and [".framework", ".xcframework", ".bundle", ".dSYM"].include? child.extname
71
+ mirror_with_symlink(source, real_file_folder, target_folder)
72
+ next false # return false means don't go deeper
73
+ elsif child.file?
74
+ mirror_with_symlink(source, real_file_folder, target_folder) if child.extname != '.checksum'
75
+ next true
76
+ else
77
+ next true
78
+ end
79
+ end
80
+ end # of for each
81
+
82
+ end # of method
83
+
84
+ end
85
+ end
86
+ end
87
+
88
+
89
+ # Let cocoapods use the prebuild framework files in install process.
90
+ #
91
+ # the code only effect the second pod install process.
92
+ #
93
+ module Pod
94
+ class Installer
95
+ # Modify specification to use only the prebuild framework after analyzing
96
+ old_method2 = instance_method(:resolve_dependencies)
97
+ define_method(:resolve_dependencies) do
98
+ # call original
99
+ old_method2.bind(self).()
100
+ # ...
101
+ # ...
102
+ # ...
103
+ # after finishing the very complex orginal function
104
+
105
+ # check the pods
106
+ # Although we have did it in prebuild stage, it's not sufficient.
107
+ # Same pod may appear in another target in form of source code.
108
+ # Prebuild.check_one_pod_should_have_only_one_target(self.prebuild_pod_targets)
109
+ # self.validate_every_pod_only_have_one_form
110
+
111
+ # prepare
112
+ cache = []
113
+
114
+ def add_vendered_framework(spec, platform, added_framework_file_path)
115
+ if spec.attributes_hash[platform] == nil
116
+ spec.attributes_hash[platform] = {}
117
+ end
118
+ vendored_frameworks = spec.attributes_hash[platform]["vendored_frameworks"] || []
119
+ vendored_frameworks = [vendored_frameworks] if vendored_frameworks.kind_of?(String)
120
+ vendored_frameworks += [added_framework_file_path] unless added_framework_file_path.nil?
121
+ spec.attributes_hash[platform]["vendored_frameworks"] = vendored_frameworks
122
+ end
123
+ def empty_source_files(spec)
124
+ spec.attributes_hash["source_files"] = []
125
+ spec.attributes_hash["public_header_files"] = []
126
+ spec.attributes_hash["private_header_files"] = []
127
+ ["ios", "watchos", "tvos", "osx"].each do |plat|
128
+ if spec.attributes_hash[plat] != nil
129
+ spec.attributes_hash[plat]["source_files"] = []
130
+ spec.attributes_hash[plat]["public_header_files"] = []
131
+ spec.attributes_hash[plat]["private_header_files"] = []
132
+ end
133
+ end
134
+ end
135
+
136
+ check_sandbox = Jxedt::Sandbox.from_sandbox(self.sandbox)
137
+
138
+ specs = self.analysis_result.specifications
139
+ prebuilt_specs = (specs.select do |spec|
140
+ # rmtree
141
+ target_prebuild_files = self.sandbox.root + spec.root.name + "_Prebuild"
142
+ target_prebuild_files.rmtree if target_prebuild_files.exist?
143
+
144
+ self.prebuild_pod_names.include? spec.root.name
145
+ end)
146
+
147
+ checked_specs = {}
148
+ prebuilt_specs.each do |spec|
149
+ checked_specs[spec.root.name] = [] if checked_specs[spec.root.name].nil?
150
+ checked_specs[spec.root.name] << spec
151
+
152
+ # Use the prebuild framworks as vendered frameworks
153
+ # get_corresponding_targets
154
+ targets = Pod.fast_get_targets_for_pod_name(spec.root.name, self.pod_targets, cache)
155
+ targets.each do |target|
156
+ # the framework_file_path rule is decided when `install_for_prebuild`,
157
+ # as to compitable with older version and be less wordy.
158
+ check_sandbox.prebuild_vendored_frameworks(spec.root.name).each do |frame_file_path|
159
+ framework_file_path = "_Prebuild/" + frame_file_path
160
+ framework_file_path = nil if checked_specs[spec.root.name].size > 1 # spec.root.name相同的只添加一次framework文件
161
+ add_vendered_framework(spec, target.platform.name.to_s, framework_file_path)
162
+ end
163
+ end
164
+ # Clean the source files
165
+ # we just add the prebuilt framework to specific platform and set no source files
166
+ # for all platform, so it doesn't support the sence that 'a pod perbuild for one
167
+ # platform and not for another platform.'
168
+ empty_source_files(spec)
169
+
170
+ # to remove the resurce bundle target.
171
+ # When specify the "resource_bundles" in podspec, xcode will generate a bundle
172
+ # target after pod install. But the bundle have already built when the prebuit
173
+ # phase and saved in the framework folder. We will treat it as a normal resource
174
+ # file.
175
+ # https://github.com/leavez/cocoapods-binary/issues/29
176
+ if spec.attributes_hash["resource_bundles"]
177
+ # bundle_names = spec.attributes_hash["resource_bundles"].keys
178
+ spec.attributes_hash["resource_bundles"] = nil
179
+ spec.attributes_hash["resources"] ||= []
180
+ resources = spec.attributes_hash["resources"] || []
181
+ resources = [resources] if resources.kind_of?(String)
182
+ spec.attributes_hash["resources"] = resources
183
+ # spec.attributes_hash["resources"] += bundle_names.map{|n| n+".bundle"}
184
+ prebuild_bundles = check_sandbox.prebuild_bundles(spec.root.name).each.map { |bundle_path| "_Prebuild/" + bundle_path }
185
+ prebuild_bundles = [] if checked_specs[spec.root.name].size > 1 # spec.root.name相同的只添加一次bundle文件
186
+ spec.attributes_hash["resources"] += prebuild_bundles
187
+ end
188
+
189
+ # to avoid the warning of missing license
190
+ spec.attributes_hash["license"] = {}
191
+ spec.attributes_hash["preserve_paths"] = "**/*"
192
+
193
+ end
194
+
195
+ end
196
+
197
+
198
+ # Override the download step to skip download and prepare file in target folder
199
+ old_method = instance_method(:install_source_of_pod)
200
+ define_method(:install_source_of_pod) do |pod_name|
201
+
202
+ # copy from original
203
+ pod_installer = create_pod_installer(pod_name)
204
+ # \copy from original
205
+
206
+ # copy from original
207
+ pod_installer.install!
208
+ # \copy from original
209
+
210
+ if self.prebuild_pod_names.include? pod_name
211
+ pod_installer.install_for_prebuild!(self.sandbox)
212
+ end
213
+
214
+ # copy from original
215
+ @installed_specs.concat(pod_installer.specs_by_platform.values.flatten.uniq)
216
+ # \copy from original
217
+ end
218
+
219
+ alias_method :old_create_pod_installer, :create_pod_installer
220
+ def create_pod_installer(pod_name)
221
+ pod_installer = old_create_pod_installer(pod_name)
222
+
223
+ pods_to_install = sandbox_state.added | sandbox_state.changed
224
+ unless pods_to_install.include?(pod_name)
225
+ pod_installer.install_for_prebuild!(self.sandbox) if self.prebuild_pod_names.include? pod_name
226
+ end
227
+ pod_installer
228
+ end
229
+ end
230
+ end
231
+
232
+ # A fix in embeded frameworks script.
233
+ #
234
+ # The framework file in pod target folder is a symblink. The EmbedFrameworksScript use `readlink`
235
+ # to read the read path. As the symlink is a relative symlink, readlink cannot handle it well. So
236
+ # we override the `readlink` to a fixed version.
237
+ #
238
+ module Pod
239
+ module Generator
240
+ class EmbedFrameworksScript
241
+
242
+ old_method = instance_method(:script)
243
+ define_method(:script) do
244
+
245
+ script = old_method.bind(self).()
246
+ patch = <<-SH.strip_heredoc
247
+ #!/bin/sh
248
+
249
+ # ---- this is added by cocoapods-binary ---
250
+ # Readlink cannot handle relative symlink well, so we override it to a new one
251
+ # If the path isn't an absolute path, we add a realtive prefix.
252
+ old_read_link=`which readlink`
253
+ readlink () {
254
+ path=`$old_read_link "$1"`;
255
+ if [ $(echo "$path" | cut -c 1-1) = '/' ]; then
256
+ echo $path;
257
+ else
258
+ echo "`dirname $1`/$path";
259
+ fi
260
+ }
261
+ # ---
262
+ SH
263
+
264
+ # patch the rsync for copy dSYM symlink
265
+ script = script.gsub "rsync --delete", "rsync --copy-links --delete"
266
+
267
+ patch + script
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ module Pod
274
+ module Generator
275
+ class CopyXCFrameworksScript
276
+
277
+ alias_method :old_install_xcframework_args, :install_xcframework_args
278
+ def install_xcframework_args(xcframework, slices)
279
+ args = old_install_xcframework_args(xcframework, slices)
280
+ xcconfig_configuration_alias = Jxedt.config.xcconfig_configuration_alias
281
+ match_configuration = Jxedt.config.support_configurations.join('|')
282
+ args.gsub!(/#{xcconfig_configuration_alias}-(#{match_configuration})/, "#{xcconfig_configuration_alias}-${CONFIGURATION}")
283
+ args
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ module Pod
290
+ module Generator
291
+ class CopyResourcesScript
292
+
293
+ alias_method :old_script, :script
294
+ def script
295
+ script = old_script
296
+ xcconfig_configuration_alias = Jxedt.config.xcconfig_configuration_alias
297
+ match_configuration = Jxedt.config.support_configurations.join('|')
298
+ script.gsub!(/#{xcconfig_configuration_alias}-(#{match_configuration})/, "#{xcconfig_configuration_alias}-${CONFIGURATION}")
299
+ script
300
+ end
301
+ end
302
+ end
303
+ end
@@ -0,0 +1,139 @@
1
+ module Jxedt
2
+ def self.config
3
+ Jxedt::Config.instance
4
+ end
5
+
6
+ class Config
7
+ attr_accessor :dsl_config
8
+
9
+ APPLICABLE_DSL_CONFIG = {
10
+ :all_binary => '全部组件允许使用二进制。默认为false',
11
+ :binary_dir => "framework的保存路径,相对于'Pods/Pods.xcodeproj'的相对路径。默认为'../_Prebuild'",
12
+ :binary_switch => "二进制开关,关闭则不hook pre_install过程。默认为true",
13
+ :prebuild_job => "开启编译任务,设置为false则不触发编译。默认为true",
14
+ :dev_pods_enabled => "Development Pods是否支持binary。默认为false",
15
+ :excluded_pods => "排除binary的pods",
16
+ :xcconfig_configuration_alias => "xcconfig文件中configuration的别名,configurations设置为多个值的时候会用到,用于搜索替换。一般不需要设置,有默认值为'cocoapods-jxedt-binary'",
17
+ :framework_header_search_enabled => "设置开启binary的framework是否配置framework的HEADER_SEARCH_PATH,兼容头文件引用的问题。默认为false",
18
+ :silent_build => "静默编译。默认true",
19
+ :configurations => "支持的configuration配置,可以写字符串'Debug'或'Release',也可以写多个'['Debug', 'Release']'。默认为'Release'",
20
+ :xcframework => "编译结果是否为xcframework。默认false",
21
+ :clean_build => "编译的时候是否clean。默认true",
22
+ :bitcode_enabled => "开启bitcode。默认false",
23
+ :device_build_enabled => "编译真机。默认true",
24
+ :simulator_build_enabled => "编译模拟器。默认false",
25
+ :disable_dsym => "禁止编译dsym产物。默认true",
26
+ :build_log_path => "编译的log输出路径",
27
+ :build_args => "编译的配置。了解xcodebuild命令的可以配置编译参数,例如配置 ARCHS='arm64 armv7'",
28
+ }.freeze
29
+
30
+ def initialize()
31
+ @dsl_config = {}
32
+ end
33
+
34
+ def self.instance
35
+ @instance ||= new()
36
+ end
37
+
38
+ def validate_dsl_config
39
+ inapplicable_options = @dsl_config.keys - APPLICABLE_DSL_CONFIG.keys
40
+ return if inapplicable_options.empty?
41
+
42
+ message = <<~HEREDOC
43
+ [WARNING] The following options (in `config_cocoapods_util`) are not correct: #{inapplicable_options}.
44
+ Available options: #{APPLICABLE_DSL_CONFIG}.
45
+ HEREDOC
46
+
47
+ Pod::UI.puts message.yellow
48
+ end
49
+
50
+ def all_binary_enabled?
51
+ @dsl_config[:all_binary] || false
52
+ end
53
+
54
+ def binary_switch?
55
+ @dsl_config[:binary_switch] || @dsl_config[:binary_switch].nil?
56
+ end
57
+
58
+ def prebuild_job?
59
+ @dsl_config[:prebuild_job] || @dsl_config[:prebuild_job].nil?
60
+ end
61
+
62
+ def dev_pods_enabled?
63
+ @dsl_config[:dev_pods_enabled] || false
64
+ end
65
+
66
+ def excluded_pods
67
+ @dsl_config[:excluded_pods] || []
68
+ end
69
+
70
+ def framework_header_search_enabled?
71
+ @dsl_config[:framework_header_search_enabled] || false
72
+ end
73
+
74
+ def binary_dir
75
+ @dsl_config[:binary_dir] || '../_Prebuild'
76
+ end
77
+
78
+ def xcconfig_configuration_alias
79
+ @val ||= begin
80
+ val = @dsl_config[:xcconfig_configuration_alias]
81
+ val = "cocoapods-jxedt-binary" if val.nil? || val.empty?
82
+ val
83
+ end
84
+ end
85
+
86
+ def silent_build?
87
+ @dsl_config[:silent_build] || @dsl_config[:silent_build].nil?
88
+ end
89
+
90
+ def xcframework?
91
+ @dsl_config[:xcframework] || false
92
+ end
93
+
94
+ def clean_build?
95
+ @dsl_config[:clean_build] || @dsl_config[:clean_build].nil?
96
+ end
97
+
98
+ def bitcode_enabled?
99
+ @dsl_config[:bitcode_enabled] || false
100
+ end
101
+
102
+ def disable_dsym?
103
+ @dsl_config[:disable_dsym] || @dsl_config[:disable_dsym].nil?
104
+ end
105
+
106
+ def device_build_enabled?
107
+ @dsl_config[:device_build_enabled] || @dsl_config[:device_build_enabled].nil?
108
+ end
109
+
110
+ def simulator_build_enabled?
111
+ @dsl_config[:simulator_build_enabled] || false
112
+ end
113
+
114
+ def build_log_path
115
+ @dsl_config[:build_log_path]
116
+ end
117
+
118
+ def build_args
119
+ @args ||= begin
120
+ args = @dsl_config[:build_args] || {}
121
+ args[:default] ||= ["ONLY_ACTIVE_ARCH=NO", "BUILD_LIBRARY_FOR_DISTRIBUTION=YES"]
122
+ args[:device] ||= [] # ["ARCHS='arm64 armv7 armv7s'", "ONLY_ACTIVE_ARCH=NO"]
123
+ args[:simulator] ||= [] # ["ARCHS='arm64 x86_64 i386'", "ONLY_ACTIVE_ARCH=NO"]
124
+ args
125
+ end
126
+ end
127
+
128
+ def support_configurations
129
+ @configurations ||= begin
130
+ configurations = []
131
+ user_config = @dsl_config[:configurations]
132
+ configurations << user_config if user_config.is_a?(String)
133
+ configurations += user_config if user_config.is_a?(Array)
134
+ configurations = ["Release"] if configurations.empty?
135
+ configurations
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,78 @@
1
+ # ABOUT NAMES
2
+ #
3
+ # There are many kinds of name in cocoapods. Two main names are widely used in this plugin.
4
+ # - root_spec.name (spec.root_name, targe.pod_name):
5
+ # aka "pod_name"
6
+ # the name we use in podfile. the concept.
7
+ #
8
+ # - target.name:
9
+ # aka "target_name"
10
+ # the name of the final target in xcode project. the final real thing.
11
+ #
12
+ # One pod may have multiple targets in xcode project, due to one pod can be used in mutiple
13
+ # platform simultaneously. So one `root_spec.name` may have multiple coresponding `target.name`s.
14
+ # Therefore, map a spec to/from targets is a little complecated. It's one to many.
15
+ #
16
+
17
+ # Tool to transform Pod_name to target efficiently
18
+ module Pod
19
+ def self.fast_get_targets_for_pod_name(pod_name, targets, cache)
20
+ pod_name_to_targets_hash = nil
21
+ if cache.empty?
22
+ pod_name_to_targets_hash = targets.reduce({}) do |sum, target|
23
+ array = sum[target.pod_name] || []
24
+ array << target
25
+ sum[target.pod_name] = array
26
+ sum
27
+ end
28
+ cache << pod_name_to_targets_hash
29
+ else
30
+ pod_name_to_targets_hash = cache.first
31
+ end
32
+
33
+ pod_name_to_targets_hash[pod_name] || []
34
+ end
35
+ end
36
+
37
+
38
+
39
+
40
+
41
+
42
+ # Target:
43
+
44
+ # def pod_name
45
+ # root_spec.name
46
+ # end
47
+
48
+ # def name
49
+ # pod_name + #{scope_suffix}
50
+ # end
51
+
52
+ # def product_module_name
53
+ # root_spec.module_name
54
+ # end
55
+
56
+ # def framework_name
57
+ # "#{product_module_name}.framework"
58
+ # end
59
+
60
+ # def product_name
61
+ # if requires_frameworks?
62
+ # framework_name
63
+ # else
64
+ # static_library_name
65
+ # end
66
+ # end
67
+
68
+ # def product_basename
69
+ # if requires_frameworks?
70
+ # product_module_name
71
+ # else
72
+ # label
73
+ # end
74
+ # end
75
+
76
+ # def framework_name
77
+ # "#{product_module_name}.framework"
78
+ # end