lib/cocoapods-binary/rome/build_framework.rb in cocoapods-binary-0.4.3 vs lib/cocoapods-binary/rome/build_framework.rb in cocoapods-binary-0.4.4
- old
+ new
@@ -1,6 +1,7 @@
require 'fourflusher'
+require 'xcpretty'
CONFIGURATION = "Release"
PLATFORMS = { 'iphonesimulator' => 'iOS',
'appletvsimulator' => 'tvOS',
'watchsimulator' => 'watchOS' }
@@ -13,71 +14,120 @@
build_dir,
output_path,
target,
device,
simulator,
- bitcode_enabled)
+ bitcode_enabled,
+ custom_build_options = [], # Array<String>
+ custom_build_options_simulator = [] # Array<String>
+ )
deployment_target = target.platform.deployment_target.to_s
target_label = target.label
Pod::UI.puts "Prebuilding #{target_label}..."
other_options = []
if bitcode_enabled
other_options += ['BITCODE_GENERATION_MODE=bitcode']
end
- xcodebuild(sandbox, target_label, device, deployment_target, other_options)
- xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ['ARCHS=x86_64', 'ONLY_ACTIVE_ARCH=NO'])
+ is_succeed, _ = xcodebuild(sandbox, target_label, device, deployment_target, other_options + custom_build_options)
+ exit 1 unless is_succeed
+ is_succeed, _ = xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ['ARCHS=x86_64', 'ONLY_ACTIVE_ARCH=NO'] + custom_build_options_simulator)
+ exit 1 unless is_succeed
+
# paths
root_name = target.pod_name
module_name = target.product_module_name
- device_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{root_name}/#{module_name}.framework"
- simulator_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{root_name}/#{module_name}.framework"
+ device_framework_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{root_name}/#{module_name}.framework"
+ simulator_framework_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{root_name}/#{module_name}.framework"
- device_binary = device_framwork_path + "/#{module_name}"
- simulator_binary = simulator_framwork_path + "/#{module_name}"
+ device_binary = device_framework_path + "/#{module_name}"
+ simulator_binary = simulator_framework_path + "/#{module_name}"
return unless File.file?(device_binary) && File.file?(simulator_binary)
# the device_lib path is the final output file path
- # combine the bianries
+ # combine the binaries
tmp_lipoed_binary_path = "#{build_dir}/#{root_name}"
lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_binary} #{simulator_binary}`
puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
FileUtils.mv tmp_lipoed_binary_path, device_binary, :force => true
# collect the swiftmodule file for various archs.
- device_swiftmodule_path = device_framwork_path + "/Modules/#{module_name}.swiftmodule"
- simulator_swiftmodule_path = simulator_framwork_path + "/Modules/#{module_name}.swiftmodule"
+ device_swiftmodule_path = device_framework_path + "/Modules/#{module_name}.swiftmodule"
+ simulator_swiftmodule_path = simulator_framework_path + "/Modules/#{module_name}.swiftmodule"
if File.exist?(device_swiftmodule_path)
FileUtils.cp_r simulator_swiftmodule_path + "/.", device_swiftmodule_path
end
+ # combine the generated swift headers
+ # (In xcode 10.2, the generated swift headers vary for each archs)
+ # https://github.com/leavez/cocoapods-binary/issues/58
+ simulator_generated_swift_header_path = simulator_framework_path + "/Headers/#{module_name}-Swift.h"
+ device_generated_swift_header_path = device_framework_path + "/Headers/#{module_name}-Swift.h"
+ if File.exist? simulator_generated_swift_header_path
+ device_header = File.read(device_generated_swift_header_path)
+ simulator_header = File.read(simulator_generated_swift_header_path)
+ # https://github.com/Carthage/Carthage/issues/2718#issuecomment-473870461
+ combined_header_content = %Q{
+#if TARGET_OS_SIMULATOR // merged by cocoapods-binary
+
+#{simulator_header}
+
+#else // merged by cocoapods-binary
+
+#{device_header}
+
+#endif // merged by cocoapods-binary
+}
+ File.write(device_generated_swift_header_path, combined_header_content.strip)
+ end
+
# handle the dSYM files
- device_dsym = "#{device_framwork_path}.dSYM"
+ device_dsym = "#{device_framework_path}.dSYM"
if File.exist? device_dsym
# lipo the simulator dsym
- tmp_lipoed_binary_path = "#{output_path}/#{module_name}.draft"
- lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_dsym}/Contents/Resources/DWARF/#{module_name} #{simulator_framwork_path}.dSYM/Contents/Resources/DWARF/#{module_name}`
- puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
- FileUtils.mv tmp_lipoed_binary_path, "#{device_framwork_path}.dSYM/Contents/Resources/DWARF/#{module_name}", :force => true
+ simulator_dsym = "#{simulator_framework_path}.dSYM"
+ if File.exist? simulator_dsym
+ tmp_lipoed_binary_path = "#{output_path}/#{module_name}.draft"
+ lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_dsym}/Contents/Resources/DWARF/#{module_name} #{simulator_dsym}/Contents/Resources/DWARF/#{module_name}`
+ puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
+ FileUtils.mv tmp_lipoed_binary_path, "#{device_framework_path}.dSYM/Contents/Resources/DWARF/#{module_name}", :force => true
+ end
+ # move
FileUtils.mv device_dsym, output_path, :force => true
end
# output
output_path.mkpath unless output_path.exist?
- FileUtils.mv device_framwork_path, output_path, :force => true
+ FileUtils.mv device_framework_path, output_path, :force => true
end
def xcodebuild(sandbox, target, sdk='macosx', deployment_target=nil, other_options=[])
args = %W(-project #{sandbox.project_path.realdirpath} -scheme #{target} -configuration #{CONFIGURATION} -sdk #{sdk} )
platform = PLATFORMS[sdk]
args += Fourflusher::SimControl.new.destination(:oldest, platform, deployment_target) unless platform.nil?
args += other_options
- Pod::Executable.execute_command 'xcodebuild', args, true
+ log = `xcodebuild #{args.join(" ")} 2>&1`
+ exit_code = $?.exitstatus # Process::Status
+ is_succeed = (exit_code == 0)
+
+ if !is_succeed
+ begin
+ # 64 represent command invalid. http://www.manpagez.com/man/3/sysexits/
+ raise "shouldn't be handle by xcpretty" if exit_code == 64
+ printer = XCPretty::Printer.new({:formatter => XCPretty::Simple, :colorize => 'auto'})
+ log.each_line do |line|
+ printer.pretty_print(line)
+ end
+ rescue
+ puts log
+ end
+ end
+ [is_succeed, log]
end
module Pod
@@ -92,21 +142,21 @@
# The pod targets to build
#
# [Pathname] output_path
# output path for generated frameworks
#
- def self.build(sandbox_root_path, target, output_path, bitcode_enabled = false)
+ def self.build(sandbox_root_path, target, output_path, bitcode_enabled = false, custom_build_options=[], custom_build_options_simulator=[])
return unless not target == nil
sandbox_root = Pathname(sandbox_root_path)
sandbox = Pod::Sandbox.new(sandbox_root)
build_dir = self.build_dir(sandbox_root)
# -- build the framework
case target.platform.name
- when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled)
- when :osx then xcodebuild(sandbox, target.label)
+ when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled, custom_build_options, custom_build_options_simulator)
+ when :osx then xcodebuild(sandbox, target.label, 'macosx', nil, custom_build_options)
# when :tvos then build_for_iosish_platform(sandbox, build_dir, target, 'appletvos', 'appletvsimulator')
# when :watchos then build_for_iosish_platform(sandbox, build_dir, target, 'watchos', 'watchsimulator')
else raise "Unsupported platform for '#{target.name}': '#{target.platform.name}'" end
raise Pod::Informative, 'The build directory was not found in the expected location.' unless build_dir.directory?