Class: Pod::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-packager/builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(source_dir, sandbox_root, public_headers_root, spec, embedded, mangle) ⇒ Builder

Returns a new instance of Builder.



3
4
5
6
7
8
9
10
# File 'lib/cocoapods-packager/builder.rb', line 3

def initialize(source_dir, sandbox_root, public_headers_root, spec, embedded, mangle)
  @source_dir = source_dir
  @sandbox_root = sandbox_root
  @public_headers_root = public_headers_root
  @spec = spec
  @embedded = embedded
  @mangle = mangle
end

Instance Method Details

#build(platform, library) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/cocoapods-packager/builder.rb', line 12

def build(platform, library)
  if library
    build_static_library(platform)
  else
    build_framework(platform)
  end
end

#build_framework(platform) ⇒ Object



29
30
31
32
33
34
35
36
37
38
# File 'lib/cocoapods-packager/builder.rb', line 29

def build_framework(platform)
  UI.puts('Building framework')

  defines = compile(platform)
  create_framework(platform.name.to_s)
  copy_headers
  build_library(platform, defines, @fwk.versions_path + Pathname.new(@spec.name))
  copy_license
  copy_resources(platform)
end

#build_library(platform, defines, output) ⇒ Object



52
53
54
55
56
57
58
59
60
# File 'lib/cocoapods-packager/builder.rb', line 52

def build_library(platform, defines, output)
  static_libs = static_libs_in_sandbox

  if platform.name == :ios
    build_static_lib_for_ios(static_libs, defines, output)
  else
    build_static_lib_for_mac(static_libs, output)
  end
end

#build_static_lib_for_ios(static_libs, defines, output) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/cocoapods-packager/builder.rb', line 62

def build_static_lib_for_ios(static_libs, defines, output)
  return if static_libs.count == 0
  `libtool -static -o #{@sandbox_root}/build/package.a #{static_libs.join(' ')}`

  xcodebuild(defines, '-sdk iphonesimulator', 'build-sim')
  sim_libs = static_libs_in_sandbox('build-sim')
  `libtool -static -o #{@sandbox_root}/build-sim/package.a #{sim_libs.join(' ')}`

  `lipo #{@sandbox_root}/build/package.a #{@sandbox_root}/build-sim/package.a -create -output #{output}`
end

#build_static_lib_for_mac(static_libs, output) ⇒ Object



73
74
75
76
# File 'lib/cocoapods-packager/builder.rb', line 73

def build_static_lib_for_mac(static_libs, output)
  return if static_libs.count == 0
  `libtool -static -o #{output} #{static_libs.join(' ')}`
end

#build_static_library(platform) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/cocoapods-packager/builder.rb', line 20

def build_static_library(platform)
  UI.puts('Building static library')

  defines = compile(platform)
  platform_path = Pathname.new(platform.name.to_s)
  platform_path.mkdir unless platform_path.exist?
  build_library(platform, defines, platform_path + Pathname.new("lib#{@spec.name}.a"))
end

#build_with_mangling(platform) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/cocoapods-packager/builder.rb', line 78

def build_with_mangling(platform)
  UI.puts 'Mangling symbols'
  defines = Symbols.mangle_for_pod_dependencies(@spec.name, @sandbox_root)
  defines << " " << @spec.consumer(platform).compiler_flags.join(' ')

  if platform.name == :ios
    defines = "#{defines} ARCHS=\"x86_64 i386 arm64 armv7 armv7s\""
  end

  UI.puts 'Building mangled framework'
  xcodebuild(defines)
  defines
end

#compile(platform) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/cocoapods-packager/builder.rb', line 92

def compile(platform)
  defines = "GCC_PREPROCESSOR_DEFINITIONS='PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'"
  defines << " " << @spec.consumer(platform).compiler_flags.join(' ')

  if platform.name == :ios
    defines = "#{defines} ARCHS=\"x86_64 i386 arm64 armv7 armv7s\""
  end

  xcodebuild(defines)

  if dependency_count > 0 && @mangle
    return build_with_mangling(platform)
  end

  defines
end

#copy_headersObject



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
# File 'lib/cocoapods-packager/builder.rb', line 109

