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