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?