class CBin::Framework::Builder
Public Class Methods
new(spec, file_accessor, platform, source_dir)
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 12 def initialize(spec, file_accessor, platform, source_dir) @spec = spec @source_dir = source_dir @file_accessor = file_accessor @platform = platform @vendored_libraries = (file_accessor.vendored_static_frameworks + file_accessor.vendored_static_libraries).map(&:to_s) end
Public Instance Methods
build()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 20 def build UI.section("Building static framework #{@spec}") do defines = compile build_sim_libraries(defines) #output = framework.versions_path + Pathname.new(@spec.name) #build_static_library_for_ios(output) # #copy_headers #copy_license #copy_resources package_framework #cp_to_source_dir end end
Private Instance Methods
build_sim_libraries(defines)
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 63 def build_sim_libraries(defines) UI.message 'Building simulator libraries' xcodebuild(defines, '-sdk iphonesimulator', 'build-simulator') end
build_static_library_for_ios(output)
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 150 def build_static_library_for_ios(output) UI.message "Building ios libraries with archs #{ios_architectures}" static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-simulator') + @vendored_libraries libs = ios_architectures.map do |arch| library = "build/package-#{arch}.a" `libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}` library end `lipo -create -output #{output} #{libs.join(' ')}` end
compile()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 179 def compile defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)'" defines += ' ' defines += @spec.consumer(@platform).compiler_flags.join(' ') options = ios_build_options xcodebuild(defines, options) defines end
copy_headers()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 68 def copy_headers public_headers = @file_accessor.public_headers UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}" public_headers.each do |h| `ditto #{h} #{framework.headers_path}/#{h.basename}` end # If custom 'module_map' is specified add it to the framework distribution # otherwise check if a header exists that is equal to 'spec.name', if so # create a default 'module_map' one using it. if !@spec.module_map.nil? module_map_file = @file_accessor.module_map if Pathname(module_map_file).exist? module_map = File.read(module_map_file) end elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}.h") module_map = <<-MAP framework module #{@spec.name} { umbrella header "#{@spec.name}.h" export * module * { export * } } MAP end unless module_map.nil? UI.message "Writing module map #{module_map}" unless framework.module_map_path.exist? framework.module_map_path.mkpath end File.write("#{framework.module_map_path}/module.modulemap", module_map) end end
copy_license()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 104 def copy_license UI.message 'Copying license' license_file = @spec.license[:file] || 'LICENSE' `cp "#{license_file}" .` if Pathname(license_file).exist? end
copy_resources()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 110 def copy_resources bundles = Dir.glob('./build/*.bundle') bundle_names = [@spec, *@spec.recursive_subspecs].flat_map do |spec| consumer = spec.consumer(@platform) consumer.resource_bundles.keys + consumer.resources.map do |r| File.basename(r, '.bundle') if File.extname(r) == 'bundle' end end.compact.uniq bundles.select! do |bundle| bundle_name = File.basename(bundle, '.bundle') bundle_names.include?(bundle_name) end if bundles.count > 0 UI.message "Copying bundle files #{bundles}" bundle_files = bundles.join(' ') `cp -rp #{bundle_files} #{framework.resources_path} 2>&1` end resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec| expand_paths(spec.consumer(@platform).resources) end.compact.uniq if resources.count == 0 && bundles.count == 0 framework.delete_resources return end if resources.count > 0 UI.message "Copying resources #{resources}" `cp -rp #{resources.join(' ')} #{framework.resources_path}` end end
cp_to_source_dir()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 56 def cp_to_source_dir target_dir = "#{@source_dir}/#{@spec.name}.framework" FileUtils.rm_rf(target_dir) if File.exist?(target_dir) `cp -fa #{@platform}/#{@spec.name}.framework #{@source_dir}` end
expand_paths(path_specs)
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 212 def expand_paths(path_specs) path_specs.map do |path_spec| Dir.glob(File.join(@source_dir, path_spec)) end end
framework()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 218 def framework @framework ||= begin framework = Framework.new(@spec.name, @platform.name.to_s) framework.make framework end end
ios_architectures()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 166 def ios_architectures archs = %w[x86_64 arm64 armv7 armv7s i386] @vendored_libraries.each do |library| if File.extname(Pathname.new(library)) == ".framework" file_base = File.basename(library,".framework") archs = `lipo -info #{library}/#{file_base}`.split & archs elsif archs = `lipo -info #{library}`.split & archs end end archs end
ios_build_options()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 162 def ios_build_options "ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'" end
package_framework()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 38 def package_framework `mkdir -p #{@source_dir}/#{@spec.name}_binary` @vendored_libraries.each do |libs| #puts libs #puts libs.class lib_base_name = File.basename(libs) `cp -fa #{libs} #{@source_dir}/#{@spec.name}_binary/#{lib_base_name}` end sim_path = Pathname.new("#{@source_dir}/bin-archive/#{@spec.name}/build-simulator/#{@spec.name}.framework/#{@spec.name}") arm_path = Pathname.new("#{@source_dir}/bin-archive/#{@spec.name}/build/#{@spec.name}.framework/#{@spec.name}") arm_framework_path = Pathname.new("#{@source_dir}/bin-archive/#{@spec.name}/build/#{@spec.name}.framework") #puts sim_path #puts arm_path `cp -fa #{arm_framework_path} #{@source_dir}/#{@spec.name}_binary` `lipo -create #{arm_path} #{sim_path} -output #{@source_dir}/#{@spec.name}_binary/#{@spec.name}.framework/#{@spec.name}` end
static_libs_in_sandbox(build_dir = 'build')
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 146 def static_libs_in_sandbox(build_dir = 'build') Dir.glob("#{build_dir}/lib#{target_name}.a") end
target_name()
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 190 def target_name if @spec.available_platforms.count > 1 "#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}" else @spec.name end end
xcodebuild(defines = '', args = '', build_dir = 'build')
click to toggle source
# File lib/cocoapods-miBin/helpers/framework_builder.rb, line 198 def xcodebuild(defines = '', args = '', build_dir = 'build') command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration Release -target #{target_name} -project ./Pods.xcodeproj 2>&1" output = `#{command}`.lines.to_a if $?.exitstatus != 0 raise <<~EOF Build command failed: #{command} Output: #{output.map { |line| " #{line}" }.join} EOF Process.exit end end