lib/cocoapods-framework/xbuilder.rb in cocoapods-xcframework-0.1.0 vs lib/cocoapods-framework/xbuilder.rb in cocoapods-xcframework-0.1.1

- old
+ new

@@ -11,19 +11,23 @@ # @platform = platform @installer = installer @source_dir = source_dir @sandbox_root = sandbox_root @spec = spec + @muti = @spec.is_a? Array + @configs = @spec if @muti + @spec = "muti" if @muti + @configuration = configuration - @outputs = {} + @outputs = Hash.new end def build UI.puts("Building framework #{@spec} with configuration #{@configuration}") UI.puts "Work dir is :#{@sandbox_root}" - defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'" - + # defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'" + defines = "" if @configuration == 'Debug' defines << 'GCC_GENERATE_DEBUGGING_SYMBOLS=YES ONLY_ACTIVE_ARCH=NO' else defines << "GCC_GENERATE_DEBUGGING_SYMBOLS=NO" end @@ -34,17 +38,66 @@ collect_bundles end def collect_xc_frameworks + if @muti + collect_muti_xcframworks + else + collect_single_xcframeworks + end + end + + def collect_muti_xcframworks + @outputs[:xcframework] = Hash.new + @configs.each do |cfg| + export_dir = "#{@sandbox_root}/export/**/#{cfg["name"]}.framework" + frameworks = Pathname.glob(export_dir) + @outputs[:xcframework][cfg["name"]] = create_xc_framework_by_frameworks frameworks, cfg["name"] + end + end + + def collect_single_xcframeworks export_dir = "#{@sandbox_root}/export/**/#{@spec.name}.framework" frameworks = Pathname.glob(export_dir) - @outputs[:xcframework] = create_xc_framework_by_frameworks frameworks + @outputs[:xcframework] = create_xc_framework_by_frameworks frameworks, @spec.name end def collect_bundles - ["iphoneos","macOS","appletvos","watchos"].each do |plat| + if @muti + colelct_muti_bundles + else + collect_single_bundles + end + end + + def colelct_muti_bundles + @outputs[:bundle] = Hash.new + @configs.each do |cfg| + # "" 这个是用来代表mac os的 macos 没有后缀奇怪吧 + ["iphoneos","","appletvos","watchos"].each do |plat| + export_dir = "#{@sandbox_root}/export/*-#{plat}/**/#{cfg["name"]}.bundle/**" + Pathname.glob(export_dir).each do |bundle| + if bundle.to_s.include? "#{@spec.name}.bundle/Info.plist" + return + end + target_path = "#{@sandbox_root}/bundle/#{cfg["name"]}" + @outputs[:bundle][cfg["name"]] = target_path + native_platform = to_native_platform plat + path = Pathname.new "#{target_path}/#{native_platform}" + if not path.exist? + path.mkpath + end + FileUtils.cp_r(Dir["#{bundle}"],"#{path}") + end + end + end + end + + def collect_single_bundles + # "" 这个是用来代表mac os的 macos 没有后缀奇怪吧 + ["iphoneos","","appletvos","watchos"].each do |plat| export_dir = "#{@sandbox_root}/export/*-#{plat}/**/#{@spec.name}.bundle/**" Pathname.glob(export_dir).each do |bundle| if bundle.to_s.include? "#{@spec.name}.bundle/Info.plist" return end @@ -57,22 +110,22 @@ FileUtils.cp_r(Dir["#{bundle}"],"#{path}") end end end - def create_xc_framework_by_frameworks frameworks + def create_xc_framework_by_frameworks frameworks, spec_name command = 'xcodebuild -create-xcframework ' frameworks.each do |framework| command << "-framework #{framework} " end - command << "-output #{@sandbox_root}/#{@spec.name}.xcframework 2>&1" + command << "-output #{@sandbox_root}/#{spec_name}.xcframework 2>&1" output = `#{command}`.lines.to_a if $?.exitstatus != 0 Pod::ErrorUtil.error_report command,output Process.exit -1 end - "#{@sandbox_root}/#{@spec.name}.xcframework" + "#{@sandbox_root}/#{spec_name}.xcframework" end def build_all_device defines # build general first because simulator will exchange SDKROOT to simulat sdk build_general_device defines @@ -150,7 +203,62 @@ def outputs_bundle target_dir if @outputs[:bundle] FileUtils.cp_r(Dir[@outputs[:bundle]],target_dir) end end + + def outputs_muti target_dir + if not File.exist? target_dir + Pathname.new(target_dir).mkdir + end + outputs_xcframework_muti target_dir + outputs_bundle_muti target_dir + generic_new_podspec_hash_muti target_dir + end + + def generic_new_podspec_hash_muti target_dir + work_dir = config.installation_root + @configs.map do |cfg| + podspec_path = "#{work_dir}/#{cfg["name"]}/#{cfg["name"]}.podspec" + if not File.exist? podspec_path + podspec_path = "#{podspec_path}.json" + end + podspec = Pod::Specification.from_file podspec_path + new_spec_hash = generic_new_podspec_hash podspec + new_spec_hash[:vendored_frameworks] = "#{podspec.name}.xcframework" + find_bundles("#{target_dir}/#{podspec.name}").each do |plat, value| + if new_spec_hash[plat] + new_spec_hash[plat]["resource_bundles"] = value + else + new_spec_hash[plat] = { + "resource_bundles" => value + } + end + end + require 'json' + spec_json = JSON.pretty_generate(new_spec_hash) << "\n" + File.open("#{target_dir}/#{podspec.name}/#{podspec.name}.podspec.json",'wb+') do |f| + f.write(spec_json) + end + UI.puts "result export at :#{target_dir}/#{podspec.name}" + "#{target_dir}/#{podspec.name}" + end + end + + def outputs_xcframework_muti target_dir + @outputs[:xcframework].each do |name, path| + target_dir_path = "#{target_dir}/#{name}/" + Pathname.new(target_dir_path).mkpath + FileUtils.cp_r(path, target_dir_path) + end + end + + def outputs_bundle_muti target_dir + @outputs[:bundle].each do |name, path| + target_dir_path = "#{target_dir}/#{name}/bundle/" + Pathname.new(target_dir_path).mkpath + FileUtils.cp_r(path, target_dir_path) + end + end + end end