Method: PodBuilder.build_for_iosish_platform_framework

Defined in:
lib/pod_builder/rome/post_install.rb

.build_for_iosish_platform_framework(sandbox, build_dir, target, device, simulator, configuration, deterministic_build) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/pod_builder/rome/post_install.rb', line 28

def self.build_for_iosish_platform_framework(sandbox, build_dir, target, device, simulator, configuration, deterministic_build)    
  dsym_device_folder = File.join(build_dir, "dSYM", device)
  dsym_simulator_folder = File.join(build_dir, "dSYM", simulator)
  FileUtils.mkdir_p(dsym_device_folder)
  FileUtils.mkdir_p(dsym_simulator_folder)
  
  deployment_target = target.platform_deployment_target
  target_label = target.cocoapods_target_label
  
  xcodebuild(sandbox, target_label, device, deployment_target, configuration, deterministic_build, [], {})
  excluded_archs = ["i386"] # Fixes https://github.com/Subito-it/PodBuilder/issues/17
  excluded_archs += ["arm64"] # Exclude apple silicon slice
  xcodebuild(sandbox, target_label, simulator, deployment_target, configuration, deterministic_build, excluded_archs, {})
  
  spec_names = target.specs.map { |spec| [spec.root.name, spec.root.module_name] }.uniq
  spec_names.each do |root_name, module_name|
    device_base = "#{build_dir}/#{configuration}-#{device}/#{root_name}" 
    device_lib = "#{device_base}/#{module_name}.framework/#{module_name}"
    device_dsym = "#{device_base}/#{module_name}.framework.dSYM"
    device_framework_lib = File.dirname(device_lib)
    device_swift_header_path = "#{device_framework_lib}/Headers/#{module_name}-Swift.h"
    
    simulator_base = "#{build_dir}/#{configuration}-#{simulator}/#{root_name}"
    simulator_lib = "#{simulator_base}/#{module_name}.framework/#{module_name}"
    simulator_dsym = "#{simulator_base}/#{module_name}.framework.dSYM"
    simulator_framework_lib = File.dirname(simulator_lib)
    simulator_swift_header_path = "#{simulator_framework_lib}/Headers/#{module_name}-Swift.h"
    
    next unless File.file?(device_lib) && File.file?(simulator_lib)
    
    # Starting with Xcode 12b3 the simulator binary contains an arm64 slice as well which conflict with the one in the device_lib
    # when creating the fat library. A naive workaround is to remove the arm64 from the simulator_lib however this is wrong because 
    # we might actually need to have 2 separated arm64 slices, one for simulator and one for device each built with different
    # compile time directives (e.g #if targetEnvironment(simulator))
    #
    # For the time being we remove the arm64 slice bacause otherwise the `xcrun lipo -create -output ...` would fail.
    if `xcrun lipo -info #{simulator_lib}`.include?("arm64")
      `xcrun lipo -remove arm64 #{simulator_lib} -o #{simulator_lib}`
    end
    
    raise "\n\nLipo failed on #{device_lib}\n".red unless system("xcrun lipo -create -output #{device_lib} #{device_lib} #{simulator_lib}")
    
    merge_header_into(device_swift_header_path, simulator_swift_header_path)
    
    # Merge device framework into simulator framework (so that e.g swift Module folder is merged) 
    # letting device framework files overwrite simulator ones
    FileUtils.cp_r(File.join(device_framework_lib, "."), simulator_framework_lib) 
    source_lib = File.dirname(simulator_framework_lib)
    
    FileUtils.mv(device_dsym, dsym_device_folder) if File.exist?(device_dsym)
    FileUtils.mv(simulator_dsym, dsym_simulator_folder) if File.exist?(simulator_dsym)
    
    FileUtils.mv(source_lib, build_dir)
    
    # Remove frameworks leaving dSYMs
    FileUtils.rm_rf(device_framework_lib) 
    FileUtils.rm_rf(simulator_framework_lib)
  end
end