lib/cocoapods-packager/pod_utils.rb
module Pod
class Command
class Package < Command
private
def build_static_sandbox(dynamic)
static_sandbox_root = if dynamic
Pathname.new(config.sandbox_root + '/Static')
else
Pathname.new(config.sandbox_root)
end
Sandbox.new(static_sandbox_root)
end
def install_pod(platform_name, sandbox)
podfile = podfile_from_spec(
@path,
@spec.name,
platform_name,
@spec.deployment_target(platform_name),
@subspecs,
@spec_sources
)
static_installer = Installer.new(sandbox, podfile)
static_installer.install!
unless static_installer.nil?
static_installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
config.build_settings['GCC_GENERATE_DEBUGGING_SYMBOLS'] = 'NO'
end
end
static_installer.pods_project.save
end
static_installer
end
def podfile_from_spec(path, spec_name, platform_name, deployment_target, subspecs, sources)
options = {}
if path
if @local
options[:path] = path
else
options[:podspec] = path
end
end
options[:subspecs] = subspecs if subspecs
Pod::Podfile.new do
sources.each { |s| source s }
platform(platform_name, deployment_target)
pod(spec_name, options)
install!('cocoapods',
:integrate_targets => false,
:deterministic_uuids => false)
target('packager') do
inherit! :complete
end
end
end
def binary_only?(spec)
deps = spec.dependencies.map { |dep| spec_with_name(dep.name) }
[spec, *deps].each do |specification|
%w(vendored_frameworks vendored_libraries).each do |attrib|
if specification.attributes_hash[attrib]
return true
end
end
end
false
end
def spec_with_name(name)
return if name.nil?
set = Pod::Config.instance.sources_manager.search(Dependency.new(name))
return nil if set.nil?
set.specification.root
end
def spec_with_path(path)
return if path.nil?
path = Pathname.new(path)
path = Pathname.new(Dir.pwd).join(path) unless path.absolute?
return unless path.exist?
@path = path.expand_path
if @path.directory?
help! @path + ': is a directory.'
return
end
unless ['.podspec', '.json'].include? @path.extname
help! @path + ': is not a podspec.'
return
end
Specification.from_file(@path)
end
#----------------------
# Dynamic Project Setup
#----------------------
def build_dynamic_sandbox(_static_sandbox, _static_installer)
dynamic_sandbox_root = Pathname.new(config.sandbox_root + '/Dynamic')
dynamic_sandbox = Sandbox.new(dynamic_sandbox_root)
dynamic_sandbox
end
# @param [Pod::Sandbox] dynamic_sandbox
#
# @param [Pod::Sandbox] static_sandbox
#
# @param [Pod::Installer] static_installer
#
# @param [Pod::Platform] platform
#
def install_dynamic_pod(dynamic_sandbox, static_sandbox, static_installer, platform)
# 1 Create a dynamic target for only the spec pod.
dynamic_target = build_dynamic_target(dynamic_sandbox, static_installer, platform)
# 2. Build a new xcodeproj in the dynamic_sandbox with only the spec pod as a target.
project = prepare_pods_project(dynamic_sandbox, dynamic_target.name, static_installer)
# 3. Copy the source directory for the dynamic framework from the static sandbox.
copy_dynamic_target(static_sandbox, dynamic_target, dynamic_sandbox)
# 4. Create the file references.
install_file_references(dynamic_sandbox, [dynamic_target], project)
# 5. Install the target.
install_library(dynamic_sandbox, dynamic_target, project)
# 6. Write the actual .xcodeproj to the dynamic sandbox.
write_pod_project(project, dynamic_sandbox)
end
# @param [Pod::Installer] static_installer
#
# @return [Pod::PodTarget]
#
def build_dynamic_target(dynamic_sandbox, static_installer, platform)
spec_targets = static_installer.pod_targets.select do |target|
target.name == @spec.name
end
static_target = spec_targets[0]
file_accessors = create_file_accessors(static_target, dynamic_sandbox)
archs = []
dynamic_target = Pod::PodTarget.new(dynamic_sandbox, true, static_target.user_build_configurations, archs, platform, static_target.specs, static_target.target_definitions, file_accessors)
dynamic_target
end
# @param [Pod::Sandbox] dynamic_sandbox
#
# @param [String] spec_name
#
# @param [Pod::Installer] installer
#
def prepare_pods_project(dynamic_sandbox, spec_name, installer)
# Create a new pods project
pods_project = Pod::Project.new(dynamic_sandbox.project_path)
# Update build configurations
installer.analysis_result.all_user_build_configurations.each do |name, type|
pods_project.add_build_configuration(name, type)
end
# Add the pod group for only the dynamic framework
local = dynamic_sandbox.local?(spec_name)
path = dynamic_sandbox.pod_dir(spec_name)
was_absolute = dynamic_sandbox.local_path_was_absolute?(spec_name)
pods_project.add_pod_group(spec_name, path, local, was_absolute)
pods_project
end
def copy_dynamic_target(static_sandbox, _dynamic_target, dynamic_sandbox)
command = "cp -a #{static_sandbox.root}/#{@spec.name} #{dynamic_sandbox.root}"
`#{command}`
end
def create_file_accessors(target, dynamic_sandbox)
pod_root = dynamic_sandbox.pod_dir(target.root_spec.name)
path_list = Sandbox::PathList.new(pod_root)
target.specs.map do |spec|
Sandbox::FileAccessor.new(path_list, spec.consumer(target.platform))
end
end
def install_file_references(dynamic_sandbox, pod_targets, pods_project)
installer = Pod::Installer::Xcode::PodsProjectGenerator::FileReferencesInstaller.new(dynamic_sandbox, pod_targets, pods_project)
installer.install!
end
def install_library(dynamic_sandbox, dynamic_target, project)
return if dynamic_target.target_definitions.flat_map(&:dependencies).empty?
target_installer = Pod::Installer::Xcode::PodsProjectGenerator::PodTargetInstaller.new(dynamic_sandbox, project, dynamic_target)
result = target_installer.install!
native_target = result.native_target
# Installs System Frameworks
if dynamic_target.should_build?
dynamic_target.file_accessors.each do |file_accessor|
file_accessor.spec_consumer.frameworks.each do |framework|
native_target.add_system_framework(framework)
end
file_accessor.spec_consumer.libraries.each do |library|
native_target.add_system_library(library)
end
end
end
end
def write_pod_project(dynamic_project, dynamic_sandbox)
UI.message "- Writing Xcode project file to #{UI.path dynamic_sandbox.project_path}" do
dynamic_project.pods.remove_from_project if dynamic_project.pods.empty?
dynamic_project.development_pods.remove_from_project if dynamic_project.development_pods.empty?
dynamic_project.sort(:groups_position => :below)
dynamic_project.recreate_user_schemes(false)
# Edit search paths so that we can find our dependency headers
dynamic_project.targets.first.build_configuration_list.build_configurations.each do |config|
config.build_settings['HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
config.build_settings['USER_HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
config.build_settings['OTHER_LDFLAGS'] = '$(inherited) -ObjC'
end
dynamic_project.save
end
end
end
end
end