pod-builder 5.1.1 ā 5.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/exe/pod_builder +105 -77
- data/lib/pod_builder/command/build.rb +41 -41
- data/lib/pod_builder/command/build_swiftmodules.rb +123 -0
- data/lib/pod_builder/command/init.rb +16 -16
- data/lib/pod_builder/command.rb +16 -15
- data/lib/pod_builder/configuration.rb +42 -34
- data/lib/pod_builder/install.rb +92 -90
- data/lib/pod_builder/podfile.rb +66 -59
- data/lib/pod_builder/podfile_item.rb +52 -52
- data/lib/pod_builder/rome/post_install.rb +151 -119
- data/lib/pod_builder/templates/build_podfile.template +1 -1
- data/lib/pod_builder/version.rb +1 -1
- metadata +3 -2
@@ -0,0 +1,123 @@
|
|
1
|
+
require "pod_builder/core"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module PodBuilder
|
5
|
+
module Command
|
6
|
+
class CompileSwiftModules
|
7
|
+
def self.call
|
8
|
+
Configuration.check_inited
|
9
|
+
|
10
|
+
Podfile.sanity_check()
|
11
|
+
|
12
|
+
puts "Loading Podfile".yellow
|
13
|
+
|
14
|
+
quiet = OPTIONS.fetch(:quiet, false)
|
15
|
+
|
16
|
+
install_update_repo = OPTIONS.fetch(:update_repos, true)
|
17
|
+
installer, analyzer = Analyze.installer_at(PodBuilder::basepath, install_update_repo)
|
18
|
+
|
19
|
+
all_buildable_items = Analyze.podfile_items(installer, analyzer)
|
20
|
+
|
21
|
+
iphoneos_sdk_path = `xcrun --sdk iphoneos --show-sdk-path`.strip
|
22
|
+
sim_sdk_path = `xcrun --sdk iphonesimulator --show-sdk-path`.strip
|
23
|
+
|
24
|
+
swiftinterfaces_paths = Dir.glob("#{PodBuilder::git_rootpath}/**/*.framework/**/*.swiftinterface").reject { |t| t.include?(".private.") }
|
25
|
+
frameworks_paths = Dir.glob("#{PodBuilder::git_rootpath}/**/*.framework")
|
26
|
+
swiftinterfaces_paths = filter_unexpected_pods_locations(swiftinterfaces_paths)
|
27
|
+
frameworks_paths = filter_unexpected_pods_locations(frameworks_paths)
|
28
|
+
|
29
|
+
all_buildable_items.uniq(&:root_name).map(&:root_name).each do |name|
|
30
|
+
items = all_buildable_items.select { |t| t.root_name == name }
|
31
|
+
module_name = items.first.module_name
|
32
|
+
|
33
|
+
vendored_frameworks = items.map(&:vendored_frameworks).flatten
|
34
|
+
|
35
|
+
deps = items.map { |t| t.recursive_dependencies(all_buildable_items) }.flatten
|
36
|
+
vendored_frameworks += deps.map(&:vendored_frameworks).flatten
|
37
|
+
deps.uniq! { |t| t.root_name }
|
38
|
+
|
39
|
+
swiftinterfaces_and_arch_for_module(module_name, swiftinterfaces_paths).each do |dep_swiftinterface_path, arch|
|
40
|
+
swiftmodule_dest = "#{File.dirname(dep_swiftinterface_path)}/#{arch}.swiftmodule"
|
41
|
+
if File.exist?(swiftmodule_dest) && !OPTIONS.has_key?(:force_rebuild)
|
42
|
+
puts "Swiftmodule exists, skipping #{dep_swiftinterface_path}".magenta if !quiet
|
43
|
+
next
|
44
|
+
end
|
45
|
+
|
46
|
+
puts "Processing #{dep_swiftinterface_path}".yellow if !quiet
|
47
|
+
|
48
|
+
frameworks_search_paths = []
|
49
|
+
deps.each do |dep|
|
50
|
+
frameworks_search_paths << framework_path_for_module_name(dep.module_name, arch, swiftinterfaces_paths, frameworks_paths)
|
51
|
+
end
|
52
|
+
vendored_frameworks.each do |vendored_framework|
|
53
|
+
frameworks_search_paths << framework_path_for_module_name(File.basename(vendored_framework, ".*"), arch, swiftinterfaces_paths, frameworks_paths)
|
54
|
+
end
|
55
|
+
frameworks_search_paths_arg = frameworks_search_paths.compact.map { |t| "-F '#{File.dirname(t)}'" }.join(" ")
|
56
|
+
|
57
|
+
sdk_path = arch.include?("simulator") ? sim_sdk_path : iphoneos_sdk_path
|
58
|
+
cmd = "" "swiftc -frontend \
|
59
|
+
-compile-module-from-interface \
|
60
|
+
-enable-library-evolution \
|
61
|
+
-import-underlying-module \
|
62
|
+
-sdk '#{sdk_path}' \
|
63
|
+
-Fsystem '#{sdk_path}/System/Library/Frameworks/' \
|
64
|
+
-module-name #{module_name} \
|
65
|
+
#{frameworks_search_paths_arg} \
|
66
|
+
-o '#{swiftmodule_dest}' \
|
67
|
+
'#{dep_swiftinterface_path}'
|
68
|
+
" ""
|
69
|
+
|
70
|
+
unless system(cmd)
|
71
|
+
puts "Failed generating swiftmodules for #{module_name} and arch #{arch}".red
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
puts "\n\nš done!\n".green
|
77
|
+
return 0
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.swiftinterfaces_and_arch_for_module(module_name, swiftinterfaces_paths)
|
81
|
+
swiftinterfaces_paths.select { |t| t.include?("/#{module_name}.xcframework") }.map { |t| [t, File.basename(t, ".*")] }
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.framework_path_for_module_name(module_name, arch, swiftinterfaces_paths, frameworks_paths)
|
85
|
+
quiet = OPTIONS.fetch(:quiet, false)
|
86
|
+
|
87
|
+
if (path = swiftinterfaces_paths.detect { |t| t.include?("/#{module_name}.framework/Modules/#{module_name}.swiftmodule/#{arch}") }) &&
|
88
|
+
(match = path.match(/(.*#{module_name}.framework)/)) && match&.size == 2
|
89
|
+
return match[1]
|
90
|
+
end
|
91
|
+
|
92
|
+
archs = arch.split("-").reject { |t| ["apple", "ios"].include?(t) }
|
93
|
+
frameworks_paths = frameworks_paths.select { |t| t.include?("#{module_name}.framework") }
|
94
|
+
|
95
|
+
frameworks_paths.select! { |t| t.include?("-simulator/") == arch.include?("simulator") }
|
96
|
+
frameworks_paths.select! { |t| t.include?("/ios-") } # currently we support only iOS xcframeworks
|
97
|
+
frameworks_paths.reject! { |t| t.include?("maccatalyst/") } # currently we do not support catalyst xcframeworks
|
98
|
+
|
99
|
+
frameworks_paths.select! { |t| archs.any? { |u| t.include?(u) } }
|
100
|
+
|
101
|
+
if frameworks_paths.count == 1
|
102
|
+
return frameworks_paths[0]
|
103
|
+
end
|
104
|
+
|
105
|
+
puts "Failed determining framework for #{module_name}" unless quiet
|
106
|
+
return nil
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.filter_unexpected_pods_locations(paths)
|
110
|
+
# A project might contain multiple /Pods/ folders in subprojects. We should extract only those related to the PodBuilder project
|
111
|
+
paths.reject { |t| t.include?("/Pods/") && !t.include?(PodBuilder::project_path) }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class Pod::Specification
|
118
|
+
public
|
119
|
+
|
120
|
+
def defined_in_folder
|
121
|
+
File.dirname(defined_in_file)
|
122
|
+
end
|
123
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "pod_builder/core"
|
2
2
|
|
3
3
|
module PodBuilder
|
4
4
|
module Command
|
@@ -11,7 +11,7 @@ module PodBuilder
|
|
11
11
|
raise "\n\nToo many xcworkspaces found in current folder\n#{xcworkspace}\n".red if xcworkspace.count > 1
|
12
12
|
|
13
13
|
Configuration.project_name = File.basename(xcworkspace.first, ".*")
|
14
|
-
|
14
|
+
|
15
15
|
OPTIONS[:prebuild_path] ||= Configuration.base_path
|
16
16
|
|
17
17
|
if File.expand_path(OPTIONS[:prebuild_path]) != OPTIONS[:prebuild_path] # if not absolute
|
@@ -30,8 +30,8 @@ module PodBuilder
|
|
30
30
|
FileUtils.cp(project_podfile_path, prebuilt_podfile_path)
|
31
31
|
|
32
32
|
podfile_content = File.read(prebuilt_podfile_path)
|
33
|
-
|
34
|
-
podfile_content = Podfile.add_configuration_load_block(podfile_content)
|
33
|
+
|
34
|
+
podfile_content = Podfile.add_configuration_load_block(podfile_content)
|
35
35
|
podfile_content = Podfile.add_install_block(podfile_content)
|
36
36
|
podfile_content = Podfile.update_path_entries(podfile_content, Init.method(:podfile_path_transform))
|
37
37
|
podfile_content = Podfile.update_project_entries(podfile_content, Init.method(:podfile_path_transform))
|
@@ -52,7 +52,7 @@ module PodBuilder
|
|
52
52
|
return 0
|
53
53
|
end
|
54
54
|
|
55
|
-
private
|
55
|
+
private
|
56
56
|
|
57
57
|
def self.write_gitignore
|
58
58
|
source_path_rel_path = "Sources"
|
@@ -65,17 +65,17 @@ module PodBuilder
|
|
65
65
|
Configuration.lldbinit_name,
|
66
66
|
source_path_rel_path,
|
67
67
|
development_pods_config_rel_path]
|
68
|
-
|
68
|
+
|
69
69
|
if Configuration.react_native_project
|
70
70
|
git_ignores.push("build/")
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
File.write("#{OPTIONS[:prebuild_path]}/.gitignore", git_ignores.join("\n"))
|
74
74
|
end
|
75
75
|
|
76
76
|
def self.write_gitattributes
|
77
77
|
git_attributes = ["#{Configuration.prebuilt_info_filename} binary"]
|
78
|
-
|
78
|
+
|
79
79
|
File.write("#{OPTIONS[:prebuild_path]}/.gitattributes", git_attributes.join("\n"))
|
80
80
|
end
|
81
81
|
|
@@ -85,15 +85,15 @@ module PodBuilder
|
|
85
85
|
original_basepath = PodBuilder::project_path
|
86
86
|
|
87
87
|
podfile_base_path = Pathname.new(File.dirname(podfile_path))
|
88
|
-
|
88
|
+
|
89
89
|
original_path = Pathname.new(File.join(original_basepath, path))
|
90
90
|
replace_path = original_path.relative_path_from(podfile_base_path)
|
91
91
|
if use_absolute_paths
|
92
92
|
replace_path = replace_path.expand_path(podfile_base_path)
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
return replace_path
|
96
|
-
end
|
96
|
+
end
|
97
97
|
|
98
98
|
def self.update_gemfile
|
99
99
|
gemfile_path = File.join(PodBuilder::home, "Gemfile")
|
@@ -112,10 +112,10 @@ module PodBuilder
|
|
112
112
|
|
113
113
|
gemfile_lines.insert(0, source_line)
|
114
114
|
gemfile_lines.push(podbuilder_line)
|
115
|
-
|
115
|
+
|
116
116
|
File.write(gemfile_path, gemfile_lines.join("\n"))
|
117
117
|
|
118
|
-
Dir.chdir(PodBuilder::home) do
|
118
|
+
Dir.chdir(PodBuilder::home) do
|
119
119
|
system("bundle")
|
120
120
|
end
|
121
121
|
end
|
@@ -131,11 +131,11 @@ module PodBuilder
|
|
131
131
|
raise "\n\nUnexpected number of #{file} found\n".red if paths.count != 1
|
132
132
|
|
133
133
|
content = File.read(paths[0])
|
134
|
-
expected_header_search_path_prefix = "
|
134
|
+
expected_header_search_path_prefix = "header_search_paths = ["
|
135
135
|
raise "\n\nExpected header search path entry not found\n".red unless content.include?(expected_header_search_path_prefix)
|
136
136
|
|
137
|
-
content.sub!(expected_header_search_path_prefix, "#{expected_header_search_path_prefix}
|
138
|
-
File.write(paths[0], content)
|
137
|
+
content.sub!(expected_header_search_path_prefix, "#{expected_header_search_path_prefix}\n \"$(PODS_ROOT)/Headers/Public/Flipper-Folly\",")
|
138
|
+
File.write(paths[0], content)
|
139
139
|
|
140
140
|
# React-CoreModules.podspec
|
141
141
|
file = "React-CoreModules.podspec"
|
data/lib/pod_builder/command.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
1
|
+
require "pod_builder/command/none"
|
2
|
+
require "pod_builder/command/build"
|
3
|
+
require "pod_builder/command/build_all"
|
4
|
+
require "pod_builder/command/update"
|
5
|
+
require "pod_builder/command/restore_all"
|
6
|
+
require "pod_builder/command/init"
|
7
|
+
require "pod_builder/command/clean"
|
8
|
+
require "pod_builder/command/deintegrate"
|
9
|
+
require "pod_builder/command/generate_podspec"
|
10
|
+
require "pod_builder/command/install_sources"
|
11
|
+
require "pod_builder/command/switch"
|
12
|
+
require "pod_builder/command/switch_all"
|
13
|
+
require "pod_builder/command/sync_podfile"
|
14
|
+
require "pod_builder/command/info"
|
15
|
+
require "pod_builder/command/generate_lldbinit"
|
16
|
+
require "pod_builder/command/build_swiftmodules"
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "json"
|
2
|
+
require "tmpdir"
|
3
3
|
|
4
|
-
module PodBuilder
|
5
|
-
class Configuration
|
4
|
+
module PodBuilder
|
5
|
+
class Configuration
|
6
6
|
# Remember to update README.md accordingly
|
7
7
|
DEFAULT_BUILD_SETTINGS = {
|
8
8
|
"ENABLE_BITCODE" => "NO",
|
@@ -12,46 +12,46 @@ module PodBuilder
|
|
12
12
|
"CODE_SIGN_IDENTITY" => "",
|
13
13
|
"CODE_SIGNING_REQUIRED" => "NO",
|
14
14
|
"CODE_SIGN_ENTITLEMENTS" => "",
|
15
|
-
"CODE_SIGNING_ALLOWED" => "NO"
|
15
|
+
"CODE_SIGNING_ALLOWED" => "NO",
|
16
16
|
}.freeze
|
17
17
|
DEFAULT_SPEC_OVERRIDE = {
|
18
18
|
"Google-Mobile-Ads-SDK" => {
|
19
|
-
"module_name": "GoogleMobileAds"
|
19
|
+
"module_name": "GoogleMobileAds",
|
20
20
|
},
|
21
21
|
"glog" => {
|
22
|
-
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" }
|
22
|
+
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" },
|
23
23
|
},
|
24
24
|
"DoubleConversion" => {
|
25
|
-
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" }
|
25
|
+
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" },
|
26
26
|
},
|
27
27
|
"Folly" => {
|
28
|
-
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" }
|
28
|
+
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" },
|
29
29
|
},
|
30
30
|
"Flipper-DoubleConversion" => {
|
31
|
-
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" }
|
31
|
+
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" },
|
32
32
|
},
|
33
33
|
"Flipper-Folly" => {
|
34
|
-
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" }
|
35
|
-
}
|
34
|
+
"pod_target_xcconfig": { "DEFINES_MODULE": "NO" },
|
35
|
+
},
|
36
36
|
}.freeze
|
37
37
|
DEFAULT_BUILD_SETTINGS_OVERRIDES = {
|
38
38
|
"SBTUITestTunnelClient" => {
|
39
|
-
"ENABLE_BITCODE": "NO"
|
40
|
-
}
|
39
|
+
"ENABLE_BITCODE": "NO",
|
40
|
+
},
|
41
41
|
}.freeze
|
42
|
-
|
42
|
+
|
43
43
|
private_constant :DEFAULT_BUILD_SETTINGS
|
44
44
|
private_constant :DEFAULT_BUILD_SETTINGS_OVERRIDES
|
45
45
|
private_constant :DEFAULT_SPEC_OVERRIDE
|
46
|
-
|
47
|
-
class <<self
|
46
|
+
|
47
|
+
class << self
|
48
48
|
attr_accessor :allow_building_development_pods
|
49
49
|
attr_accessor :build_settings
|
50
50
|
attr_accessor :build_settings_overrides
|
51
51
|
attr_accessor :build_system
|
52
52
|
attr_accessor :library_evolution_support
|
53
53
|
attr_accessor :base_path
|
54
|
-
attr_accessor :spec_overrides
|
54
|
+
attr_accessor :spec_overrides
|
55
55
|
attr_accessor :skip_licenses
|
56
56
|
attr_accessor :skip_pods
|
57
57
|
attr_accessor :force_prebuild_pods
|
@@ -75,6 +75,7 @@ module PodBuilder
|
|
75
75
|
attr_accessor :build_xcframeworks_all
|
76
76
|
attr_accessor :build_xcframeworks_include
|
77
77
|
attr_accessor :build_xcframeworks_exclude
|
78
|
+
attr_accessor :keep_swiftmodules
|
78
79
|
attr_accessor :pre_actions
|
79
80
|
attr_accessor :post_actions
|
80
81
|
attr_accessor :development_team
|
@@ -116,27 +117,29 @@ module PodBuilder
|
|
116
117
|
@build_xcframeworks_include = []
|
117
118
|
@build_xcframeworks_exclude = []
|
118
119
|
|
120
|
+
@keep_swiftmodules = false
|
121
|
+
|
119
122
|
@pre_actions = {}
|
120
123
|
@post_actions = {}
|
121
124
|
|
122
125
|
@development_team = ""
|
123
126
|
@development_language = nil
|
124
|
-
|
127
|
+
|
125
128
|
def self.check_inited
|
126
129
|
raise "\n\nNot inited, run `pod_builder init`\n".red if podbuilder_path.nil?
|
127
130
|
end
|
128
|
-
|
131
|
+
|
129
132
|
def self.exists
|
130
133
|
return !config_path.nil? && File.exist?(config_path)
|
131
134
|
end
|
132
|
-
|
135
|
+
|
133
136
|
def self.load
|
134
137
|
unless podbuilder_path
|
135
138
|
return
|
136
139
|
end
|
137
|
-
|
140
|
+
|
138
141
|
Configuration.base_path = podbuilder_path
|
139
|
-
|
142
|
+
|
140
143
|
if exists
|
141
144
|
begin
|
142
145
|
json = JSON.parse(File.read(config_path))
|
@@ -239,6 +242,11 @@ module PodBuilder
|
|
239
242
|
Configuration.build_xcframeworks_exclude = value
|
240
243
|
end
|
241
244
|
end
|
245
|
+
if value = json["keep_swiftmodules"]
|
246
|
+
if [TrueClass, FalseClass].include?(value.class)
|
247
|
+
Configuration.keep_swiftmodules = value
|
248
|
+
end
|
249
|
+
end
|
242
250
|
if value = json["pre_actions"]
|
243
251
|
if value.is_a?(Hash)
|
244
252
|
Configuration.pre_actions = PodBuilder::Actions.load(value)
|
@@ -263,12 +271,12 @@ module PodBuilder
|
|
263
271
|
|
264
272
|
sanity_check()
|
265
273
|
end
|
266
|
-
|
274
|
+
|
267
275
|
dev_pods_configuration_path = File.join(Configuration.base_path, Configuration.dev_pods_configuration_filename)
|
268
|
-
|
276
|
+
|
269
277
|
if File.exist?(dev_pods_configuration_path)
|
270
278
|
begin
|
271
|
-
json = JSON.parse(File.read(dev_pods_configuration_path))
|
279
|
+
json = JSON.parse(File.read(dev_pods_configuration_path))
|
272
280
|
rescue => exception
|
273
281
|
raise "\n\n#{File.basename(dev_pods_configuration_path)} is an invalid JSON\n".red
|
274
282
|
end
|
@@ -282,10 +290,10 @@ module PodBuilder
|
|
282
290
|
lockfile_path = File.join(PodBuilder::home, lockfile_name)
|
283
291
|
end
|
284
292
|
end
|
285
|
-
|
293
|
+
|
286
294
|
def self.write
|
287
295
|
config = {}
|
288
|
-
|
296
|
+
|
289
297
|
config["project_name"] = Configuration.project_name
|
290
298
|
config["spec_overrides"] = Configuration.spec_overrides
|
291
299
|
config["skip_licenses"] = Configuration.skip_licenses
|
@@ -304,11 +312,11 @@ module PodBuilder
|
|
304
312
|
config["react_native_project"] = Configuration.react_native_project
|
305
313
|
config["development_team"] = Configuration.development_team
|
306
314
|
config["development_language"] = Configuration.development_language || "en"
|
307
|
-
|
315
|
+
|
308
316
|
File.write(config_path, JSON.pretty_generate(config))
|
309
317
|
end
|
310
|
-
|
311
|
-
private
|
318
|
+
|
319
|
+
private
|
312
320
|
|
313
321
|
def self.sanity_check
|
314
322
|
Configuration.skip_pods.each do |pod|
|
@@ -322,12 +330,12 @@ module PodBuilder
|
|
322
330
|
raise "\n\nInvalid PodBuilder.json configuration: 'build_xcframeworks_all' is false and 'build_xcframeworks_exclude' is not empty\n".red if Configuration.build_xcframeworks_exclude.count > 0
|
323
331
|
end
|
324
332
|
end
|
325
|
-
|
333
|
+
|
326
334
|
def self.config_path
|
327
335
|
unless path = podbuilder_path
|
328
336
|
return nil
|
329
337
|
end
|
330
|
-
|
338
|
+
|
331
339
|
return File.join(path, Configuration.configuration_filename)
|
332
340
|
end
|
333
341
|
|
@@ -346,5 +354,5 @@ module PodBuilder
|
|
346
354
|
|
347
355
|
return path
|
348
356
|
end
|
349
|
-
end
|
357
|
+
end
|
350
358
|
end
|