def copy_headers
  headers_source_root = "#{@public_headers_root}/#{@spec.name}"

  Dir.glob("#{headers_source_root}/**/*.h").
      each { |h| `ditto #{h} #{@fwk.headers_path}/#{h.sub(headers_source_root, '')}` }

  # 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 = "#{@sandbox_root}/#{@spec.name}/#{@spec.module_map}"
    module_map = File.read(module_map_file) if Pathname(module_map_file).exist?
  elsif File.exist?("#{@public_headers_root}/#{@spec.name}/#{@spec.name}.h")
    module_map = <<MAP
framework module #{@spec.name} {
  umbrella header "#{@spec.name}.h"

  export *
  module * { export * }
}
MAP
  end

  unless module_map.nil?
    @fwk.module_map_path.mkpath unless @fwk.module_map_path.exist?
    File.write("#{@fwk.module_map_path}/module.modulemap", module_map)
  end
end

#copy_licenseObject



138
139
140
141
142
# File 'lib/cocoapods-packager/builder.rb', line 138

def copy_license
  license_file = @spec.license[:file] || 'LICENSE'
  license_file = "#{@sandbox_root}/#{@spec.name}/#{license_file}"
  `cp "#{license_file}" .` if Pathname(license_file).exist?
end

#copy_resources(platform) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/cocoapods-packager/builder.rb', line 144

def copy_resources(platform)
  bundles = Dir.glob("#{@sandbox_root}/build/*.bundle")
  `cp -rp #{@sandbox_root}/build/*.bundle #{@fwk.resources_path} 2>&1`

  resources = expand_paths(@spec.consumer(platform).resources)
  if resources.count == 0 && bundles.count == 0
    @fwk.delete_resources
    return
  end

  if resources.count > 0
    `cp -rp #{resources.join(' ')} #{@fwk.resources_path}`
  end
end

#create_framework(platform) ⇒ Object



159
160
161
162
# File 'lib/cocoapods-packager/builder.rb', line 159

def create_framework(platform)
  @fwk = Framework::Tree.new(@spec.name, platform, @embedded)
  @fwk.make
end

#dependency_countObject



164
165
166
167
168
169
170
171
172
# File 'lib/cocoapods-packager/builder.rb', line 164

def dependency_count
  count = @spec.dependencies.count

  @spec.subspecs.each do |subspec|
    count += subspec.dependencies.count
  end

  count
end

#expand_paths(path_specs) ⇒ Object



174
175
176
177
178
# File 'lib/cocoapods-packager/builder.rb', line 174

def expand_paths(path_specs)
  path_specs.map do |path_spec|
    Dir.glob(File.join(@source_dir, path_spec))
  end
end


40
41
42
43
44
45
46
47
48
# File 'lib/cocoapods-packager/builder.rb', line 40

def link_embedded_resources
  target_path = @fwk.root_path + Pathname.new('Resources')
  target_path.mkdir unless target_path.exist?

  Dir.glob(@fwk.resources_path.to_s + '/*').each do |resource|
    resource = Pathname.new(resource).relative_path_from(target_path)
    `ln -sf #{resource} #{target_path}`
  end
end

#static_libs_in_sandbox(build_dir = 'build') ⇒ Object



180
181
182
# File 'lib/cocoapods-packager/builder.rb', line 180

def static_libs_in_sandbox(build_dir = 'build')
  Dir.glob("#{@sandbox_root}/#{build_dir}/libPods-*.a")
end

#xcodebuild(defines = '', args = '', build_dir = 'build') ⇒ Object



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/cocoapods-packager/builder.rb', line 184

def xcodebuild(defines = '', args = '', build_dir = 'build')
  command = "xcodebuild #{defines} CONFIGURATION_BUILD_DIR=#{build_dir} clean build #{args} -configuration Release -target Pods -project #{@sandbox_root}/Pods.xcodeproj 2>&1"
  output = `#{command}`.lines.to_a

  if $?.exitstatus != 0
    puts UI::BuildFailedReport.report(command, output)

    # Note: We use `Process.exit` here because it fires a `SystemExit`
    # exception, which gives the caller a chance to clean up before the
    # process terminates.
    #
    # See http://ruby-doc.org/core-1.9.3/Process.html#method-c-exit
    Process.exit
  end
end