pod-builder 5.1.1 → 5.1.2
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 +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
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "fourflusher"
|
2
|
+
require "colored"
|
3
|
+
require "pathname"
|
4
4
|
|
5
5
|
module PodBuilder
|
6
6
|
class XcodeBuildSettings
|
@@ -11,7 +11,7 @@ module PodBuilder
|
|
11
11
|
def initialize(platform_name, configuration)
|
12
12
|
@platform_name = platform_name
|
13
13
|
@configuration = configuration
|
14
|
-
|
14
|
+
|
15
15
|
case platform_name
|
16
16
|
when "iphoneos" then @build_destination = "generic/platform=iOS"
|
17
17
|
when "iphonesimulator" then @build_destination = "generic/platform=iOS Simulator"
|
@@ -21,42 +21,43 @@ module PodBuilder
|
|
21
21
|
when "tvossimulator" then @build_destination = "generic/platform=tvOS Simulator"
|
22
22
|
when "watchos" then @build_destination = "generic/platform=watchOS"
|
23
23
|
when "watchossimulator" then @build_destination = "generic/platform=watchOS Simulator"
|
24
|
-
else raise "\n\nUnknown platform '#{platform_name}'\n".red
|
24
|
+
else raise "\n\nUnknown platform '#{platform_name}'\n".red
|
25
|
+
end
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
def self.build_for_iosish_platform_framework(sandbox, build_dir, target, device, simulator, configuration, deterministic_build)
|
29
|
+
def self.build_for_iosish_platform_framework(sandbox, build_dir, target, device, simulator, configuration, deterministic_build)
|
29
30
|
dsym_device_folder = File.join(build_dir, "dSYM", device)
|
30
31
|
dsym_simulator_folder = File.join(build_dir, "dSYM", simulator)
|
31
32
|
FileUtils.mkdir_p(dsym_device_folder)
|
32
33
|
FileUtils.mkdir_p(dsym_simulator_folder)
|
33
|
-
|
34
|
+
|
34
35
|
deployment_target = target.platform_deployment_target
|
35
36
|
target_label = target.cocoapods_target_label
|
36
|
-
|
37
|
+
|
37
38
|
xcodebuild(sandbox, target_label, device, deployment_target, configuration, deterministic_build, [], {})
|
38
39
|
excluded_archs = ["i386"] # Fixes https://github.com/Subito-it/PodBuilder/issues/17
|
39
40
|
excluded_archs += ["arm64"] # Exclude apple silicon slice
|
40
41
|
xcodebuild(sandbox, target_label, simulator, deployment_target, configuration, deterministic_build, excluded_archs, {})
|
41
|
-
|
42
|
+
|
42
43
|
spec_names = target.specs.map { |spec| [spec.root.name, spec.root.module_name] }.uniq
|
43
44
|
spec_names.each do |root_name, module_name|
|
44
|
-
device_base = "#{build_dir}/#{configuration}-#{device}/#{root_name}"
|
45
|
+
device_base = "#{build_dir}/#{configuration}-#{device}/#{root_name}"
|
45
46
|
device_lib = "#{device_base}/#{module_name}.framework/#{module_name}"
|
46
47
|
device_dsym = "#{device_base}/#{module_name}.framework.dSYM"
|
47
48
|
device_framework_lib = File.dirname(device_lib)
|
48
49
|
device_swift_header_path = "#{device_framework_lib}/Headers/#{module_name}-Swift.h"
|
49
|
-
|
50
|
+
|
50
51
|
simulator_base = "#{build_dir}/#{configuration}-#{simulator}/#{root_name}"
|
51
52
|
simulator_lib = "#{simulator_base}/#{module_name}.framework/#{module_name}"
|
52
53
|
simulator_dsym = "#{simulator_base}/#{module_name}.framework.dSYM"
|
53
54
|
simulator_framework_lib = File.dirname(simulator_lib)
|
54
55
|
simulator_swift_header_path = "#{simulator_framework_lib}/Headers/#{module_name}-Swift.h"
|
55
|
-
|
56
|
+
|
56
57
|
next unless File.file?(device_lib) && File.file?(simulator_lib)
|
57
|
-
|
58
|
+
|
58
59
|
# Starting with Xcode 12b3 the simulator binary contains an arm64 slice as well which conflict with the one in the device_lib
|
59
|
-
# when creating the fat library. A naive workaround is to remove the arm64 from the simulator_lib however this is wrong because
|
60
|
+
# when creating the fat library. A naive workaround is to remove the arm64 from the simulator_lib however this is wrong because
|
60
61
|
# we might actually need to have 2 separated arm64 slices, one for simulator and one for device each built with different
|
61
62
|
# compile time directives (e.g #if targetEnvironment(simulator))
|
62
63
|
#
|
@@ -64,50 +65,50 @@ module PodBuilder
|
|
64
65
|
if `xcrun lipo -info #{simulator_lib}`.include?("arm64")
|
65
66
|
`xcrun lipo -remove arm64 #{simulator_lib} -o #{simulator_lib}`
|
66
67
|
end
|
67
|
-
|
68
|
+
|
68
69
|
raise "\n\nLipo failed on #{device_lib}\n".red unless system("xcrun lipo -create -output #{device_lib} #{device_lib} #{simulator_lib}")
|
69
|
-
|
70
|
+
|
70
71
|
merge_header_into(device_swift_header_path, simulator_swift_header_path)
|
71
|
-
|
72
|
-
# Merge device framework into simulator framework (so that e.g swift Module folder is merged)
|
72
|
+
|
73
|
+
# Merge device framework into simulator framework (so that e.g swift Module folder is merged)
|
73
74
|
# letting device framework files overwrite simulator ones
|
74
|
-
FileUtils.cp_r(File.join(device_framework_lib, "."), simulator_framework_lib)
|
75
|
+
FileUtils.cp_r(File.join(device_framework_lib, "."), simulator_framework_lib)
|
75
76
|
source_lib = File.dirname(simulator_framework_lib)
|
76
|
-
|
77
|
+
|
77
78
|
FileUtils.mv(device_dsym, dsym_device_folder) if File.exist?(device_dsym)
|
78
79
|
FileUtils.mv(simulator_dsym, dsym_simulator_folder) if File.exist?(simulator_dsym)
|
79
|
-
|
80
|
+
|
80
81
|
FileUtils.mv(source_lib, build_dir)
|
81
|
-
|
82
|
+
|
82
83
|
# Remove frameworks leaving dSYMs
|
83
|
-
FileUtils.rm_rf(device_framework_lib)
|
84
|
+
FileUtils.rm_rf(device_framework_lib)
|
84
85
|
FileUtils.rm_rf(simulator_framework_lib)
|
85
86
|
end
|
86
87
|
end
|
87
|
-
|
88
|
-
def self.build_for_iosish_platform_lib(sandbox, build_dir, target, device, simulator, configuration, deterministic_build, prebuilt_root_paths)
|
88
|
+
|
89
|
+
def self.build_for_iosish_platform_lib(sandbox, build_dir, target, device, simulator, configuration, deterministic_build, prebuilt_root_paths)
|
89
90
|
deployment_target = target.platform_deployment_target
|
90
91
|
target_label = target.cocoapods_target_label
|
91
|
-
|
92
|
+
|
92
93
|
spec_names = target.specs.map { |spec| [spec.root.name, spec.root.module_name] }.uniq
|
93
|
-
|
94
|
+
|
94
95
|
xcodebuild(sandbox, target_label, device, deployment_target, configuration, deterministic_build, [], prebuilt_root_paths)
|
95
96
|
excluded_archs = ["arm64"] # Exclude Apple silicon slice
|
96
97
|
xcodebuild(sandbox, target_label, simulator, deployment_target, configuration, deterministic_build, excluded_archs, prebuilt_root_paths)
|
97
|
-
|
98
|
+
|
98
99
|
spec_names.each do |root_name, module_name|
|
99
100
|
simulator_base = "#{build_dir}/#{configuration}-#{simulator}/#{root_name}"
|
100
101
|
simulator_lib = "#{simulator_base}/lib#{root_name}.a"
|
101
|
-
|
102
|
-
device_base = "#{build_dir}/#{configuration}-#{device}/#{root_name}"
|
102
|
+
|
103
|
+
device_base = "#{build_dir}/#{configuration}-#{device}/#{root_name}"
|
103
104
|
device_lib = "#{device_base}/lib#{root_name}.a"
|
104
|
-
|
105
|
+
|
105
106
|
unless File.file?(device_lib) && File.file?(simulator_lib)
|
106
107
|
next
|
107
108
|
end
|
108
|
-
|
109
|
+
|
109
110
|
# Starting with Xcode 12b3 the simulator binary contains an arm64 slice as well which conflict with the one in the device_lib
|
110
|
-
# when creating the fat library. A naive workaround is to remove the arm64 from the simulator_lib however this is wrong because
|
111
|
+
# when creating the fat library. A naive workaround is to remove the arm64 from the simulator_lib however this is wrong because
|
111
112
|
# we might actually need to have 2 separated arm64 slices, one for simulator and one for device each built with different
|
112
113
|
# compile time directives (e.g #if targetEnvironment(simulator))
|
113
114
|
#
|
@@ -115,16 +116,16 @@ module PodBuilder
|
|
115
116
|
if `xcrun lipo -info #{simulator_lib}`.include?("arm64")
|
116
117
|
`xcrun lipo -remove arm64 #{simulator_lib} -o #{simulator_lib}`
|
117
118
|
end
|
118
|
-
|
119
|
+
|
119
120
|
raise "\n\nLipo failed on #{device_lib}\n".red unless system("xcrun lipo -create -output #{device_lib} #{device_lib} #{simulator_lib}")
|
120
|
-
|
121
|
+
|
121
122
|
device_headers = Dir.glob("#{device_base}/**/*.h")
|
122
123
|
simulator_headers = Dir.glob("#{simulator_base}/**/*.h")
|
123
124
|
device_headers.each do |device_path|
|
124
125
|
simulator_path = device_path.gsub(device_base, simulator_base)
|
125
|
-
|
126
|
+
|
126
127
|
merge_header_into(device_path, simulator_path)
|
127
|
-
end
|
128
|
+
end
|
128
129
|
simulator_only_headers = simulator_headers - device_headers.map { |t| t.gsub(device_base, simulator_base) }
|
129
130
|
simulator_only_headers.each do |path|
|
130
131
|
add_simulator_conditional(path)
|
@@ -133,21 +134,21 @@ module PodBuilder
|
|
133
134
|
FileUtils.mkdir_p(destination_folder)
|
134
135
|
FileUtils.cp(path, destination_folder)
|
135
136
|
end
|
136
|
-
|
137
|
+
|
137
138
|
swiftmodule_path = "#{simulator_base}/#{root_name}.swiftmodule"
|
138
139
|
if File.directory?(swiftmodule_path)
|
139
140
|
FileUtils.cp_r("#{swiftmodule_path}/.", "#{device_base}/#{root_name}.swiftmodule")
|
140
141
|
end
|
141
|
-
|
142
|
+
|
142
143
|
if File.exist?("#{device_base}/#{root_name}.swiftmodule")
|
143
144
|
# This is a swift pod with a swiftmodule in the root of the prebuilt folder
|
144
145
|
else
|
145
146
|
# Objective-C pods have the swiftmodule generated under Pods/Headers/Public
|
146
147
|
public_headers_path = "#{Configuration.build_path}/Pods/Headers/Public/#{root_name}"
|
147
|
-
module_public_headers_path = "#{Configuration.build_path}/Pods/Headers/Public/#{module_name}"
|
148
|
+
module_public_headers_path = "#{Configuration.build_path}/Pods/Headers/Public/#{module_name}"
|
148
149
|
if public_headers_path.downcase != module_public_headers_path.downcase && File.directory?(public_headers_path) && File.directory?(module_public_headers_path)
|
149
150
|
# For pods with module_name != name we have to move the modulemap files to the root_name one
|
150
|
-
module_public_headers_path = "#{Configuration.build_path}/Pods/Headers/Public/#{module_name}"
|
151
|
+
module_public_headers_path = "#{Configuration.build_path}/Pods/Headers/Public/#{module_name}"
|
151
152
|
FileUtils.cp_r("#{module_public_headers_path}/.", public_headers_path, :remove_destination => true)
|
152
153
|
end
|
153
154
|
Dir.glob("#{public_headers_path}/**/*.*").each do |path|
|
@@ -155,29 +156,29 @@ module PodBuilder
|
|
155
156
|
destination_folder = File.dirname(destination_folder)
|
156
157
|
FileUtils.mkdir_p(destination_folder)
|
157
158
|
FileUtils.cp(path, destination_folder)
|
158
|
-
end
|
159
|
+
end
|
159
160
|
end
|
160
|
-
|
161
|
+
|
161
162
|
destination_path = "#{build_dir}/#{root_name}"
|
162
163
|
if Dir.glob("#{device_base}/**/*.{a,framework,h}").count > 0
|
163
164
|
FileUtils.mv(device_base, destination_path)
|
164
|
-
|
165
|
+
|
165
166
|
module_maps = Dir.glob("#{destination_path}/**/*.modulemap")
|
166
167
|
module_map_device_base = device_base.gsub(/^\/private/, "") + "/"
|
167
168
|
module_maps.each do |module_map|
|
168
169
|
content = File.read(module_map)
|
169
170
|
content.gsub!(module_map_device_base, "")
|
170
171
|
File.write(module_map, content)
|
171
|
-
end
|
172
|
+
end
|
172
173
|
end
|
173
174
|
end
|
174
175
|
end
|
175
|
-
|
176
|
+
|
176
177
|
def self.merge_header_into(device_file, simulator_file)
|
177
178
|
unless File.exist?(device_file) || File.exist?(simulator_file)
|
178
179
|
return
|
179
180
|
end
|
180
|
-
|
181
|
+
|
181
182
|
device_content = File.file?(device_file) ? File.read(device_file) : ""
|
182
183
|
simulator_content = File.file?(simulator_file) ? File.read(simulator_file) : ""
|
183
184
|
merged_content = %{
|
@@ -194,27 +195,27 @@ module PodBuilder
|
|
194
195
|
|
195
196
|
// ->
|
196
197
|
#endif
|
197
|
-
}
|
198
|
+
}
|
198
199
|
File.write(device_file, merged_content)
|
199
|
-
end
|
200
|
-
|
200
|
+
end
|
201
|
+
|
201
202
|
def self.add_simulator_conditional(path)
|
202
203
|
file_content = File.read(path)
|
203
204
|
content = %{
|
204
205
|
#if TARGET_OS_SIMULATOR
|
205
206
|
#{file_content}
|
206
207
|
#endif
|
207
|
-
}
|
208
|
+
}
|
208
209
|
File.write(path, content)
|
209
210
|
end
|
210
|
-
|
211
|
-
def self.xcodebuild(sandbox, target, sdk=
|
211
|
+
|
212
|
+
def self.xcodebuild(sandbox, target, sdk = "macosx", deployment_target = nil, configuration, deterministic_build, exclude_archs, prebuilt_root_paths)
|
212
213
|
args = %W(-project #{sandbox.project_path.realdirpath} -scheme #{target} -configuration #{configuration} -sdk #{sdk})
|
213
|
-
supported_platforms = {
|
214
|
+
supported_platforms = { "iphonesimulator" => "iOS", "appletvsimulator" => "tvOS", "watchsimulator" => "watchOS" }
|
214
215
|
if platform = supported_platforms[sdk]
|
215
216
|
args += Fourflusher::SimControl.new.destination(:oldest, platform, deployment_target) unless platform.nil?
|
216
217
|
end
|
217
|
-
|
218
|
+
|
218
219
|
xcodebuild_version = `xcodebuild -version | head -n1 | awk '{print $2}'`.strip().to_f
|
219
220
|
if exclude_archs.count > 0 && xcodebuild_version >= 12.0
|
220
221
|
args += ["EXCLUDED_ARCHS=#{exclude_archs.join(" ")}"]
|
@@ -222,25 +223,25 @@ module PodBuilder
|
|
222
223
|
prebuilt_root_paths.each do |k, v|
|
223
224
|
args += ["#{k.upcase.gsub("-", "_")}_PREBUILT_ROOT=#{v.gsub(/ /, '\ ')}"]
|
224
225
|
end
|
225
|
-
|
226
|
+
|
226
227
|
environmental_variables = {}
|
227
228
|
if deterministic_build
|
228
229
|
environmental_variables["ZERO_AR_DATE"] = "1"
|
229
230
|
end
|
230
|
-
|
231
|
-
execute_command
|
231
|
+
|
232
|
+
execute_command "xcodebuild", args, true, environmental_variables
|
232
233
|
end
|
233
|
-
|
234
|
+
|
234
235
|
# Copy paste implementation from CocoaPods internals to be able to call poopen3 passing environmental variables
|
235
236
|
def self.execute_command(executable, command, raise_on_failure = true, environmental_variables = {})
|
236
237
|
bin = Pod::Executable.which!(executable)
|
237
|
-
|
238
|
+
|
238
239
|
command = command.map(&:to_s)
|
239
|
-
full_command = "#{bin} #{command.join(
|
240
|
-
|
240
|
+
full_command = "#{bin} #{command.join(" ")}"
|
241
|
+
|
241
242
|
stdout = Pod::Executable::Indenter.new
|
242
243
|
stderr = Pod::Executable::Indenter.new
|
243
|
-
|
244
|
+
|
244
245
|
status = popen3(bin, command, stdout, stderr, environmental_variables)
|
245
246
|
stdout = stdout.join
|
246
247
|
stderr = stderr.join
|
@@ -252,27 +253,27 @@ module PodBuilder
|
|
252
253
|
UI.message("[!] Failed: #{full_command}".red)
|
253
254
|
end
|
254
255
|
end
|
255
|
-
|
256
|
+
|
256
257
|
output
|
257
258
|
end
|
258
|
-
|
259
|
+
|
259
260
|
def self.popen3(bin, command, stdout, stderr, environmental_variables)
|
260
|
-
require
|
261
|
+
require "open3"
|
261
262
|
Open3.popen3(environmental_variables, bin, *command) do |i, o, e, t|
|
262
263
|
Pod::Executable::reader(o, stdout)
|
263
264
|
Pod::Executable::reader(e, stderr)
|
264
265
|
i.close
|
265
|
-
|
266
|
+
|
266
267
|
status = t.value
|
267
|
-
|
268
|
+
|
268
269
|
o.flush
|
269
270
|
e.flush
|
270
271
|
sleep(0.01)
|
271
|
-
|
272
|
+
|
272
273
|
status
|
273
274
|
end
|
274
275
|
end
|
275
|
-
|
276
|
+
|
276
277
|
def self.enable_debug_information(project_path, configuration)
|
277
278
|
project = Xcodeproj::Project.open(project_path)
|
278
279
|
project.targets.each do |target|
|
@@ -288,49 +289,50 @@ def self.copy_resources_and_vendored_items(installer_context, uses_frameworks, b
|
|
288
289
|
installer_context.umbrella_targets.each do |umbrella|
|
289
290
|
umbrella.specs.each do |spec|
|
290
291
|
root_name = spec.name.split("/").first
|
291
|
-
|
292
|
+
|
292
293
|
if uses_frameworks
|
293
|
-
destination = File.join(base_destination, root_name)
|
294
|
+
destination = File.join(base_destination, root_name)
|
294
295
|
else
|
295
|
-
destination = File.join(base_destination, root_name, root_name)
|
296
|
+
destination = File.join(base_destination, root_name, root_name)
|
296
297
|
end
|
297
298
|
# Make sure the device target overwrites anything in the simulator build, otherwise iTunesConnect
|
298
299
|
# can get upset about Info.plist containing references to the simulator SDK
|
299
300
|
files = Pathname.glob("build/#{root_name}/*").reject { |f| f.to_s =~ /Pods[^.]+\.framework/ }
|
300
|
-
|
301
|
+
|
301
302
|
consumer = spec.consumer(umbrella.platform_name)
|
302
303
|
file_accessor = Pod::Sandbox::FileAccessor.new(sandbox.pod_dir(spec.root.name), consumer)
|
303
304
|
files += file_accessor.vendored_libraries
|
304
305
|
files += file_accessor.vendored_frameworks
|
305
306
|
files += file_accessor.resources
|
306
|
-
|
307
|
-
FileUtils.mkdir_p(destination)
|
307
|
+
|
308
|
+
FileUtils.mkdir_p(destination)
|
308
309
|
files.each do |file|
|
309
310
|
FileUtils.cp_r(file, destination)
|
310
|
-
end
|
311
|
+
end
|
311
312
|
end
|
312
313
|
end
|
313
314
|
end
|
314
315
|
|
315
|
-
Pod::HooksManager.register(
|
316
|
-
enable_dsym = user_options.fetch(
|
317
|
-
configuration = user_options.fetch(
|
318
|
-
uses_frameworks = user_options.fetch(
|
316
|
+
Pod::HooksManager.register("podbuilder-rome", :post_install) do |installer_context, user_options|
|
317
|
+
enable_dsym = user_options.fetch("dsym", true)
|
318
|
+
configuration = user_options.fetch("configuration", "Debug")
|
319
|
+
uses_frameworks = user_options.fetch("uses_frameworks", true)
|
319
320
|
if user_options["pre_compile"]
|
320
321
|
user_options["pre_compile"].call(installer_context)
|
321
322
|
end
|
322
|
-
build_catalyst = user_options.fetch(
|
323
|
-
build_xcframeworks = user_options.fetch(
|
324
|
-
|
325
|
-
|
326
|
-
|
323
|
+
build_catalyst = user_options.fetch("build_catalyst", false)
|
324
|
+
build_xcframeworks = user_options.fetch("build_xcframeworks", false)
|
325
|
+
keep_swiftmodules = user_options.fetch("keep_swiftmodules", false)
|
326
|
+
|
327
|
+
prebuilt_root_paths = JSON.parse(user_options["prebuilt_root_paths"].gsub("=>", ":"))
|
328
|
+
|
327
329
|
sandbox_root = Pathname(installer_context.sandbox_root)
|
328
330
|
sandbox = Pod::Sandbox.new(sandbox_root)
|
329
|
-
|
331
|
+
|
330
332
|
PodBuilder::enable_debug_information(sandbox.project_path, configuration)
|
331
|
-
|
332
|
-
build_dir = sandbox_root.parent +
|
333
|
-
base_destination = sandbox_root.parent +
|
333
|
+
|
334
|
+
build_dir = sandbox_root.parent + "build"
|
335
|
+
base_destination = sandbox_root.parent + "Prebuilt"
|
334
336
|
|
335
337
|
build_dir.rmtree if build_dir.directory?
|
336
338
|
base_destination.rmtree if base_destination.directory?
|
@@ -340,10 +342,10 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
340
342
|
target = targets.first
|
341
343
|
|
342
344
|
if build_xcframeworks
|
343
|
-
project_path = sandbox_root.parent +
|
344
|
-
|
345
|
+
project_path = sandbox_root.parent + "Pods/Pods.xcodeproj"
|
346
|
+
|
345
347
|
case target.platform_name
|
346
|
-
when :ios
|
348
|
+
when :ios
|
347
349
|
xcodebuild_settings = [PodBuilder::XcodeBuildSettings.new("iphoneos", configuration), PodBuilder::XcodeBuildSettings.new("iphonesimulator", configuration)]
|
348
350
|
if build_catalyst
|
349
351
|
xcodebuild_settings += [PodBuilder::XcodeBuildSettings.new("catalyst", configuration)]
|
@@ -351,17 +353,29 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
351
353
|
when :osx then xcodebuild_settings = [PodBuilder::XcodeBuildSettings.new("macos", configuration)]
|
352
354
|
when :tvos then xcodebuild_settings = [PodBuilder::XcodeBuildSettings.new("tvos", configuration), PodBuilder::XcodeBuildSettings.new("tvossimulator", configuration)]
|
353
355
|
when :watchos then xcodebuild_settings = [PodBuilder::XcodeBuildSettings.new("watchos", configuration), PodBuilder::XcodeBuildSettings.new("watchossimulator", configuration)]
|
354
|
-
else raise "\n\nUnknown platform '#{target.platform_name}'\n".red
|
355
|
-
|
356
|
+
else raise "\n\nUnknown platform '#{target.platform_name}'\n".red
|
357
|
+
end
|
358
|
+
|
356
359
|
xcodebuild_settings.each do |xcodebuild_setting|
|
357
360
|
puts "Building xcframeworks for #{xcodebuild_setting.platform_name}".yellow
|
358
|
-
|
361
|
+
|
362
|
+
log_path = "#{PodBuilder::Configuration.build_base_path}/archive_#{xcodebuild_setting.platform_name}.log"
|
363
|
+
archive_cmd = "xcodebuild archive -project #{project_path.to_s} -scheme Pods-DummyTarget -configuration #{xcodebuild_setting.configuration} -destination '#{xcodebuild_setting.build_destination}' -archivePath '#{build_dir}/#{xcodebuild_setting.platform_name}' SKIP_INSTALL=NO > #{log_path}"
|
364
|
+
unless system(archive_cmd)
|
365
|
+
puts "\n\n#{xcodebuild_setting.build_destination} xcframework archive failed, see #{log_path}!\n".red
|
366
|
+
if system("which xcbeautify")
|
367
|
+
puts `cat '#{log_path}' | xcbeautify --is-ci`
|
368
|
+
elsif system("which xcpretty")
|
369
|
+
puts `cat '#{log_path}' | xcpretty`
|
370
|
+
end
|
371
|
+
raise ""
|
372
|
+
end
|
359
373
|
end
|
360
374
|
|
361
375
|
built_items = Dir.glob("#{build_dir}/#{xcodebuild_settings[0].platform_name}.xcarchive/Products/Library/Frameworks/*").reject { |t| File.basename(t, ".*") == "Pods_DummyTarget" }
|
362
376
|
|
363
377
|
specs = installer_context.umbrella_targets.map(&:specs).flatten
|
364
|
-
built_items.each do |built_item|
|
378
|
+
built_items.each do |built_item|
|
365
379
|
built_item_paths = [built_item]
|
366
380
|
xcodebuild_settings.drop(1).each do |xcodebuild_setting|
|
367
381
|
path = "#{build_dir}/#{xcodebuild_setting.platform_name}.xcarchive/Products/Library/Frameworks/#{File.basename(built_item)}"
|
@@ -388,8 +402,25 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
388
402
|
|
389
403
|
root_name = spec.name.split("/").first
|
390
404
|
xcframework_path = "#{base_destination}/#{root_name}/#{module_name}.xcframework"
|
391
|
-
framework_params = built_item_paths.map { |t| "-framework '#{t}'"}.join(" ")
|
392
|
-
|
405
|
+
framework_params = built_item_paths.map { |t| "-framework '#{t}'" }.join(" ")
|
406
|
+
|
407
|
+
log_path = "#{PodBuilder::Configuration.build_base_path}/create_framework.log"
|
408
|
+
create_framework_cmd = "xcodebuild -create-xcframework #{framework_params} -output '#{xcframework_path}' > #{log_path}"
|
409
|
+
raise "\n\nFailed packing xcframework! See #{log_path}\n".red if !system(create_framework_cmd)
|
410
|
+
|
411
|
+
if keep_swiftmodules
|
412
|
+
# At cost of losing ABI stability we restore .swiftmodule files that are removed by xcodebuild to improve build times
|
413
|
+
swiftinterfaces = Dir.glob("#{xcframework_path}/**/*.swiftinterface").reject { |t| t.include?("private.swiftinterface") }
|
414
|
+
swiftmodules = Dir.glob("#{build_dir}/**/#{module_name}.framework/**/*.swiftmodule").select { |t| File.file?(t) }
|
415
|
+
|
416
|
+
swiftinterfaces.each do |path|
|
417
|
+
expected_swiftmodule_name = File.basename(path, ".*")
|
418
|
+
if swiftmodule_path = swiftmodules.detect { |t| File.basename(t, ".*") == expected_swiftmodule_name }
|
419
|
+
destination_path = File.dirname(path)
|
420
|
+
FileUtils.cp(swiftmodule_path, destination_path)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
393
424
|
|
394
425
|
if enable_dsym
|
395
426
|
xcodebuild_settings.each do |xcodebuild_setting|
|
@@ -399,7 +430,7 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
399
430
|
FileUtils.mkdir_p(destination)
|
400
431
|
FileUtils.mv(dsym_source, destination)
|
401
432
|
FileUtils.mv("#{destination}/dSYMs", "#{destination}/#{xcodebuild_setting.platform_name}")
|
402
|
-
end
|
433
|
+
end
|
403
434
|
end
|
404
435
|
else
|
405
436
|
raise "\n\nNot implemented\n".red
|
@@ -407,38 +438,39 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
407
438
|
end
|
408
439
|
|
409
440
|
built_count = built_items.count
|
410
|
-
Pod::UI.puts "Built #{built_count} #{
|
441
|
+
Pod::UI.puts "Built #{built_count} #{"item".pluralize(built_count)}"
|
411
442
|
|
412
443
|
copy_resources_and_vendored_items(installer_context, true, base_destination, sandbox)
|
413
444
|
else
|
414
445
|
case [target.platform_name, uses_frameworks]
|
415
|
-
when [:ios, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target,
|
446
|
+
when [:ios, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target, "iphoneos", "iphonesimulator", configuration, PodBuilder::Configuration.deterministic_build)
|
416
447
|
when [:osx, true] then PodBuilder::xcodebuild(sandbox, target.cocoapods_target_label, configuration, PodBuilder::Configuration.deterministic_build, {})
|
417
|
-
when [:tvos, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target,
|
418
|
-
when [:watchos, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target,
|
419
|
-
when [:ios, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target,
|
448
|
+
when [:tvos, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target, "appletvos", "appletvsimulator", configuration, PodBuilder::Configuration.deterministic_build)
|
449
|
+
when [:watchos, true] then PodBuilder::build_for_iosish_platform_framework(sandbox, build_dir, target, "watchos", "watchsimulator", configuration, PodBuilder::Configuration.deterministic_build)
|
450
|
+
when [:ios, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target, "iphoneos", "iphonesimulator", configuration, PodBuilder::Configuration.deterministic_build, prebuilt_root_paths)
|
420
451
|
when [:osx, false] then PodBuilder::xcodebuild(sandbox, target.cocoapods_target_label, configuration, PodBuilder::Configuration.deterministic_build, prebuilt_root_paths)
|
421
|
-
when [:tvos, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target,
|
422
|
-
when [:watchos, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target,
|
423
|
-
else raise "\n\nUnknown platform '#{target.platform_name}'\n".red
|
452
|
+
when [:tvos, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target, "appletvos", "appletvsimulator", configuration, PodBuilder::Configuration.deterministic_build, prebuilt_root_paths)
|
453
|
+
when [:watchos, false] then PodBuilder::build_for_iosish_platform_lib(sandbox, build_dir, target, "watchos", "watchsimulator", configuration, PodBuilder::Configuration.deterministic_build, prebuilt_root_paths)
|
454
|
+
else raise "\n\nUnknown platform '#{target.platform_name}'\n".red
|
455
|
+
end
|
456
|
+
|
457
|
+
raise Pod::Informative, "The build directory was not found in the expected location." unless build_dir.directory?
|
424
458
|
|
425
|
-
raise Pod::Informative, 'The build directory was not found in the expected location.' unless build_dir.directory?
|
426
|
-
|
427
459
|
specs = installer_context.umbrella_targets.map { |t| t.specs.map(&:name) }.flatten.map { |t| t.split("/").first }.uniq
|
428
460
|
built_count = Dir["#{build_dir}/*"].select { |t| specs.include?(File.basename(t)) }.count
|
429
|
-
Pod::UI.puts "Built #{built_count} #{
|
430
|
-
|
461
|
+
Pod::UI.puts "Built #{built_count} #{"item".pluralize(built_count)}, copying..."
|
462
|
+
|
431
463
|
copy_resources_and_vendored_items(installer_context, uses_frameworks, base_destination, sandbox)
|
432
|
-
|
464
|
+
|
433
465
|
# Depending on the resource it may happen that it is present twice, both in the .framework and in the parent folder
|
434
466
|
Dir.glob("#{base_destination}/*") do |path|
|
435
467
|
unless File.directory?(path)
|
436
468
|
return
|
437
469
|
end
|
438
|
-
|
470
|
+
|
439
471
|
files = Dir.glob("#{path}/*")
|
440
472
|
framework_files = Dir.glob("#{path}/*.framework/**/*").map { |t| File.basename(t) }
|
441
|
-
|
473
|
+
|
442
474
|
files.each do |file|
|
443
475
|
filename = File.basename(file.gsub(/\.xib$/, ".nib"))
|
444
476
|
if framework_files.include?(filename)
|
@@ -446,7 +478,7 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
446
478
|
end
|
447
479
|
end
|
448
480
|
end
|
449
|
-
|
481
|
+
|
450
482
|
if enable_dsym
|
451
483
|
dsym_source = "#{build_dir}/dSYM"
|
452
484
|
if File.directory?(dsym_source)
|
@@ -454,12 +486,12 @@ Pod::HooksManager.register('podbuilder-rome', :post_install) do |installer_conte
|
|
454
486
|
end
|
455
487
|
else
|
456
488
|
raise "\n\nNot implemented\n".red
|
457
|
-
end
|
489
|
+
end
|
458
490
|
end
|
459
491
|
|
460
492
|
build_dir.rmtree if build_dir.directory?
|
461
|
-
|
493
|
+
|
462
494
|
if user_options["post_compile"]
|
463
495
|
user_options["post_compile"].call(installer_context)
|
464
496
|
end
|
465
|
-
end
|
497
|
+
end
|
@@ -7,7 +7,7 @@ PodBuilder::Configuration::load
|
|
7
7
|
|
8
8
|
%%%use_frameworks%%%
|
9
9
|
|
10
|
-
plugin 'podbuilder-rome', { dsym: true, configuration: '%%%build_configuration%%%', uses_frameworks: %%%uses_frameworks%%%, build_catalyst: %%%build_catalyst%%%, build_xcframeworks: %%%build_xcframeworks%%%, prebuilt_root_paths: '%%%prebuilt_root_paths%%%', pre_compile: Proc.new { |installer|
|
10
|
+
plugin 'podbuilder-rome', { dsym: true, configuration: '%%%build_configuration%%%', uses_frameworks: %%%uses_frameworks%%%, keep_swiftmodules: %%%keep_swiftmodules%%%, build_catalyst: %%%build_catalyst%%%, build_xcframeworks: %%%build_xcframeworks%%%, prebuilt_root_paths: '%%%prebuilt_root_paths%%%', pre_compile: Proc.new { |installer|
|
11
11
|
|
12
12
|
def set_build_settings(target_name, build_configurations, installer)
|
13
13
|
installer.pods_project.targets.each do |target|
|
data/lib/pod_builder/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pod-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.1.
|
4
|
+
version: 5.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Camin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -187,6 +187,7 @@ files:
|
|
187
187
|
- lib/pod_builder/command.rb
|
188
188
|
- lib/pod_builder/command/build.rb
|
189
189
|
- lib/pod_builder/command/build_all.rb
|
190
|
+
- lib/pod_builder/command/build_swiftmodules.rb
|
190
191
|
- lib/pod_builder/command/clean.rb
|
191
192
|
- lib/pod_builder/command/deintegrate.rb
|
192
193
|
- lib/pod_builder/command/generate_lldbinit.rb
|