Module: Pod::XBuilder::XcodeXBuilder
- Included in:
- Pod::XBuilder
- Defined in:
- lib/cocoapods-xcframework/xbuilder/xcode_xbuild.rb
Instance Method Summary collapse
-
#compare_xcode_14_version ⇒ Object
xcode14以上,14以后不再支持armv7(32位设备).
-
#xcode_version ⇒ Object
调用方法来获取当前Xcode版本.
- #xcode_xbuild(defines, configuration, work_dir, build_dir = 'export', platform = 'iOS', project = nil, scheme = nil, skip_install = false) ⇒ Object
Instance Method Details
#compare_xcode_14_version ⇒ Object
xcode14以上,14以后不再支持armv7(32位设备)
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/cocoapods-xcframework/xbuilder/xcode_xbuild.rb', line 20 def compare_xcode_14_version current_version = xcode_version if current_version.nil? UI.puts("未找到安装的Xcode版本。") else UI.puts("当前Xcode版本:#{current_version}") num_ver = current_version.to_i return num_ver >= 14 end return false end |
#xcode_version ⇒ Object
调用方法来获取当前Xcode版本
5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/cocoapods-xcframework/xbuilder/xcode_xbuild.rb', line 5 def xcode_version xcode_version_output = `xcode-select -p` return nil if xcode_version_output.empty? xcode_path = xcode_version_output.chomp version_output = `xcodebuild -version` # Extract the Xcode version number version_match = version_output.match(/Xcode (\d+(\.\d+)+)/) return nil if version_match.nil? xcode_version = version_match[1] return xcode_version end |
#xcode_xbuild(defines, configuration, work_dir, build_dir = 'export', platform = 'iOS', project = nil, scheme = nil, skip_install = false) ⇒ Object
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/cocoapods-xcframework/xbuilder/xcode_xbuild.rb', line 32 def xcode_xbuild(defines, configuration, work_dir, build_dir = 'export', platform = 'iOS', project = nil, scheme = nil, skip_install = false) if defined?(Pod::DONT_CODESIGN) defines = "#{defines} CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO" end pwd = Pathname.pwd Dir.chdir work_dir # 判断当前Xcode版本是否大于14 above_ver_14 = compare_xcode_14_version if platform == 'macOS' destination = 'generic/platform=macOS,variant=Mac Catalyst,name=Any Mac' archs = 'x86_64 arm64' elsif platform == 'iOS Simulator' destination = 'generic/platform=iOS Simulator' if above_ver_14 # 14以后不支持32位设备 archs = 'x86_64 arm64' else archs = 'x86_64 i386 arm64' # swift库针对M1芯片移除x86架构,故模拟器添加i386,解决maccatalyst能正常生成 end else destination = 'generic/platform=iOS' if above_ver_14 # 14以后不支持32位设备 archs = 'arm64' else archs = 'arm64 armv7' end end if skip_install skip_install = 'YES' else skip_install = 'NO' end # if not project.nil? # # if not scheme.nil? # # command = "xcodebuild #{defines} BUILD_DIR=#{build_dir} BUILD_LIBRARY_FOR_DISTRIBUTION=YES clean build -configuration #{configuration} -project '#{project}' -scheme '#{scheme}' -destination '#{destination}' ARCHS='#{archs}' SKIP_INSTALL=#{skip_install} | xcpretty 2>&1" # # else # # command = "xcodebuild #{defines} BUILD_DIR=#{build_dir} BUILD_LIBRARY_FOR_DISTRIBUTION=YES clean build -configuration #{configuration} -alltargets -scheme '#{scheme}' -destination '#{destination}' ARCHS='#{archs}' SKIP_INSTALL=#{skip_install} | xcpretty 2>&1" # # end # command = "xcodebuild #{defines} BUILD_DIR=#{build_dir} BUILD_LIBRARY_FOR_DISTRIBUTION=YES clean build -configuration #{configuration} -alltargets -scheme '#{scheme}' -destination '#{destination}' ARCHS='#{archs}' SKIP_INSTALL=#{skip_install} | xcpretty 2>&1" # else # command = "xcodebuild #{defines} BUILD_DIR=#{build_dir} BUILD_LIBRARY_FOR_DISTRIBUTION=YES clean build -configuration #{configuration} -alltargets -destination '#{destination}' ARCHS='#{archs}' SKIP_INSTALL=#{skip_install} | xcpretty 2>&1" # end command = "xcodebuild #{defines} BUILD_DIR=#{build_dir} BUILD_LIBRARY_FOR_DISTRIBUTION=YES clean build -configuration #{configuration} -alltargets -destination '#{destination}' ARCHS='#{archs}' SKIP_INSTALL=#{skip_install}" # UI.puts("XBuilder command:#{command}") # output = `#{command}`.lines.to_a # Dir.chdir pwd # if $?.exitstatus != 0 # Pod::ErrorUtil.error_report command,output # Process.exit -1 # end # --- enhanced logging & reliable failure surfacing --- log_dir = File.join(work_dir, 'logs') FileUtils.mkdir_p(log_dir) scheme_name = (scheme || @spec&.name || 'Pods').to_s plat_name = platform.to_s.gsub(/\s+/, '_') log_raw = File.join(log_dir, "xcodebuild-#{scheme_name}-#{plat_name}-#{configuration}.raw.log") # Allow disabling xcpretty via env use_pretty = ENV['XBUILDER_NOPRETTY'] != '1' wrapped = if use_pretty "set -o pipefail; #{command} 2>&1 | tee '#{log_raw}' | xcpretty" # "set -o pipefail; #{command} | tee '#{log_raw}' | xcpretty" else # no pretty: just tee to log and console "set -o pipefail; #{command} | tee '#{log_raw}'" end UI.puts "XBuilder command: #{command}" UI.puts "Available schemes:" schemes = `xcodebuild -list 2>/dev/null` UI.puts schemes success = system('bash', '-lc', wrapped) unless success UI.puts "" UI.puts "========== XCODEBUILD FAILED ==========" UI.puts "platform=#{platform}" UI.puts "scheme=#{scheme}" UI.puts "destination=#{destination}" UI.puts "log=#{log_raw}" if platform == 'macOS' UI.puts "Available schemes:" schemes = `xcodebuild -list 2>/dev/null` UI.puts schemes end if File.exist?(log_raw) UI.puts "" UI.puts "===== LAST 300 LINES =====" tail = `tail -n 300 "#{log_raw}"` UI.puts tail UI.puts "" UI.puts "===== ERROR LINES =====" errors = `grep -nE "error:|fatal error:|Undefined symbols|Command Compile|Command SwiftCompile|Command Ld" "#{log_raw}"` UI.puts(errors.empty? ? "No error lines found." : errors) else UI.puts "raw log not found" end raise Informative, "xcodebuild failed. see log: #{log_raw}" end # unless success # UI.puts "\n** xcodebuild failed — showing last 200 lines of raw log: #{log_raw}".red # if File.exist?(log_raw) # tail = `tail -n 200 '#{log_raw}'` # UI.puts tail # end # Pod::ErrorUtil.error_report(command, []) if defined?(Pod::ErrorUtil) # Process.exit $?.exitstatus.nonzero? || 1 # end end |